Extrait du livre Coder proprement de Robert C. Martin
Lien PDF
Page 130 - tests d'apprentissage
Les tests d’apprentissage ne coûtent finalement rien. Nous devions apprendre l’API, et
l’écriture de ces tests nous a permis d’obtenir ces connaissances facilement et en toute
indépendance. Les tests d’apprentissage étaient des expériences précises qui nous ont
aidés à améliorer notre compréhension.
Page 135 - Les trois lois du TDD (Test Driven Development)
Première loi. Vous ne devez pas écrire un code de production tant que vous n’avez pas
écrit un test unitaire d’échec.
Deuxième loi. Vous devez uniquement écrire le test unitaire suffisant pour échouer ;
l’impossibilité de compiler est un échec.
Troisième loi. Vous devez uniquement écrire le code de production suffisant pour réussir
le test d’échec courant.
...
Si nous travaillons de cette manière, nous écrivons des dizaines de tests par jour, des
centaines de tests par mois et des milliers de tests par an.
Page 136 - code de test est important
le code de test est aussi important que le code de
production.
Page 144 - créer un langage de test
... J’essaie habituellement de
créer un langage de test spécifique au domaine qui la prend en charge ...
Page 145 - F.I.R.S.T. (Matériel pédagogique d’Object Mentor.)
Les tests propres suivent cinq autres règles qui forment l’acronyme précédent :
Fast (rapide). Les tests doivent être rapides. Lorsque des tests s’exécutent lentement, il
est peu probable qu’ils soient lancés fréquemment. Lorsque les tests ne sont pas
exécutés très souvent, il est impossible de trouver les problèmes suffisamment tôt
pour les corriger facilement. Vous n’êtes pas aussi libre de nettoyer le code, et il finit
par se dégrader.
Independent (indépendant). Les tests ne doivent pas dépendre les uns des autres. Un
test ne doit pas établir les conditions d’exécution du test suivant. Vous devez être en
mesure d’exécuter chaque test indépendamment et dans l’ordre que vous voulez.
Lorsque des tests dépendent l’un de l’autre, le premier qui échoue provoque une
cascade d’échecs en aval rendant difficile le diagnostic et masquant les défauts en
aval.
Repeatable (reproductible). Les tests doivent pouvoir être reproduits dans n’importe
quel environnement. Vous devez être en mesure d’exécuter les tests dans l’environnement
de production, dans l’environnement de contrôle de qualité et sur votre
portable pendant que vous êtes dans le train sans connexion réseau. Si vos tests ne
sont pas reproductibles dans n’importe quel environnement, vous aurez toujours une
excuse pour leur échec. Vous serez également incapable de les exécuter lorsque
l’environnement n’est pas disponible.
Self-Validating (auto validant). Les tests doivent avoir un résultat binaire : ils réussissent
ou ils échouent. Vous ne devez pas avoir à consulter un fichier de journalisation
ou comparer manuellement deux fichiers texte différents pour savoir si les tests ont
réussi. Si les tests ne sont pas auto validants, l’échec peut alors devenir subjectif et
l’exécution des tests peut exiger une longue évaluation manuelle.
Timely (au moment opportun). Les tests doivent être écrits au moment opportun. Les
tests unitaires doivent être écrits juste avant le code de production qui permet de les
réussir. Si vous écrivez les tests après le code de production, vous constaterez qu’il
sera difficile de tester ce code. Vous pourriez décider qu’un code de production est
trop complexe à tester. Vous pourriez ne pas concevoir le code de production pour
qu’il puisse être testé.
Page 184 - conception "simple"
Selon Kent, une
conception est "simple" lorsqu’elle respecte les quatre règles suivantes, données par
ordre d’importance :
- elle réussit tous les tests ;
- elle ne contient aucune redondance ;
- elle exprime les intentions du programmeur ;
- elle réduit le nombre de classes et de méthodes.
Nuance page 189
Cependant, n’oubliez pas que cette règle est la dernière des quatre
règles de conception simple et qu’elle est donc la moins prioritaire. Par conséquent,
même s’il est important de réduire au maximum le nombre de classes et de fonctions, il
est plus important d’avoir des tests, de supprimer la redondance et d’améliorer l’expressivité.
Page 188 - soigner votre travail
Vous devez donc soigner votre travail. Passez un peu de temps sur chaque fonction et
chaque classe. Choisissez de meilleurs noms, décomposez les longues fonctions en
fonctions plus courtes et, de manière générale, prenez soin de ce que vous créez.
L’attention est une ressource précieuse.
Page 195 - Concurrence
- Le code lié à la concurrence possède son propre cycle de développement, de changement
et de réglage.
- Le code lié à la concurrence présente ses propres défis, qui sont différents, et
souvent plus complexes, de ceux du code non liés à la concurrence.
- Les causes de dysfonctionnement du code concurrent mal écrit suffisent amplement
à compliquer son écriture, sans même prendre en compte la complexité du code de
l’application elle-même.
Recommandation : gardez le code lié à la concurrence séparé de tout autre
code.
Page 203 - ne considérez pas les dysfonctionnements du système comme des cas uniques.
Recommandation : ne considérez pas les dysfonctionnements du système
comme des cas uniques.
Page 268 - un code qui fonctionne n'est pas suffisant
Il ne suffit pas que le code fonctionne. Un code opérationnel masque souvent des
dysfonctionnements. Les programmeurs qui se satisfont d’un code simplement opérationnel
ne sont pas de véritables professionnels. Ils craignent sans doute de ne pas avoir
suffisamment de temps pour améliorer la structure et la conception de leur code, mais je
ne suis pas d’accord. Rien n’a un effet aussi négatif sur un projet de développement que
du mauvais code. Les plannings erronés peuvent être refaits, les exigences imprécises
peuvent être réétudiées, une mauvaise dynamique d’équipe peut être reconstruite. En
revanche, le mauvais code pourrit et fermente, puis se transforme en un fardeau qui
mène l’équipe à sa perte. J’ai rencontré de nombreuses équipes réduites à progresser
péniblement car, dans leur hâte, elles avaient créé un véritable tas de code malveillant
qui avait pris les rênes de leur destinée.
Le mauvais code peut évidemment être nettoyé. Toutefois, cette opération est très
onéreuse. Plus le code se dégrade, plus les modules s’immiscent les uns dans les autres,
en créant de nombreuses dépendances cachées et embrouillées. Retrouver et rompre les
anciennes dépendances est une tâche longue et ardue. À l’opposé, conserver un code
propre se révèle relativement facile. Si, le matin, vous mettez la pagaille dans un
module, il est facile de le nettoyer dans l’après-midi. Mieux encore, si vous avez créé un
désordre cinq minutes plus tôt, il est très facile de tout ranger immédiatement.
La solution consiste donc à conserver en permanence un code aussi propre et aussi
simple que possible. Ne laissez jamais la gangrène s’installer.
Page 356 - verrouillage côté serveur est à privilégier
Voici les raisons de préférer, en général, le verrouillage côté serveur :
- Le code redondant est réduit. Le verrouillage côté client impose à chaque client de
verrouiller correctement le serveur. En plaçant le code de verrouillage dans le
serveur, les clients peuvent employer l’objet sans avoir à écrire du code de
verrouillage supplémentaire.
- Les performances peuvent être améliorées. Vous pouvez remplacer un serveur sûr
vis-à-vis des threads par un serveur non sûr vis-à-vis des threads dans le cadre d’un
déploiement monothread, en évitant ainsi tous les surcoûts.
- Les possibilités d’erreur sont diminuées. Il suffit qu’un seul programmeur oublie de
verrouiller pour conduire au dysfonctionnement du système.