Comment nommer les choses ?
Disclaimer
Tous les cours à venir vous proposeront une approche structurée du concept de “code propre”. Il ne s’agit pas de règles immuables, mais avant de pouvoir s’en affranchir, il est essentiel de les maîtriser. Ainsi, pour l’instant, ces règles sont incontournables.

Credits: the_coding_love
camelCase¶

camelCase (Credits: Wikipedia)
camelCase
Nous adopterons la convention camelCase, selon laquelle le premier mot d’une variable commence par une minuscule, tandis que chaque mot suivant débute par une majuscule.
snake_case
Il existe de nombreuses autres conventions de nommage, mais l’une des plus courantes après camelCase est snake_case, qui sépare les mots en minuscules à l’aide de underscores (_
).
Noms révélateurs d’intention¶
Commenter un nom de variable.
Si un nom nécessite un commentaire pour être compris, c’est qu’il ne reflète pas clairement son intention.
int d; // temps écoulé en jours
Quel nom choisir dans ce cas-ci ?
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
Un nom de variable explicite améliore grandement la lisibilité du code. Prenons un exemple où nous nous contentons de renommer les variables. Que fait le code suivant ?
vector<vector<int>> getThem(const vector<vector<int>>& theList) {
vector<vector<int>> list1;
for(const auto& x : theList) {
if(x[0] == 4) {
list1.push_back(x);
}
}
return list1;
}
Problèmes avec ce code.
- Que trouve-t-on dans
theList
? - Quel rôle joue l’index
0
dex
danstheList
? - Quel rôle joue la valeur
4
? - Que fais-je avec la liste retournée ?
const int STATUS_VALUE = 0;
const int FLAGGED = 4;
vector<vector<int>> getFlaggedCells(const vector<vector<int>>& gameBoard) {
vector<vector<int>> flaggedCells;
for(const auto& cell : gameBoard) {
if(cell[STATUS_VALUE] == FLAGGED) {
flaggedCells.push_back(cell);
}
}
return flaggedCells;
}
Indice
C’est un morceau de code du jeu Démineur (Minesweeper) dans lequel le plateau de jeu est un vector
qui contient des cellules représentés par des vector<int>
où STATUS_VALUE
est l’indice contenant le statut de la cellule et 4
correspond à la présence d’un drapeau.

Pour aller plus loin.
class Cell {
private:
const int mStatusValue = 0;
const int mFlagged = 4;
vector<int> values;
public:
// Constructeur
//...
bool isFlagged() {
return values[mStatusValue] == mFlagged;
}
};
vector<Cell> getFlaggedCells(const vector<Cell>& gameBoard) {
vector<Cell> flaggedCells;
for(const auto& cell : gameBoard) {
if(cell.isFlagged()) {
flaggedCells.push_back(cell);
}
}
return flaggedCells;
}
La désinformation¶
vector<Account> accountList;
Problème
Il ne faut pas nommer un vector
“List” quand list
est aussi un type de C++. Une solution possible :
vector<Account> accountVector;
vector<Account> accounts;
int controllerForEfficientHandlingOfStrings;
int controllerForEfficientStorageOfStrings;
Problème
Il ne faut pas utiliser des noms qui sont trop similaires. En plus, avec l’auto-complétion, vous n’allez pas voir la différence.
int a = 1;
if(O == l) {
a = O1;
}
else {
l = 01;
}
Problème
Même si la coloration syntaxique permet de distinguer O
de 0
et 1
de l
, utiliser ces caractères similaires complique inutilement la lecture du code. Cela revient simplement à rendre le code volontairement obscur...
Noms différents¶
void copyString(string a1, string a2, int length) {
for (int i = 0; i < length; i++) {
a2[i] = a1[i];
}
}
Problème
Évitez d’ajouter des chiffres à la fin des noms de variables pour les différencier. Une alternative plus claire consiste à utiliser des noms explicites qui reflètent leur rôle distinct. Par exemple :
void copyString(string source, string destination, int length) {
for (int i = 0; i < length; i++) {
destination[i] = source[i];
}
}
money;
moneyAmount;
message;
theMessage;
getProductInfo();
getProductData();
class Customer {
//...
};
class CustomerObject {
//...
};
Problème
Utilisez des noms avec des différences significatives.
Noms prononçables¶
class DtaRcrd102 {
private:
string genymdhms;
string modymdhms;
const string pszqint = "102";
//...
};
Problème
Ne pas utiliser des noms impossibles à prononcer. genymdhms
est la date à laquelle l’objet a été gen(éré) et cette date est en y(ears), m(onths), d(ays), h(ours), m(inutes), s(econds). Vous ne pourriez pas communiquer à l’intérieur d’une équipe si vous n’arrivez pas à prononcer les noms de variables. Une solution pour transformer ce code :
class Customer {
private:
string generationTimeStamp; // Format : yyyy-mm-dd hh:mm:ss
string modificationTimeStamp; // Format : yyyy-mm-dd hh:mm:ss
const string recordId = "102";
//...
};
Noms recherchables¶
Imagine un code avec que des variables d’une seule lettre et des nombres fixés qui apparaissent partout et qu’il contient le morceau de code suivant.
for (int j=0; j<34; j++) {
s += t[j]*4*5;
}
Maintenant, comparez-le à ce même code.
const int NUMBER_OF_TASK_TYPES = 34;
const int WORK_DAYS_PER_WEEK = 5;
const int NUMBER_OF_TASKS_PER_DAY = 4;
int totalCost = 0;
for (int j=0; j < NUMBER_OF_TASKS_TYPES; j++) {
int dailyCostPerTask = taskCostPerDay[j] * NUMBER_OF_TASKS_PER_DAY;
int weeklyCostPerTask = dailyCost * WORK_DAYS_PER_WEEK;
totalCost += weeklyCostPerTask;
}
Problème
Il est bien plus facile de localiser et de modifier une variable nommée NUMBER_OF_TASKS_PER_DAY
que de rechercher tous les 4
dans le code. De manière générale :
- Utilisez des variables d’une seule lettre UNIQUEMENT pour des variables locales dans des boucles ou des fonctions courtes.
- Considérez le numéro de la première et de la dernière ligne où une variable est utilisée. La longueur de son nom peut augmenter proportionnellement au nombre de lignes de code entre ces deux références.
Nom commun pour les classes, verbe pour les méthodes¶
Lisez le titre ☝️
Le nom d’une classe doit correspondre à un nom ou à un groupe nominal (par exemple, AddressParser
). En revanche, les noms de méthodes doivent être des verbes ou des groupes verbaux (par exemple, deleteAddress
).
Un seul mot par concept¶
Évitez les synonymes
Il est préférable de ne pas utiliser plusieurs mots synonymes qui accomplissent la même tâche (par exemple, fetch
, retrieve
, get
, ou controller
, manager
, driver
).
Certaines expressions ont des significations particulières en informatique (par exemple, memento
fait référence à un design pattern). Il est donc important de réutiliser ces termes dans le bon contexte afin d’éviter toute ambiguïté.
Contextualisation¶
Certaines variables ont des noms suffisamment explicites pour être comprises sans contexte, mais ce n’est pas le cas de la plupart. Par exemple, des noms comme firstName
, lastName
, street
, houseNumber
, city
, state
, et zipcode
suggèrent clairement qu’ils font référence aux coordonnées d’une personne.
En revanche, tout seul, un nom comme state
est beaucoup plus ambigu : il pourrait désigner l’état civil d’une personne, un état d’un objet dans le code, ou encore un état géographique, selon le contexte.
Ajouter un préfixe.
Une solution pour clarifier le contexte des noms de variables est d’ajouter un préfixe, comme address
(si le contexte de address
est clair), par exemple : addressState
.
Cependant, il ne faut pas ajouter des préfixes de manière systématique lorsque le contexte est déjà clair. L’objectif reste de lever toute ambiguïté, pas de rendre le code excessivement verbeux.
Créer une classe.
Dans la plupart des cas, une solution plus efficace consiste à regrouper ces variables sous une structure commune, comme une classe : class Address
. Cela permet de donner un contexte clair non seulement au programmeur, mais aussi à la machine.
(Ne pas) faire de blagues dans les noms¶
holyHandGrenade
pour faire deleteItems
, sérieusement ?
Bien sûr ! Tant que les bonnes pratiques sont respectées, un peu d’humour ne tue personne.