Beaucoup de développeurs ont du mal à donner un nom correct à leurs variables, fonctions et méthodes. Il n’y consacre qu’une seconde à chaque fois qu’il faut en créer une, pensant que le sujet est sans grande importance. C’est au contraire capital.
Il y a un adage qui dit : « Il n’y a que deux choses difficiles en informatique : l’invalidation d’un cache et nommer les choses ». Il y a aussi une variation humoristique, qui dit que les deux choses les plus compliquées en informatique sont : l’invalidation d’un cache, nommer les choses et l’erreur de type « off-by-one ».
Je vais ici expliquer ma vision de comment nommer les choses, qui doit correspondre à ce qu’on trouve ailleurs comme recommandation.
La cohérence
Le premier principe pour nommer les choses dans un projet est la cohérence. Il faut définir des règles et les appliquer partout de la même manière. Ce qu’il faut, c’est qu’on puisse deviner le nom d’une variable ou d’une méthode, sans avoir à aller vérifier à chaque fois à l’endroit où elle a été définie.
Cohérence dans la casse
Il y a plusieurs façon d’écrire les noms composés : longueurNom
, longueur_nom
, ou même combiner les 2 : Longueur_Nom
. Personnellement, je ne fais aucune préconisation de ce côté. Dans le monde Java et Scala, c’est la 1er choix qui est la norme, comme dans les recommandations d’Oracle : longueurNom
, avec les variations sur la casse de l’initiale en fonction du contexte (classe, méthode, …).
Cohérence dans le choix et l’ordre des mots
Il faut rester cohérant aussi dans le choix des mots. Si une variable s’appelle maxLongueur
à un endroit, il ne faut pas que la même entité soit nommée maxTaille
ou longueurMax
ailleurs. C’est vrai aussi pour des concepts similaires. Par exemple, la hauteur et la longueur d’une boîte sont des entités reliées. Il ne faut pas mélanger maxLongueur
et hauteurMin
. Il est incohérent de mettre max
en préfixe, et min
en suffixe. De la même manière, si vous utilisez lg
comme abréviations de longueur
, il faut utiliser une abréviation de même nature pour hauteur
. Voici un exemple d’incohérence :
class Caisse {
int lg;
int hauteur;
int largeur;
}
Respecter l’orthographe et la grammaire
Une autre règle qui accroît la cohérance est de respecter l’orthographe et la grammaire. longeur
est un très mauvais nom pour une variable. Vous allez vous tromper régulièrement en l’écrivant. De même, lorsque des adjectifs sont collés au nom, il faut respecter le féminin et le pluriel : porteOuverte
et portesOuvertes
, par exemple. Mais pas l’horrible porteOuvert
, sous prétexte que vous avez une autre variable qui s’appelle coffreOuvert
.
getter et setter
Le nommage dans le monde Java a subi l’influence des beans. Ce sont eux qui imposent les getters et les setters : getVitesse()
et setVitesse(int vitesse)
. À l’origine, les spécifications pour les beans ont été écrites pour que des outils puissent facilement manipuler les propriétés d’un objet. Hélas, les contraintes ont été imposés à l’humain aussi, même bien après que les outils aient évolués et n’aient plus besoin de noms commençant par get
et set
.
Je vais donner un exemple à propos du framework Spring. Aujourd’hui, il est possible d’utiliser le framework pour initialiser un objet en utilisant le constructeur. Mais beaucoup de développeurs ont gardé leurs vieilles habitudes, et n’utilisent que des setters
pour créer un objet, même si la classe en question doit être immutable.
Je préconise de ne jamais utiliser de getter (une méthode commençant par get
). Le setter (une méthode commençant par set
) peut être parfois utilisé. Cette recommandation est d’ailleurs celle par défaut dans d’autres langages que Java, comme Scala.
Nom, verbe, adjectif
Voici un exemple, écrit d’abord avec des getters et setters, puis de la manière que je préconise :
if (voiture.getVitesse() > route.getVitesseLimite()) {
voiture.setVitesse(route.getVitesseLimite());
}
if (voiture.vitesse() > route.vitesseLimite()) {
voiture.ralentir(route.vitesseLimite());
}
La 2e écriture est beaucoup plus naturelle et facile à lire. Les règles que j’y ai appliquées sont :
- Un nom, pour les variables et pour les méthodes qui rendent une valeur, comme
vitesse
. Certains langages ne font pas la différence entre l’accès à une propriété et l’accès à une méthode sans argument qui rend une valeur. Eiffel et Scala sont dans ce cas. - Un adjectif peut être accolé au nom, comme
vitesseLimite
. - Un verbe à l’infinitif pour les actions qui vont modifier quelque-chose, comme
ralentir
.
Il peut arriver qu’on ne veuille pas distinguer les choses, entre accelerer
et ralentir
par exemple, et qu’on en reste à setVitesse
. En français, cela pourrait être modifierVitesse
, mais je vous accorde que le mot modifier
est bien plus long que set
. Simplement, pour les raisons de cohérence vues plus haut, le choix d’utiliser de set
ou modifier
(ou autre-chose) doit être le même partout.
Il ne faut pas utiliser d’adjectif tout seul. D’autres mots sont des noms, mais ont souvent le sens d’un adjectif. Je prends par exemple le mot reste
. Si c’est la place vacante dans un conteneur, c’est un très mauvais choix de nom. Le mot reste
, d’après le dictionnaire, c’est ce qui subsiste d’une chose passée (les restes d’un repas). Utiliser ce mot pour indiquer la place vacante dans un conteneur est donc très mauvais, parce qu’en fait, c’est utiliser l’adjectif restant
. Et pour utiliser cet adjectif, il faut un nom. Un nom correct pourrait être placesVidesRestantes
ou nbPlacesVacantes
.
Les abréviations et le vocabulaire métier
Dans tous les projets, il y a un vocabulaire qui provient du domaine, du métier. Ce vocabulaire est à utiliser en priorité pour nommer les choses. Il peut aussi y avoir des abréviations, qu’il faut utiliser aussi. Il faut un tout petit peu de temps pour les apprendre, mais comme de toute façon il faut comprendre à quoi sert le logiciel qu’on fabrique, il est normal d’apprendre ces noms.
Pour reprendre l’exemple de la caisse :
class Caisse {
int long;
int haut;
int larg;
}
Conclusion
Il ne pas hésiter à prendre un peu de temps pour nommer correctement les variables et méthodes de vos programmes. Le code est écrit une seule fois, mais lu de nombreuses fois. Il faut donc être le plus clair possible, et ça ne se fait pas en une seconde. Il m’arrive de renommer tout un ensemble de choses, lorsque le programme évolue, et que je trouve un meilleur nom pour un concept. Et je me répète : le maître mot est la cohérence.