Un code lisible n’est pas celui qui montre la technique du développeur, mais celui qui communique son intention de façon parfaitement claire.

Nous n’écrivons pas du code pour les machines. Les machines se contentent de bytecode. Nous écrivons du code pour que d’autres humains le lisent : nos collègues, les futurs mainteneurs, nous-mêmes dans six mois.


Les Contraintes Créent l’Harmonie

De même que les poètes ont des contraintes (le sonnet impose 14 vers, le maqam définit une structure musicale), les développeurs doivent s’en imposer : SOLID, KISS, YAGNI…

Ces principes ne sont pas des règles arbitraires. Ce sont des garde-fous qui nous empêchent de sombrer dans la complexité gratuite. Ils créent une harmonie dans notre code, une cohérence qui facilite la compréhension.

La simplicité demande plus de talent que la complexité.


Astuces Pratiques pour Garantir la Lisibilité

1. Screaming Architecture

Votre architecture doit “crier” son intention métier. En regardant la structure de dossiers, on doit comprendre le domaine.

2. Extract Methods

Dès qu’un bloc de code représente un concept métier, extrayez-le dans une méthode avec un nom explicite.

3. Les Tests Comme Spécifications Vivantes

Vos tests unitaires doivent se lire comme de la documentation.

4. TDD pour Éviter le Superflu

Le TDD vous force à n’écrire que le code strictement nécessaire.

5. Nommage Intentionnel

Bannissez les noms génériques comme data, info, manager, service, dto. Chaque nom doit révéler l’intention métier.

// Mauvais
var result = ProcessData(input);

// Bon
var enrichedStudy = EnrichStudyWithAiAnalysis(dicomStudy);

6. Un Niveau d’Abstraction par Méthode

Ne mélangez pas les niveaux : soit vous orchestrez, soit vous implémentez. Jamais les deux dans la même méthode.


Exemple concret

Code initial (fonctionnel mais cryptique)

public async Task ProcessOrder(Order order)
{
    if(order==null)throw new ArgumentNullException();
    var validationResult=await _validator.ValidateAsync(order);
    if(!validationResult.IsValid)throw new ValidationException();
    await _repository.SaveAsync(order);
    await _messageBus.PublishAsync(new OrderCreatedEvent(order.Id));
}

Problèmes :

  • Tout est au même niveau d’abstraction
  • L’intention est noyée dans les détails techniques

Code refactoré (lisible et maintenable)

public async Task ProcessOrder(Order order)
{
    ValidateOrderIsNotNull(order);

    await EnsureOrderIsValid(order);

    await SaveOrder(order);

    await NotifyOrderCreation(order);
}

L’intention est immédiatement claire.


Conclusion

Un code obscur coûte cher : en bugs, en temps de maintenance, en frustration. Un code clair est un investissement qui rapporte chaque jour.