La callisthénie est une pratique sportive qui consiste à utiliser le poids de corps et la gravité pour effectuer des exercices de musculation impliquant une totale maitrise de son corps.

Quel rapport avec le clean code me direz-vous ? En 2008, Jeff Bay (programmeur chez ThoughtWorks) propose un ensemble de 9 règles de codage dans le chapitre du livre The Thoughtworks Anthology intitulé « Object Calisthenics ». Le but de cet exercice : produire un code orienté objet d’excellente qualité.

Ces règles sont axées sur la maintenabilité, la lisibilité, la testabilité et la compréhensibilité de votre code. Voici la liste de ces règles :

  1. Un seul niveau d’indentation par méthode
  2. Ne pas utiliser le mot clé ELSE
  3. Envelopper tous les types primitifs et les string
  4. Collections « de première classe »
  5. Un point par ligne
  6. Ne pas abréger
  7. Maintenir toutes les classes petites
  8. Aucune classe avec plus de deux variables d’instance
  9. Pas de Getters / Setters / Properties

1. Un seul niveau d’indentation par méthode

Code indentation smell
Code indentation smell

Qui n’a jamais vu ce genre de code dans ses projets ? Imaginez maintenant que le style d’indentation ne soit pas de type K&R mais plutôt GNU, Allman ou bien encore Whitesmiths… Il s’agit bien sûr d’un cas extrême. Mais une méthode qui possède déjà 3 niveaux d’indentation (if, for, …) devient déjà compliqué à lire et à comprendre.

Voici déjà 3 techniques qui pourront vous aider à appliquer cette première règle :

2. Ne pas utiliser le mot clé ELSE

3. Envelopper tous les types primitifs et les string

4. Collections « de première classe »

5. Un point par ligne

6. Ne pas abréger

Pourquoi abréger ? La réponse qui m’est généralement faite : gagner du temps. OK, prenons l’exemple suivant, exemple inspiré fortement d’un code réel :

var factu = compta.GenFactu(42);

Hum.. « Compta »… Comptabilité ? Comptable ? Nous sommes ici obligé de regarder le type de l’objet pour savoir. « GenFactu »… ? Générer facturation ? Générer facture ? A priori ici générer facture… Facture ? Facturation ? Facture certainement. Nous avons effectivement gagné 11 caractères. Whaou ! Nous avons gagné au moins 1 seconde à l’écriture. Combien de temps perdu à effectuer le mapping mentale pour comprendre cette ligne ? 1 seconde ? Maintenant combien de fois allons nous relire ce code (revue de code, tests, debugging, …) ? Donnons un minimum de 3 fois. Cela veut dire que, de base, pour 1 seconde de gagner, 3 de perdues. Il s’agit ici d’un code simple isolé. Maintenant imaginons la même chose à l’échelle d’un projet de 500.000 lignes…

var facture = comptable.GenererFacture(42);

Est-ce que le gain en vaut la chandelle ? Pas sûr. Robert C. Martin, autorité dans le domaine du clean code, consacre un chapitre entier de son livre Clean Code à l’importance du nommage (Meaningful Names).

7. Maintenir toutes les classes petites

8. Aucune classe avec plus de deux variables d’instance

9. Pas de Getters / Setters / Properties

La callisthénie : une maitrise total de son code corps