Académique Documents
Professionnel Documents
Culture Documents
Contenu
Coder proprement ............................................................................................................................2
Ce qu’en pensent les « grands »...................................................................................................2
Bjarne Strousrtup (créateur du C++) ........................................................................................2
Grady Booch (OO, Design Applications, OMT) .........................................................................2
Dave Thomas (grand-père d’Eclipse, Ruby) ..............................................................................3
Des noms significatifs ...................................................................................................................3
Méthodes ou fonctions ................................................................................................................4
Ne pas avoir d’effets de bord .......................................................................................................5
Commentaires ..............................................................................................................................9
Bons commentaires ..................................................................................................................9
Mauvais commentaires ......................................................................................................... 11
Mise en forme (Formatting) ...................................................................................................... 12
But : ....................................................................................................................................... 12
Mise en forme verticale......................................................................................................... 12
Densité verticale .................................................................................................................... 14
Fonctions dépendantes ......................................................................................................... 14
Ordre vertical......................................................................................................................... 15
Apparence horizontale .......................................................................................................... 16
Indentation ............................................................................................................................ 17
Règles d’équipe ..................................................................................................................... 18
Objets et structures de données ............................................................................................... 20
Gestion des erreurs ................................................................................................................... 21
Limite des données (boundaries) .............................................................................................. 22
Tests unitaires ........................................................................................................................... 22
3 règles du TDD (test driven developpment): ....................................................................... 22
L’art du code clair. La seule façon d’aller plus vite est de produire du code propre. Mais qu’est-ce
que du code propre. C’est ce que nous allons voir, (p. 6)
Le code propre focus sur un élément, chaque procédure, chaque fonction, chaque module
présente une seule idée, une seule pensée, un seul état. Pas de distraction, pas de pollution
d’idées, pas d’abondance de détails.
int tempsEcouleEnJour;
int nombreDeJoursDepuisCreation;
int nombreDeJoursDepuisModification;
int ageDuFichierEnJours;
Le problème vient non pas de la simplicité du code mais de son implicite : le niveau à partir
duquel le contexte n’est plus explicite dans le code lui-même. Le code exige implicitement que
nous connaissions les réponses aux questions suivantes :
On peut améliorer et aller plus loin et créer une classe pour les cellules au lieu d’utiliser un
vecteur de int.
Donc, des noms représentatifs qui illustrent bien ce que vous faites.
Méthodes ou fonctions
La première règle est : Elles doivent être courtes.
Switch, c’est difficile de le faire court. Ne pas mettre plus de 2 lignes par case. Utiliser des
méthodes. ATTENTION, souvent le switch est utilisé, là où le polymorphisme pourrait être
exploité.
Les arguments boolean sont à proscrire. Mieux vaut utiliser 2 méthodes séparées.
renderForSuite()
renderForSingle()
Vous pourriez croire que la réduction du nombre d’arguments en créant des objets est une
forme de tromperie, mais ce n’est pas le cas. Lorsque des groupes de variables sont passés
ensemble, à l’instar de x et y dans l’exemple précédent, il est fort probable qu’ils fassent partie
d’un concept qui mérite son propre nom.
Par exemple une méthode qui vérifie un mot de passe, initialise aussi celui-ci à la fin.
Figure 1 - p. 49 (fr)
Un argument est une entrée pour une méthode, et non une sortie.
report.appendFooter();
Enlever les try catch et préféré throws dans les classes de base.
Figure 2 - p. 53 (fr)
Être structuré. UN seul RETURN, pas de break, pas de continue et jamais de goto. En gardant les
méthodes petites, on a moins la tentation d’utiliser les return, break et continue.
Les commentaires ne vont pas améliorer du mauvais code, si c’est confus, les commentaires
vont empirer la situation au lieu de l’améliorer.
Bons commentaires
Commentaires légaux (copyright, normes, lois, etc.)
Information
Intention ou explication
TODO (à faire)
Mise en évidence
JavaDoc toujours
Commentaires imprécis
Distribution des tailles de fichiers dans une échelle logarithmique (la hauteur d’une boîte
correspond à l’écart-type).
Qu’est-ce que cela veut dire? Il apparaît qu’il est possible de construire des systèmes
performants avec des fichiers sources qui ont en moyenne 200 lignes et avec un maximum de
500 lignes. Les petits fichiers sont naturellement plus faciles à comprendre.
La métaphore du journal
Si vous pensez à un journal bien écrit, qu’est-ce qui le distingue?
Lecture verticale;
Au début vous rencontrer un titre qui vous informe sur le sujet de la nouvelle et vous
permet de décider si oui ou non vous allez vous y intéresser;
Le premier paragraphe vous donne un résumé de l’ensemble de la nouvelle en vous
masquant tous les détails tout en vous peignant les concepts à grands traits;
Si vous continuez votre lecture vers le bas, les détails s’ajoutent et vous fournissent les
noms, dates et autres menus détails;
Remarquez les lignes blanches. Si nous retirons ces lignes vides, comme dans le listing
précédent, nous remettons considérablement en question la lisibilité du code.
Fonctions dépendantes
Si une fonction en appelle une autre, elles doivent être verticalement proches et l’appelant doit
être le plus près au-dessus de l’appelée.
Une autre façon d’utiliser les espaces est d’accentuer la précédence des opérateurs.
MAUVAIS : Par contre aligner les attributs ainsi est inutile, difficile à entretenir et n’amène pas
vraiment de clarté.
Ensuite, on bloque ces règles, on les documente même dans les sources et… on les respecte.
Même si ce ne sont pas nos préférences, on doit respecter les règles parce ce que c’est le choix
de l’équipe.
« Rappelez-vous, la qualité d’un logiciel est faite d’un ensemble de documents qui se LISENT bien.
Les documents doivent avoir un style simple, uniforme et cohérent. Le lecteur ne doit pas
découvrir un style, un format ou une nomenclature différente d’un fichier source à un autre pour
le même projet. La dernière chose que nous voulons faire est d'ajouter à la complexité
du code source par le fouillis d’écriture contenant différents styles individuels. »
Les « get » et les « set » ne sont pas toujours pertinents, cela dévoile de l’information sur l’objet,
parfois une méthode mieux nommée est appropriée. C’est facile d’ajouter de nouvelles sortes
d’objets sans modifier les comportements. Mais, c’est difficile d’ajouter de nouveaux
comportements à des objets déjà existants. Parfois, les structures de données vont offrir une
meilleure solution si on sait que de nouveaux comportements risquent de s’ajouter aux objets et
si on sait qu’il n’y aura pas de nouvelles sortes d’objets.
Un code procédural (un code qui utilise des structures de données) facilite l’ajout de nouvelles
fonctions sans modifier les structures de données existantes. Un code orienté objet facilite
l’ajout de nouvelles classes sans modifier les fonctions existantes.
Un code procédural complexifie l’ajout de nouvelles structures de données car toutes les
fonctions doivent être modifiées. Un code orienté objet complexifie l’ajout de nouvelles
fonctions car toutes les classes doivent être modifiées.
Par conséquent, ce qui est difficile pour l’orienté objet est facile pour le procédural, tandis que
ce qui est difficile pour le procédural est facile pour l’orienté objet !
Par exemple, si on regarde l’interface Map de l’Api de Java, on découvre que cette classe est
pleine de possibilités et probablement la plupart du temps trop large pour nos besoins.
http://docs.oracle.com/javase/8/docs/api/index.html?java/util/Map.html
Mais cela ne résout pas le problème du fait que l’interface Map est trop large pour nos besoins.
L’interface est cachée, ses frontières également, la classe est capable d’évoluer, mais on peut
aussi contrôler la demande.
Tests unitaires
Devrait toujours être dans des classes séparées. Idéalement xUnit.
1 « assert » par test, 1 concept par test et garder les tests unitaires propres et utiles.