Éléments à prendre en compte lors de l'écriture de code en Java

Préface

J'écris habituellement Java, donc j'écrirai en supposant Java. Tout en évitant le goût de DDD ... (envie)

Utilisez des génériques, pas des abréviations

Quant à l'exemple, même «id» est l'auteur qui écrit «identifiant», donc c'est peut-être un peu exagéré, mais je pense qu'un nom long et qui transmet un sens vaut mieux qu'un nom qui ne transmet pas de signification courte. L'idéal est court (un mot si possible), donc je pense que vous devriez être conscient de la dénomination qui est plus proche de l'idéal. (Sauf pour les noms standards de facto tels que ʻi et ʻid)

class Identifier {
  String value;

  Identifier(String value) {
    this.value = value;
  }

  String value() {
    return value;
  }
}

Utilisez le vôtre autant que possible

Je pense que les types déjà dans le langage, tels que «String» et «int », ne conviennent pas pour exprimer le concept d'une application propriétaire. Je vois souvent le code que j'essaie d'exprimer en le nommant avec des variables, etc. ** Lorsqu'un changement se produit, même le changement avec l'aide de l'EDI est une tâche gênante telle que "oublié de changer" "Typo" Ça peut être. Aussi, le mérite obtenu en définissant le type indépendamment est que ** une erreur de compilation se produit lors du passage d'un argument **, ** les objets du même concept ne sont pas définis séparément dans le code produit (réutilisation) * Je pense qu'il est préférable d'utiliser autant que possible des types, tels que *.

class Name {
  String value;

  Name(String value) {
    this.value = value;
  }

  String value() {
    return value;
  }
}

Si vous ne pouvez pas penser à un nom, donnez-lui un nom étrange exprès

Les gens me demandent souvent: "Pourquoi les relations publiques avec un tel nom de classe?", Mais si vous pensez que oui, c'est presque comme prévu. Ce que nous visons, c'est un sentiment d'inconfort dans lequel tout le monde est pris. En incluant l'intention de le changer plus tard dans le nom, vous pouvez jouer un rôle actif comme un commandement ** avec un nom étrange **. Je répète l'expérience que si vous lui donnez un nom comme ça, il pourrira sans être regardé, j'écris comme suit. Il faut du courage pour fusionner dans la production, mais réfléchissez à deux fois. Pouvez-vous dire que ** ce genre de nom ** et ** ce genre de traitement ** ne sont absolument rien d'autre que ce ** nom étrange **? Y a-t-il un moyen de le trouver clairement? Si vous y réfléchissez, il y aura moins de résistance. Le plus important est de lui donner un nom propre à la fin, qui est de la responsabilité de lui donner un ** nom étrange **.

//Corrigez le mot TODO lorsqu'il est trouvé
class XxxCharacter {
  String value;

  XxxCharacter(String value) {
    this.value = value;
  }

  String value() {
    return value;
  }
}

Je vais lister les catégories avec Enum pour le moment

** Loisir **. Ce qui peut être divisé en disant que la réflexion s'est arrêtée dans une certaine mesure est susceptible d'être une branche du traitement commercial, et il est facile de pousser la différence de traitement en fonction de la division, alors définissons ** pour le moment. S'ils ne correspondent pas, peut-être qu'il ne suffisait pas de les diviser et de les déclarer comme leurs propres classes, ou de penser à autre chose.

enum Gender {
  NONE, MALE, FEMALE
}

Essayez d'avoir une logique métier (règles métier) dans le modèle

La logique métier se trouve souvent dans la «couche de service», etc. dans la couche. Je pense que la «couche de service» est la couche qui écrit ** business **, pas la couche qui définit la ** logique **. Si vous voulez écrire dans la couche qui devrait être, écrivez dans la couche de domaine. La raison est très simple, car il s'agit d'une couche riche en intérêts commerciaux. Je considère chaque intérêt commercial comme une logique commerciale (peut-être un malentendu). Au fait, il est bon de protéger aussi DRY! Je suis également heureux de ce point de vue.

class Age {
  int value;

  Age(int value) {
    this.value = value;
  }

  int value() {
    return value;
  }

  boolean isMinor() {
    return value < 20
  }
}

Instancier avec un constructeur complet

Je connais ** immuable **. En effet, nous voulons limiter les responsabilités de l'objet lors de sa création et nous assurer que l'état interne ne change pas **. Ne pas écrire «Setter» est également pertinent. Si vous écrivez du code qui est facile à tolérer variable **, il a été modifié sans que personne ne le sache! Il donne une situation de ** et augmente la quantité de code qui doit être vue lors de l'exécution de tâches telles que «lire, tester et déboguer du code». Il vaut mieux avoir un nombre minimum d'endroits à voir et un endroit pour définir l'état, non? La même situation est toujours retournée, donc je pense que le fait que ce qui précède ne se produise pas vous rendra très heureux à mesure que le produit grandit. Si vous essayez par hasard de définir l'état d'une classe avec Setter, cela peut être une bonne idée d'arrêter. À proprement parler, certaines personnes disent qu'il vaut mieux ajouter le modificateur «final» pour le rendre encore plus fort, mais il est ajusté en fonction du niveau de l'équipe impliquée dans le produit. Croyant dans une certaine mesure que ** personne ne l'utiliserait de cette façon **, j'écris rarement le modificateur final, car c'est un problème à écrire. Si vous voulez en savoir plus, consultez ** Complete Constructor Pattern **.

class User {
  Identifier identifier;
  Name name;
  Age age;
  XxxCharacter xxxCharacter
  Gender gender;

  User(Identifier identifier, Name name, Age age, XxxCharacter xxxCharacter, Gender gender) {
    this.identifier = identifier;
    this.name = name;
    this.age = age;
    this.xxxCharacter = xxxCharacter;
    this.gender = gender;
  }
}

Instancier avec une méthode statique comme précurseur

Définissez les responsabilités d'une classe très abstraite en nommant l'instanciation. Il est utilisé lorsque vous souhaitez créer une autre classe avec un faible degré d'abstraction, un index de ** ou une génération d'instance par une certaine ** différence de catégorie **. En règle générale, n'oubliez pas de rendre le constructeur privé. Sinon, le degré de liberté augmentera et une classe avec un état inattendu verra le jour. Au fait, si vous faites quelque chose de «statique» sans raison, vous pourriez être ridiculisé en tant que ** oncle statique **, alors soyez prudent.

class User {
  Identifier identifier;
  Name name;
  Age age;
  XxxCharacter xxxCharacter
  Gender gender;

  static User ofMale(Identifier identifier, Name name, Age age, XxxCharacter xxxCharacter,) {
    return new User(identifier, name, age, xxxCharacter, Gender.MALE);
  }

  static User ofFemale(Identifier identifier, Name name, Age age, XxxCharacter xxxCharacter,) {
    return new User(identifier, name, age, xxxCharacter, Gender.FEMAL);
  }

  private User(Identifier identifier, Name name, Age age, XxxCharacter xxxCharacter, Gender gender) {
    this.identifier = identifier;
    this.name = name;
    this.age = age;
    this.xxxCharacter = xxxCharacter;
    this.gender = gender;
  }
}

Utilisation approximative du traitement en boucle

En boucle en Java, j'utilise principalement stream ou for. En tant qu'index divers que j'utilise correctement, ** lorsque je ne lance pas d'exception, lors de la création d'un objet à partir d'un certain objet, stream **, ** en lançant une exception, en appelant simplement la méthode void séquentiellement, etc. Utilise pour **. Personnellement, j'aime stream car il peut être écrit dans une chaîne de méthodes et vous pouvez simplement voir des processus compliqués tels que des opérations intermédiaires sur des objets. D'autre part, «for» est utilisé lors de l'écriture de code dans un bloc qui n'affecte pas autant le traitement précédent. De plus, les exceptions sont plus faciles à gérer que «stream».

Quand je suis sur le point de créer un module util, je vais m'arrêter

C'est un module tel que ʻutil, manager, helper` qui a un rôle trop large pour devenir un dieu. Il a tendance à être souvent fait quand "N'y a-t-il pas un outil pratique?" En particulier, ce dernier a de nombreux modèles qui n'affectent que celui que vous utilisez lorsqu'un changement se produit. C'était souvent un problème d'être dupé par cela comme DRY. Réfléchissez à deux fois, littéralement ** Dieu **, donc ce n'est pas quelque chose que les humains stupides peuvent gérer. Au contraire, le dieu créé par les humains n'est rien de plus qu'une ** bête démon synthétique **. Vous devriez sprinter et sprinter.

Si vous essayez d'expliquer le code dans un commentaire, restez sur

Cela ne devrait pas être offensant ... c'est celui-là. C'est très proche du code et ne donne pas plus d'informations que le code, cela ne vaut pas le format mystère par des règles mystères, peut-être beaucoup, mais ce n'est peut-être pas très bon. Les commentaires ne se compilent pas, et si vous faites une erreur, le compilateur ne vous le dira pas, il est donc facile de devenir une dette. Le code fonctionne, donc s'il est faux, il est signalé, et avec l'aide de l'EDI, je pense que c'est facile à refactoriser. Il y a deux choses auxquelles je pense lorsque je rédige un commentaire: ** Ce commentaire peut-il être bon ou mauvais **, ** Puis-je l'exprimer en code avant d'écrire ceci **? Je ne pense pas que les commentaires soient mauvais, mais les outils peuvent déterminer le chemin (par la suite) en fonction de ce que vous utilisez. J'ai souvent l'impression qu'il vaut mieux y faire face sérieusement.

Dans le code de test, écrivez le nom de la méthode de test en japonais et écrivez un commentaire, etc. dans le code

Je l'ai écrit juste au-dessus, mais écrivez-vous un commentaire? Vous pourriez penser cela. Cependant, contrairement au code produit, le code de test a rarement un flux fixe et est souvent laissé à l'implémenteur, c'est donc un livre qui mêle sentiments personnels et logique. Si c'est le cas, je serai plus motivé à assumer la responsabilité de l'explication. Oh, peu importe ** Le test est une spécification! J'entends souvent **, mais est-ce vrai? Chaque jour, je deviens méfiant.

Résumé

Nous prévoyons d'en ajouter d'autres à l'avenir. J'ai peur de Masakari, alors j'insiste fortement sur ** I **. Cependant, j'apprécierais vos commentaires, qu'ils soient bons ou mauvais.

Recommended Posts

Éléments à prendre en compte lors de l'écriture de code en Java
[Java] Éléments à prendre en compte lors de la sortie de FizzBuzz
Être conscient du code facile à lire
[Java Silver] Ce qu'il faut savoir concernant les instructions switch
[Java] [Microsoft] Éléments à prendre en compte lors de l'inclusion du pilote JDBC SQL Server dans un fichier jar
Règles de base à connaître pour écrire du code facile à lire
Résumer le cycle de vie des objets Java à prendre en compte dans le développement Android
L'histoire de l'écriture de Java dans Emacs
5 choses dont les nouveaux programmeurs devraient être conscients
Comment trouver le nombre total de pages lors de la pagination en Java
CORBA semble avoir été supprimé dans Java SE 11. .. ..
Code pour échapper aux chaînes JSON en Java
Il ne semble pas y avoir d'autre-si en java
[Java] Attention aux courts-circuits (évaluation des courts-circuits)
Points à garder à l'esprit lorsque vous vous engagez dans CRuby
Le servlet Java doit être conscient de l'environnement multithread
Points à connaître avec Java Equals
[Débutant] Points à surveiller après les exercices Java / Héritage / Méthode abstraite [Note 26]
Exemple de code pour obtenir les valeurs de type SQL clés dans Java + MySQL 8.0
Exemple de code pour convertir List en List <String> dans Java Stream
Points à noter lors de l'ajout de la guerre à la dépendance
Points à garder à l'esprit lors de l'utilisation de l'instruction if
Points à surveiller dans le développement futur de Java
[Rails] Lorsque vous utilisez ajax, faites attention aux "mesures CSRF".
[Java] Lors de l'écriture du source ... Mémorandum ①
[Java] Points à noter sur l'inférence de type étendue dans Java 10
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
Résumé de la mise en œuvre des arguments par défaut en Java
Différences de code lors de l'utilisation du système de longueur en Java
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard
[Notes techniques] Éléments à prendre en compte du point de vue d'un ingénieur lors de la création d'une vue
Je souhaite générer des informations de manière aléatoire lors de l'écriture du code de test
Ce que vous utilisez souvent lorsque vous faites du développement Web avec Java
Points à garder à l'esprit lors du test de méthodes privées dans JUnit
Java avec Visual Studio Code
Comment changer dynamiquement les JDK lors de la construction de Java avec Gradle
Écrire du code de type Java8 en Java8
Comment dériver le dernier jour du mois en Java
J'ai créé un client RESAS-API en Java
Nouvelles fonctionnalités de Java 14 pouvant être utilisées pour écrire du code
[Rails] Où faire attention dans la description de la validation
Assurez-vous de comparer le résultat Java compareTo avec 0
Implémentation Java de tri-tree
Une collection de modèles dont vous voulez être conscient pour ne pas compliquer le code
Comment créer une paire de clés d'ecdsa dans un format lisible par Java
Est-il facile à utiliser pour l'utilisateur lors de la mise en œuvre de fonctions à usage général? Soyons conscients de
Les fichiers texte placés dans des ressources en Java ne peuvent pas être lus lorsqu'ils sont mis en jarr
Résumé de l'ORM "uroboroSQL" qui peut être utilisé dans le Java d'entreprise
Paramètres pour supprimer les importations Java inutilisées lors de l'enregistrement avec VS Code
Précautions lors de l'utilisation de Spring AOP avec les classes de ressources Jersery
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Convertir un tableau de chaînes en une liste d'entiers en Java
Juger si les chaînes de caractères à comparer sont les mêmes en Java
Évitez les erreurs de code de caractère en java lors de l'utilisation de l'extension VScode RUN-CODE
Exemple de code pour appeler l'API Yahoo! Local Search en Java