Principes SOLID, cohésion, couplage et injection de dépendances
Informatique de gestion · Bachelor 3
Les cinq principes SOLID, cohésion et couplage, inversion et injection de dépendances.
Introduction
SOLID est un acronyme qui regroupe cinq principes de conception orientée objet popularisés par Robert C. Martin : responsabilité unique (SRP), ouvert/fermé (OCP), substitution de Liskov (LSP), ségrégation des interfaces (ISP) et inversion des dépendances (DIP). Ils visent un code facile à faire évoluer, à tester et à comprendre.
Ces principes s'appuient sur deux notions plus anciennes : la cohésion (les éléments d'un module travaillent à un même but) et le couplage (degré de dépendance entre modules). Un bon design cherche une forte cohésion interne et un faible couplage externe. Le principe d'inversion des dépendances stipule que les modules de haut niveau ne doivent pas dépendre des modules de bas niveau, mais tous deux d'abstractions ; l'injection de dépendances en est la mise en œuvre courante : une classe reçoit ses collaborateurs de l'extérieur au lieu de les créer elle-même.
Ce ne sont pas des lois : appliqués à l'excès, ils produisent une profusion d'interfaces inutiles. Ils servent de grille de lecture lors des revues de code et du refactoring, notamment pour réduire la dette technique.
Objectifs d'apprentissage
- Énoncer les cinq principes SOLID avec leurs mots-clés
- Distinguer cohésion et couplage
- Reconnaître une violation du principe ouvert/fermé ou de Liskov
- Expliquer inversion de dépendances et injection de dépendances
- Argumenter sur les limites d'une application dogmatique de SOLID
Concepts clés
- SRP
- Une classe n'a qu'une seule raison de changer : une responsabilité cohérente.
- OCP
- Ouvert à l'extension, fermé à la modification : on ajoute du comportement sans réécrire le code existant.
- LSP
- Un sous-type doit pouvoir remplacer son type de base sans casser les attentes des clients.
- ISP et DIP
- Interfaces petites et spécifiques ; dépendre d'abstractions plutôt que de classes concrètes.
- Cohésion et couplage
- Viser une forte cohésion dans les modules et un faible couplage entre eux.
Conclusion
SOLID n'est pas une checklist mais une manière de se poser les bonnes questions sur la conception : qui change, pourquoi, et à quel coût. Ils prennent tout leur sens lors du refactoring et des revues de code.
Appliquez-les avec jugement : une petite application interne n'exige pas la même architecture qu'un système de gestion appelé à évoluer pendant dix ans.
Cartes
- Que signifie SOLID ?
- Cinq principes de conception objet : Single responsibility, Open/closed, Liskov substitution, Interface segregation, Dependency inversion.
- Énoncez le principe de responsabilité unique.
- Une classe doit avoir une seule raison de changer, c'est-à-dire servir un seul acteur ou un seul aspect métier.
- Exemple de violation du SRP ?
- Une classe Facture qui calcule les montants, génère le PDF et envoie le courriel.
- Que dit le principe ouvert/fermé ?
- On doit pouvoir ajouter de nouveaux comportements par extension (nouvelles classes) sans modifier le code déjà testé.
- Que dit le principe de substitution de Liskov ?
- Partout où l'on attend un objet d'un type, un objet d'un sous-type doit convenir sans changer la correction du programme.
- Exemple classique de violation de Liskov ?
- Un Carré qui hérite de Rectangle : modifier la largeur change aussi la hauteur et brise l'attente du client.
- Que demande la ségrégation des interfaces ?
- Préférer plusieurs interfaces spécifiques à une grosse interface générale, pour ne pas forcer un client à dépendre de méthodes inutiles.
- Quelle différence entre inversion et injection de dépendances ?
- L'inversion est un principe (dépendre d'abstractions) ; l'injection est une technique qui fournit les dépendances de l'extérieur, par constructeur par exemple.
- Pourquoi l'injection facilite-t-elle les tests ?
- On peut substituer un double de test (mock, stub) à la vraie dépendance, sans base de données ni service externe.
Glossaire
- Cohésion
- Mesure dans laquelle les éléments d'un module concourent à un même objectif.
- Couplage
- Degré de dépendance d'un module envers les autres.
- Injection de dépendances
- Technique qui fournit à un objet ses collaborateurs depuis l'extérieur.
- Abstraction
- Interface ou classe abstraite qui masque les détails d'implémentation.
- Double de test
- Objet simulé qui remplace une dépendance réelle lors d'un test.
- Dette technique
- Coût futur lié à des choix de conception rapides mais peu maintenables.