De la difficulté de trouver des noms significatifs

De la difficulté de trouver des noms significatifs

En tant que programmeurs, nous passons une bonne partie de notre temps à chercher des noms pour nos variables, fonctions, packages, classes etc…

Le choix de ces noms peut faire la différence entre un code facile à lire et un code écrit dans une langue obscure issue de la religion vaudou.

Sondage sur les taches les plus difficiles des programmeurs

Même si le site de l’IOCCC peut être divertissant à lire, maintenir le code d’un seul des gagnants de ce concours d’obfuscation de code relève du challenge intellectuel.

Un des vainqueurs du concours 2015. Et oui : ça compile

Il existe plusieurs principes à garder en tête pour trouver des noms adaptés à chaque situation.


Choisir des noms qui révèlent les intentions

En programmation il faut d’abord se poser 3 questions avant de choisir un nom :

  1. Quel est le but de son existence ?
  2. Quel est son rôle ?
  3. Comment vais-je l’utiliser ?

Dans le feu de l’action, il peut nous arriver de choisir certains noms sans se poser les bonnes questions. C’est normal, mais il ne faut pas hésiter à remplacer les noms de variables une fois qu’on en a trouvé de meilleurs. D’ailleurs, beaucoup d’éditeurs de code proposent un renommage des variables dynamiquement (essayez le raccourci Alt + Shift + R dans eclipse sur un nom de variable).

Comparons les 2 code suivants :

int n = 12; // Nombre de mois dans une année

et

int nbMois = 12;

Voyez comme la 2è formule permet de se passer d’un commentaire expliquant le but d’une variable. Un code clair est un code qui devrait être capable de se passer de tout commentaire.

Maintenant regardons la fonction suivante :

public List<int[]> getThem() {
   List<int[]> list1 = new ArrayList<int[]>();
   for (int[] x : theList)
      if (x[0] == 4)
         list1.add(x);
   return list1;
}

Seulement 4 lignes de code et pourtant, nous avons beaucoup de difficultés à comprendre quelle est son intention ! Que représente ce tableau de int[] ? Que contiendra la liste list1 ? Qu’est ce qui se trouve à l’index 0 de chaque tableau ? C’est quoi ce 4 ???

En nommant nos variables de manière plus explicite, on peut comprendre en un clin d’oeil à quoi sert ce code :

public List<int[]> getFlaggedCells() {
   List<int[]> flaggedCells = new ArrayList<int[]>();
   for (int[] cell : gameBoard)
      if (cell[STATUS_VALUE] == FLAGGED)
         flaggedCells.add(cell);
   return flaggedCells;
}

On voit bien que cette fonction permet de récupérer une liste de cellules d’un plateau de jeu ayant le status flagué. Un code non explicite peut le devenir à condition qu’on prenne le temps de chercher des noms de variables adaptés en se posant les bonnes questions citées auparavant.


Choisir des noms prononçables

Il peut être tentant, dans un souci de compacité des noms, d’utiliser des initiales / acronymes pour nommer des variables et expliquer ce qu’elles font. Ça peut en revanche poser problème lorsque l’on souhaite en discuter avec ses collègues, ou tout simplement se les redire dans la tête.

Par exemple, sur un de mes projets, on avait une variable qui permettait de compter le nombre de tentatives de logins d’un utilisateur :

int cptLogin = 0;

Même si on comprend que la variable signifie « Compte login » ou « Compteur de login », en discuter entre nous rendait le dialogue plus drôle qu’efficace

« Et sinon la cépété login elle est à combien là ? »

Alors qu’une simple réflexion permet de non seulement trouver un nom de variable plus adapté, mais également plus facilement prononçable :

int loginAttempts = 0;

Avec ce nom, le bénéfice est double : on peut le prononcer naturellement et on enlève l’ambiguïté de savoir si cette variable comptabilise le nombre total de logins de l’utilisateur ou bien le nombre total de tentatives de login.


Eviter la notation hongroise

Dans les langages non-typés, la notation hongroise permettait d’avoir une indication sur le type d’une variable en la voyant.

iCounter; // entier
sMessage; // chaine de caractères
m_member; // membre de classe
g_constant; // variable globale

La plupart des langages d’aujourd’hui ont un typage fort, il n’est donc pas nécessaire d’utiliser ce genre de notation. Un langage comme java nous autorise le luxe de nommer les choses pour ce qu’elles sont réellement :

String message;
int counter;
Pizza pizza;

Enfin, concernant les majuscules, minuscules et la mise en forme en général, conformez-vous au conventions définies par le langage que vous utilisez. Voici celles utilisées par le langage Java : http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367


Choisir un mot par concept

Il est fréquent de voir des classes contenir les mots « Helper », « Manager », « Handler » ou « Util » alors que leur but est bien souvent la même chose : fournir des méthodes communes et réutilisables.

Pourquoi nommer ces classes différemment ? Y a-t-il une réelle différence entre Helper et Handler ?

Egalement, plusieurs classes peuvent exister et avoir des noms de méthodes différents pour récupérer des données en base de données : query(), select(), fetch(), retrieve() etc …

Etablir un lexique et s’y tenir est une bonne pratique pour conserver une cohérence dans l’ensemble d’une application. Décidez dès le départ que les méthodes allant chercher des données dans la base s’appelleront « fetch » et adhérez au principe (fetch ou tout autre terme qui vous convient)


Les noms de classes et de méthodes

Les classes et les objets devraient avoir des noms nominaux, comme « Client », « Factory », « PhoneNumberParser », « Account ». Un nom de classe ne doit pas être un verbe.

Pour les méthodes, il faut choisir des verbes ou des groupes verbaux comme « sendMessage », « delete » ou encore « save ».


Voilà pour cet article, on pourrait discuter encore longuement de ce sujet mais je pense que les points relevés ci-dessus sont les fondamentaux pour nommer correctement ses variables !

Si vous êtes désireux d’en apprendre plus sur le sujet, je vous conseille l’excellent bouquin de Pearson Coder proprement

Laisser un commentaire