Cette semaine, ce billet sera un peu spécial. Il s’agit d’un petit exercice de ce que j’appelle d’hygiène de code.
Qu’est-ce que l’hygiène de code? Paraphrasons le Larousse.
Ensemble des principes, des pratiques individuelles ou collectives visant à la conservation de la santé, au fonctionnement normal de l’organisme
Remplacez le mot organisme par application et vous avez la définition même de l’hygiène de code.
Dans la vie tout comme dans le code, nous avons tous une façon différente de concevoir l’hygiène. Certains ne se brossent pas les dents. D’autres vont prendre un bain le soir. Certains vont ne pas se laver les mains après avoir été à la salle de bains. Certaines pratiques sont plus répandues que d’autres. Sans compter les normes sociales qui imposent certaines pratiques de l’hygiène.
Comme j’ai mentionné précédemment, la même analogie s’applique à la pratique du développement logiciel, le code. La façon que vous codez vos trucs est un reflet direct de votre hygiène de code. À mon avis, la meilleure image que nous avons dans le domaine à ce sujet est la notion de code smell. C’est simple. Si ça pue, c’est que c’est sale. Si c’est sale, c’est que ce n’est pas propre. Si ce n’est pas propre, c’est que c’est lié à une mauvaise hygiène.
Les grosses méthodes sans structures, les if sans accolades, les noms de variables sans significations font partie des pratiques faisant en sorte que votre hygiène de code soit considérée comme douteuse.
C’est ainsi que je présente un sapristi de bon exemple de ce que je considère un bon cas de code qui sent mauvais. C’est un ami qui m’a présenté le bout de code.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
foreach (var r in registrations) | |
{ | |
if ((count++) % 10 == 0); | |
Console.Write("\r{0} %", Math.Round((double)count / registrations.Count * 100d)); | |
} |
Combien d’irritants comptez-vous? Sur deux lignes de code, j’en dénombre quatre. Ce n’est pas pire n’est-ce pas? Voici ma liste.
- La variable count est incrémentée dans le if
- Il y a un point virgule à la fin de la ligne 3 (celle de la déclaration du if)
- Il n’y a pas d’accolades sur le if
- L’utilisation de « \r » pour faire un saut de ligne dans la console. Environnement.NewLine devrait être à préconiser.
- Je comprends que le résultat de la division doit être (double) mais la spécification dupliquée du type (double) et 100d me laisse dubitatif.
Ceci étant dit, ce code en question peut être facilement refactoré pour le faire sentir bon comme un nouveau-né. Ce n’est pas ça le problème. Le vrai pépin avec ce genre de code est la maintenabilité à long terme, comme toujours. Il s’agit d’un petit exemple. Imaginez maintenant une classe, un module ou même une application entière programmée de cette façon.
Juste à l’odeur, on se croirait dans un dépotoir tellement c’est infect.
Totalement d’accord avec toi. :)
Je rajouterai aussi que dans un gros projet, avec plusieurs développeurs et que chacun d’eux a sa propre façon de coder (bonne et mauvaise mélangées), cela devient vite le foutoir…
Personnellement j’aime l’homogénéité. Du coup, ne serait-il pas intéressant pour une équipe de projet d’avoir des conventions de code ? Mais cela soulèverait le faire qu’on perd aussi en « personnalité » pour rester dans l’analogie. :) Et donc cela ferait monter en compétence d’hygiène des profils plutôt junior,s mais pourrait aussi faire perdre une certaine qualité de code et capacité d’évolution pour des profils plutôt séniors. Tu en penses quoi ?
À mon avis, pour tout projet un peu sérieux, une convention de code s’impose. Ça n’a pas besoin d’être super rigide. Juste un certain nombre de règles à respecter pour que tout le monde aille dans le même sens.
La meilleure façon de l’imposer est de passer par de l’automatisation pour la validation. Au moment de la revue de code, si les développeurs n’ont qu’à valider des algorithmes et la solution globale, les choses vont aller plus rondement.
Vu comme ça, en effet c’es quelque chose qui serait vraiment idéal dans la plupart des projets.
A quand un post sur des précos de ta part? ;)