Pourquoi le code propre en C++ n'est pas une question de pédantisme, mais de respect
Si vous avez déjà ouvert un projet écrit « à la va-vite » il y a un an, et que vous n'arriviez pas à comprendre ce que fait une fonction nommée doStuff() — vous savez de quoi je parle. Le code propre en C++ n'est pas qu'une question d'esthétique. C'est une économie de temps, de nerfs et d'argent. C++ est un langage puissant, mais aussi perfide : la mémoire est gérée manuellement, les templates peuvent engendrer des monstres, et la surcharge d'opérateurs peut être une vraie magie. Sans discipline, le code se transforme rapidement en « spaghetti ».
Dans cet article, nous allons voir comment écrire du code propre en C++ pour qu'il soit facile à lire, à maintenir et à étendre. Pas de blabla — seulement de la pratique, des exemples et des principes éprouvés.
Règle n°1 : Le nommage, c'est 50% de la réussite
Les noms des variables, fonctions et classes doivent répondre à la question « qu'est-ce que c'est ? » ou « qu'est-ce que ça fait ? ». Oubliez int x et void f(). Utilisez des noms explicites.
Mauvais exemple
int d; // qu'est-ce que d ? distance ? date ? imbécile ?void p() { // imprime ? analyse ? pleure ? // ...}Bon exemple
int distanceEnMetres;void afficherProfilUtilisateur() { // ...}Conseil : Adoptez un seul style. Pour le C++, la norme est le camelCase pour les variables et fonctions, et le PascalCase pour les classes. Ne mélangez pas snake_case et camelCase dans un même projet — cela réduit la lisibilité.
Règle n°2 : Les fonctions doivent être petites et faire une seule chose
Le principe de responsabilité unique (Single Responsibility) ne s'applique pas qu'aux classes, mais aussi aux fonctions. Une fonction idéale fait 5 à 20 lignes. Si une fonction fait plus d'une action — divisez-la.
Mauvais
void traiterDonnees(vector<int>& donnees) { // tri sort(donnees.begin(), donnees.end()); // filtrage vector<int> filtre; for (int x : donnees) if (x > 0) filtre.push_back(x); // affichage for (int x : filtre) cout << x << " ";}Bon
vector<int> filtrerPositifs(const vector<int>& donnees) { vector<int> resultat; for (int x : donnees) if (x > 0) resultat.push_back(x); return resultat;}
void afficherDonnees(const vector<int>& donnees) { for (int x : donnees) cout << x << " ";}
void traiterDonnees(vector<int>& donnees) { sort(donnees.begin(), donnees.end()); auto filtre = filtrerPositifs(donnees); afficherDonnees(filtre);}Maintenant, chaque fonction peut être réutilisée et testée séparément. Le code propre en C++, c'est la modularité.
Règle n°3 : Évitez les nombres et chaînes magiques
Les nombres et chaînes dont la valeur n'est pas claire dans le contexte sont un fléau. Mettez-les dans des constantes.
Mauvais
if (temperature > 100) { cout << "Dangereux !";}Bon
constexpr int TEMPERATURE_MAX_SECURITE = 100;
if (temperature > TEMPERATURE_MAX_SECURITE) { cout << "Dangereux !";}Maintenant, si le seuil change, vous le modifiez à un seul endroit. Au lieu de chercher tous les 100 dans le code.
Règle n°4 : Les commentaires ne sont pas une excuse pour un mauvais code
Le meilleur commentaire est celui qui n'est pas nécessaire, parce que le code parle de lui-même. N'écrivez pas « ce que fait le code » — c'est visible. Écrivez « pourquoi il le fait ».
Mauvais commentaire
// on incrémente i de 1i++;Bon commentaire
// On utilise le pré-incrément pour les types POD — plus rapide++i;Utilisez // TODO: pour les parties incomplètes, mais n'en abusez pas. Le code idéal n'a pas besoin d'explications.
Règle n°5 : Utilisez RAII et les pointeurs intelligents
C++ est réputé pour la gestion manuelle de la mémoire, mais en C++ moderne (C++11 et plus), il existe des outils puissants