Comment être doué pour donner des noms significatifs

Pourquoi des noms significatifs?

  • Considérez que vous nommez un enfant (cela semble trop facile, n'est-ce pas?)
youAreMyKid (), cuteLittleBaby (), shyBaby ()
  • Je suppose que vous voudriez examiner ces noms.
Il n’ya que deux choses difficiles en informatique: l’invalidation de la mémoire cache et la désignation de noms - Phil Karlton

Nous avons tendance à former des identités, à stocker et à récupérer des informations connexes sur les lieux, les informations relatives aux personnes, en fonction de leurs noms. De même, les noms sont partout, même dans le plus petit morceau de code que nous écrivons. Nous nommons nos variables, fonctions, arguments, classes et packages.

Nous nommons nos fichiers source et les répertoires qui les contiennent. Si les noms ne révèlent pas les bonnes intentions, ne sont pas distincts et ne sont pas facilement rappelables, la lisibilité du code diminue considérablement. Dans cet article, je vais essayer de partager les enseignements tirés de Clean Code de Robert C Martin. Vous trouverez ci-dessous de très bonnes conventions simples pour donner des noms propres dans notre code afin d'éviter toute confusion, par exemple qui était John The Third et John The Third Junior?

Une différence entre un programmeur intelligent et un programmeur professionnel est que le professionnel comprend que la clarté est roi. Les professionnels utilisent leurs pouvoirs à bon escient et écrivent un code compréhensible pour les autres - Robert C. Martin

Utiliser des noms révélateurs d'intention

Le nom d'une variable, d'une fonction ou d'une classe doit répondre à toutes les grandes questions. Il devrait vous dire pourquoi il existe, ce qu'il fait et comment il est utilisé. Si un nom nécessite un commentaire, il ne révèle pas son intention.

Mauvais

int d; // temps écoulé en jours
// Le nom d ne révèle rien

Nettoyer

int elapsedTimeInDays;

Pouvez-vous dire à quoi sert le code ci-dessous? Pensez une minute

def get_them ()
 list1 = []
 the_list.each do | tl |
   si tl [0] == 4
    list1.push (tl)
   fin
 fin
 retourne liste1
fin

Des questions:

1. Quels genres de choses sont dans la liste?
2. Quelle est la signification de l'indice zéro d'un élément de la liste?
3. Quelle est la signification de la valeur 4?
4. Comment pourrais-je utiliser la liste renvoyée?

Les réponses à ces questions ne sont pas présentes dans l'exemple de code, mais elles auraient pu l'être.

Éviter la désinformation

Les programmeurs doivent éviter de laisser de faux indices qui obscurcissent la signification du code. L'utilisation d'orthographes incohérentes est une désinformation. Ne renvoyez pas la liste des factures à la liste des factures. utilisez plutôt bunchofsalesinvoice, salesvovoices ou salesinvoicegroup

Une autre forme de désinformation dans les noms serait l’utilisation combinée des majuscules et des minuscules. Si vous suivez camelCase, allez à la convention camelCase. mais ne mélangez pas et ne faites pas correspondre i.e SalesInVoice, SavingAccOunt etc.

Faire des distinctions significatives

Vous ne devez pas utiliser le même nom pour faire référence à deux choses différentes dans la même portée. vous pourriez être tenté de changer un nom de manière arbitraire.

Les mots de bruit sont une distinction insignifiante. Par exemple, imaginons que vous ayez une classe de produit. Si vous avez créé une classe supplémentaire avec un ProductInfo ou ProductData appelé, vous avez modifié les noms sans leur donner de signification différente. Les informations et les données sont des mots parasites indistincts comme un, un et le.

Distinguez les noms de manière à ce que le lecteur sache ce que les différences offrent. moneyAmount est indiscernable de money, customerInfo est indiscernable de client, accountData est indiscernable du compte

Utiliser des noms prononçables

Les noms facilement prononçables sont facilement rappelables. Si vous ne pouvez pas le prononcer, vous ne pouvez pas en discuter sans avoir l’air idiot

Comparer

classe DtaRcrd102 {
   date privée genymdhms;
   privé Date modymdhms;
   final final String pszqint = ”102”;
   / *… * /
};

à

classe Client {
   private Date generationTimestamp;
   private Date modificationTimestamp;
   private final String recordId = ”102”;
};

Utiliser des noms pouvant faire l'objet d'une recherche

Il est fréquent que les programmeurs recherchent des variables par leur nom dans une base de code volumineuse lors du débogage ou de la tentative de traçage de l'emplacement où toute cette variable, classe ou fonction est utilisée. Les noms à une lettre et les constantes numériques posent un problème particulier en ce qu'ils ne sont pas faciles à localiser dans un corps de texte. Évitez de les utiliser.

Éviter les codages

Le codage des informations de type ou de portée dans les noms ajoute simplement un fardeau supplémentaire en matière de déchiffrement et de friction cognitive lors de la mémorisation. Il n’est guère raisonnable d’obliger chaque nouvel employé à apprendre un autre langage de codage en plus du corpus de code (généralement considérable) dans lequel il travaillera.

Évitez les encodages inutiles de types de données avec le nom de la variable.

String firstNameString; Float weightFloat;

Il n’est peut-être pas nécessaire que le monde entier sache très bien que, dans un contexte utilisateur, le premier nom va comporter une séquence de caractères. Il en va de même pour Weight, qui est décimal / float.

Éviter la cartographie mentale

Les collaborations se produisent assez souvent lorsque les différentes équipes construisent des modules distincts du même produit. Quand quelqu'un de nouveau ou d'une autre équipe lit, il / elle ne devrait pas avoir à traduire mentalement vos noms en d'autres noms qu'ils connaissent déjà. Ceci est un problème avec les noms de variables à lettre unique. Bien sûr, un compteur de boucle peut être nommé i ou j ou k (bien que jamais l!) Si sa portée est très petite et qu'aucun autre nom ne peut entrer en conflit avec lui. En effet, ces noms à une seule lettre pour les compteurs de boucles sont traditionnels.

Mauvais

locations = [‘Austin’, ‘New York’, ‘San Francisco’]
emplacements.each do | l |
 faire des trucs
 #do_some_other_stuff
 # d'autres choses
 # Attends, à quoi sert "l`"?
 expédition (l)
fin

Nettoyer

locations = [‘Austin’, ‘New York’, ‘San Francisco’]
locations.each | location |
 #faire des trucs
 #do_some_other_stuff
 # ..
 expédition (emplacement)
fin

Noms de classe

Les classes et les objets doivent avoir des noms de phrase nominaux tels que Client, PageWiki, Compte et AddressParser. Évitez les mots tels que Gestionnaire, Processeur, Données ou Info dans le nom d'une classe. Un nom de classe ne doit pas être un verbe.

Noms de méthode

Les méthodes doivent avoir un nom de phrase ou un verbe comme postInvoice, deleteShipment

Choisissez un mot par concept

Choisissez un mot pour un concept abstrait et respectez-le. Par exemple, il est déroutant d’avoir des méthodes d’extraction, de récupération et d’obtention équivalentes de différentes classes. Comment vous rappelez-vous quel nom de méthode va avec quelle classe? Les noms de fonction doivent être autonomes et cohérents pour que vous puissiez choisir la bonne méthode sans aucune exploration supplémentaire.

Mauvais

informations utilisateur
données d'utilisateur
user_record
commence à
commencer à
Heure de début

Nettoyer

utilisateur
commencer à

un autre exemple

dataFetcher () vs dataGetter () vs dataRetrieval ()

Si les trois méthodes font la même chose, ne mélangez pas et ne faites pas correspondre dans la base de code. Au lieu de cela, s'en tenir à un.

Utiliser les noms de domaine de la solution

Rappelez-vous que les personnes qui liront votre code seront des programmeurs. Allez-y, utilisez des termes informatiques, des noms d'algorithmes, des noms de motifs, des termes mathématiques, etc.

Il n’est pas sage de tirer tous les noms du domaine problématique car nous ne voulons pas que nos collègues soient obligés de s’adresser au client pour lui demander ce que chaque nom signifie quand ils connaissent déjà le concept sous un nom différent.

Le nom AccountVisitor signifie beaucoup pour un programmeur familiarisé avec le modèle VISITOR.

Utiliser des noms de domaine problématiques

Lorsqu'il n'y a pas de «programmeur-eese» pour ce que vous faites, utilisez le nom du domaine problématique. Au moins le programmeur qui gère votre code peut demander à un expert du domaine ce que cela signifie.

Si vous maîtrisez la suppression des doublons et la correction des noms incorrects, je prétends alors maîtriser la conception orientée objet - J. B. Rainsberger, extrait des Quatre éléments de la conception simple

Ajouter un contexte significatif

Il existe quelques noms qui ont un sens en eux-mêmes - la plupart ne le sont pas. Imaginez que vous ayez des variables nommées prénom, nom, rue, numéro de rue, ville, état et code postal. Pris ensemble, il est assez clair qu'ils forment une adresse. Mais que faire si vous venez de voir la variable d'état utilisée seule dans une méthode

Vous pouvez ajouter un contexte en utilisant des préfixes: addrFirstName, addrLastName, addrState, etc. Bien sûr, une meilleure solution consiste à créer une classe nommée Address.

Écrire du code propre est un art et cela demande beaucoup de pratique.

Conclusion

La chose la plus difficile à choisir de bons noms est que cela nécessite de bonnes compétences descriptives et un fond culturel commun. Il s’agit d’un problème d’enseignement plutôt que d’un problème technique, commercial ou de gestion. Personne n’est doué pour nommer, en particulier lorsque vous vous dépêchez de respecter le délai.

Les gens ont également peur de renommer des choses de peur que d’autres développeurs ne s’y opposent. Nous ne partageons pas cette crainte et constatons que nous sommes réellement reconnaissants lorsque les noms changent (en mieux).

Donc, configurez rapidement votre convention de dénomination si elle n’est toujours pas en place et créez du code propre. Bon codage!