Le code, c'est comme la mafia

Hervé Rincent

Hervé Rincent

13 sept. 2022

Imaginez un site de e-commerce. Avec des commentaires déposés par les clients à propos des produits.

Il faut afficher ces commentaires sur le site. Votre mission : adapter la façon dont la date du commentaire s’affiche.

Donc 3 façons différentes d’afficher la date d'un commentaire.

Alors comme vous êtes malin, vous allez créer (ou ré-utiliser) une classe Date dotée de 3 méthodes d’affichage.

Et comme vous êtes aussi bilingue que malin, vous traduisez commentaire en comment (Oui, pour date, c’était plus facile).

Dans votre fonction qui affiche le commentaire, habilement baptisée printComment, vous passez en paramètre le format de la date parmi les 3 options possibles.

Ca va ressembler à ça :

function printComment(comment:Comment, dateFormat:DateFormat) {
let textDate:string
switch (dateFormat) {
	case "date" : textDate = comment.date.toLocaleDateString(); break;
	case "time" : textDate = comment.date.toLocaleTimeString(); break;
	case "dateTime" : textDate = comment.date.toLocaleString(); break;
	default: textDate = comment.date.toLocaleString();
}
...
Le switch sent mauvais

Et c’est bourré de couplage.

Pourquoi ?

En résumé, nous avons de beaux spaghettis dans notre assiette.

Pour s’en faire une idée,  jouons au jeu “qui connaît qui ?” :

Des flèches "je connais" partout

Et alors, c’est quoi le problème puisque ça marche comme ça ?

Découpler pour un avenir radieux

Le problème surgira le jour ou quelque chose va changer. Probablement bientôt.

A cause du couplage, la modification réalisée à un endroit (dans la classe Comment, ou dans la classe Date p.ex) va casser le code à un autre endroit.

Et ça va aussi ralentir les évolutions. Pour ajouter un 4ème format de date, je dois modifier le code à plusieurs endroits :

Comment éviter ça ?

Non Patrick. Pas en cassant la voix.

Mais en cassant les liens.

On va sous-traiter le formattage à un citoyen de première classe : une fonction 🎉.

Et on fera très peu d’hypothèse à son propos. On va juste dire qu’elle prend un truc similaire à une date de commentaire, et qu’elle retourne un truc à afficher.

Cette fonction sera passée en paramètre à printComment. Histoire de lui dire : “tiens, pour afficher la date de ton commentaire, utilise ça sans te préoccuper des détails”.

Au lieu de passer une valeur, on donne un outil.


// Pas de couplage à la façon dont le commentaire gère sa date
// Pas de couplage à une énumération d'options

function printComment(
	comment:Comment, 
	dateFormatter: (date:Comment['date'])=>string
) {
const textDate = dateFormatter(comment.date)
...

Ainsi, on a enlevé du couplage.

Mais pas tout.

Il en reste.

Le bon couplage et le mauvais couplage

Parce que le couplage, c’est comme le cholestérol ou les chasseurs.

On trouve aussi du bon couplage. C’est celui qui assure de la cohésion.

Alors ça peut sembler un peu paradoxal par rapport aux problèmes dont on vient de parler.

La cohésion, c’est respecter des contrats entre des bouts de code, sans s’occuper des détails.

Ces contrats s’appellent des interfaces.

Observez comment les modifications apportées à notre code ont réduit le couplage à des interfaces ( Date , Comment) qui ont une signification explicite. Des contrats sur lesquels on s’est mis d’accord, pour être certain qu’on parle bien de la même chose partout dans le code.

Désormais notre fonction printComment sait seulement qu’un commentaire comporte une date, mais sans en connaître aucun détail (pas même son type).

De 8 à 5 flèches

Moralité ?

Le code, c’est comme la mafia.

Moins tu en sais, mieux c’est. Chacun doit se limiter aux informations strictement nécessaires à son job.


Continuer la lecture

Une arme secrète

23 août 2022

4 min read

Une arme secrète

Lire l'article
Inscription à la newsletter

Recevez chaque semaine un article pour réfléchir à votre prochain projet tech/data

gratuit, sans spam, désinscription en 1 clic

Merci ! Regardez dans botre boite mail. Un lien de confirmation n'attend plus que votre clic.
Arghh il semble compliqué de vous ajouter à la liste de diffusion. Et si vous m'envoyiez un mail directement à contact@camilab.co ?