Qu’est-ce que le Clean Code ?
Le Clean Code est une philosophie de programmation qui vise à écrire du code clair, simple et compréhensible. Popularisé par Robert C. Martin dans son livre Clean Code: A Handbook of Agile Software Craftsmanship, il s’agit d’un ensemble de pratiques qui permettent aux développeurs de créer des logiciels de haute qualité, faciles à maintenir et à étendre.
Chez Directskills nous sommes attachés aux principes de Clean Code, qui nous permettent de garantir une qualité dans nos produits et un engagement fort de nos équipes.
Les principes clés du Clean Code
Noms Significatifs
Clarté avant tout : Les noms de variables, fonctions et classes doivent refléter précisément leur intention.
Éviter les abréviations : Utilisez des noms complets pour éviter toute confusion.
Consistance : Adoptez une convention de nommage uniforme à travers tout le code.
Fonctions Concises
Monofonctionnalité : chaque fonction doit accomplir une seule tâche. Chez Directskills nous privilégions l’utilisation de fonctions pures.
Concise : des fonctions courtes sont plus faciles à comprendre et à tester.
Éviter les effets de bord : Les fonctions doivent produire le même résultat pour les mêmes entrées sans modifier l’état du système de manière inattendue.
Ecriture du code expressif
Code auto-documenté : Le code doit être suffisamment clair pour réduire le besoin de commentaires.
Utilisation judicieuse des commentaires : Les commentaires doivent expliquer le « pourquoi », pas le « comment ».
Structures claires : Utilisez des structures de contrôle simples et évitez la complexité inutile.
Respect des Principes SOLID
Responsabilité Unique d’une classe.
Ouvert/Fermé : Le code doit être ouvert à l’extension mais fermé à la modification.
Substitution de Liskov : Si T est un type et un S un sous-type alors tout objet de type T peut être remplacé par un objet de type S sans avoir à changer d’autres propriétés.
Principe de ségrégation d’interface : elles doivent être concises plutôt que larges.
Inversion de Dépendances, les interfaces ne doivent pas dépendre de leurs implémentations, les implémentations doivent dépendre des interfaces.
DRY (Don’t Repeat Yourself)
Éviter la Redondance : Le code dupliqué est une source potentielle d’erreurs.
Factorisation : Regroupez les fonctionnalités communes d’un point de vue code et métier pour faciliter la maintenance.
Tests Unitaires Exhaustifs
Couverture Maximale : Les tests doivent couvrir autant de cas que possible, cela permet une certaine assurance lors du refactoring.
TDD (Test-Driven Development) : Réfléchir aux cas d’usage en commençant par l’écriture des tests avec un validation itérative lors du développement.
Tests Rapides et Indépendants : Les tests doivent pouvoir s’exécuter rapidement et ne pas dépendre les uns des autres. Cela permet notamment de pouvoir les intégrer à la CI (Continuous Integration).
Refactoring Régulier
Amélioration Continue : Le refactoring est un processus constant pour améliorer la structure du code sans en changer le comportement.
Détection Précoce des Problèmes : Le refactoring aide à identifier et à résoudre les problèmes avant qu’ils ne deviennent critiques.
Adaptabilité : Un code bien refactoré est plus facile à adapter aux nouvelles exigences.
Gestion Efficace des Erreurs
Exceptions Claires : Utilisez des exceptions pour gérer les situations exceptionnelles, pas pour le contrôle de flux normal.
Messages d’Erreur Informatifs : Fournissez des messages qui aident réellement à diagnostiquer le problème.
Éviter le Code Mort : Supprimez le code inutilisé qui peut prêter à confusion.
Utilisation de Logger tels que Sentry pour capter les erreurs en production côté client et réduire le temps de réaction à leur correction.
Les 10 commandements d’une Pull Request (PR) pour nos développeurs
1. Tu devras faire au moins une PR chaque jour.
2. Si ta fonctionnalité dure plus d’un jour, tu devras la diviser.
3. Une seule thématique identifiable ta PR devra contenir.
4. Si ta PR contient plus d’une thématique, tu devras diviser ta fonctionnalité.
5. À chaque fois qu’une fonctionnalité et sa description ne tiennent pas sur deux lignes, un test pour cette fonctionnalité devra exister (au préalable).
6. Si une fonction testée dépend de données traitées en dehors de son périmètre, un repository plutôt qu’un mock tu devras écrire.
7. Si une fonction ou un type n’est pas nécessaire en dehors de ton fichier, tu ne devras pas l’exporter.
8. Si une interface peut être écrite à la place d’un type, tu devras préférer l’interface.
9. Si tu as laissé du code commenté ou n’importe quel typage, une raison valable tu devras pouvoir donner.
10. Avant de pousser, tu devras rebaser et faire un build de vérification.
Les Avantages du Clean Code
Maintenabilité Améliorée : Un code propre est plus facile à comprendre et à modifier, réduisant le temps et les coûts de maintenance.
Détection et Correction des Bugs Facilitée : Les problèmes sont plus faciles à identifier dans un code bien structuré.
Collaboration Optimisée : Les équipes peuvent travailler plus efficacement sur un code clair et bien organisé, leur engagement en est d’autant plus fort que le code est propre.
Évolutivité : Un code de qualité facilite l’ajout de nouvelles fonctionnalités sans perturber l’existant.
Satisfaction Client : Un logiciel fiable et performant améliore la satisfaction des utilisateurs finaux.
Mettre en Pratique le Clean Code
Adopter une Culture du Code Propre
- Formation et Sensibilisation : Encouragez les développeurs à se former aux principes du Clean Code.
- Revue de Code Rigoureuse : Intégrez des revues de code systématiques pour maintenir la qualité et pour former vos développeurs.
- Pour faciliter la pratique du Clean Code par les développeurs, chaque remarque d’une revue de code doit être d’un lien vers la documentation de la bonne pratique.
Intégrer le TDD dans le Processus de Développement
- Discipline : Respectez la pratique d’écrire des tests avant le code.
- Automatisation : Utilisez des outils pour automatiser les tests et les intégrer dans le pipeline CI/CD.
Encourager le Refactoring Continu
- Allouer du Temps : Prévoyez du temps dans les sprints pour le refactoring.
- Mesurer la Dette Technique : Utilisez des métriques pour suivre et réduire la dette technique.
Documenter de Manière Efficace
- Documentation Essentielle : Fournissez de la documentation là où elle apporte une réelle valeur ajoutée, par exemple sur les bonnes pratiques, sur des concepts logiciels complexes.
- Commentaires Pertinents : Évitez les commentaires redondants ou évidents.
Promouvoir l’Amélioration Continue
- Veille Technologique : Restez informé des nouvelles pratiques et outils.
- Partage de Connaissances : Organisez des sessions internes pour échanger sur les bonnes pratiques.