Le principe de substitution de Liskov ne vous permet fondamentalement pas de abuser de l'héritage d'implémentation: vous ne devez jamais utiliser l'héritage simplement pour la réutilisation de code (il existe une composition pour cela)! En adhérant au LSP, vous pouvez être à peu près sûr qu'il existe réellement une "relation de type" entre votre super-classe et votre sous-classe.
Cela dit, vos sous-classes doivent implémenter toutes les méthodes de la sous-classe de la même manière que l'implémentation des méthodes de la sous-classe. Vous ne devriez jamais écraser une méthode en implémentant NOP ou renvoyer null lorsque le sur-type lève une exception; comme indiqué dans les conditions de conception par contrat, vous devez respecter le contrat de la méthode de la superclasse lorsque vous passez outre une méthode. Un moyen de se défendre contre la violation de ce principe consiste à ne jamais ignorer une méthode mise en œuvre; au lieu de cela, extraire une interface et implémenter cette interface dans les deux classes.
Le principe de ségrégation d'interface , le principe de responsabilité unique et le principe de haute cohésion de GRASP sont en quelque sorte liés; ils se réfèrent au fait qu'une entité ne devrait être responsable que d'une seule chose, de sorte qu'il n'y ait qu'une seule raison de changer pour que le changement se fasse très facilement.
En fait, si une classe implémente une interface, elle doit implémenter et utiliser toutes les méthodes de cette interface. S'il existe des méthodes qui ne sont pas nécessaires dans cette classe particulière, l'interface n'est pas bonne et doit être scindée en deux interfaces, l'une ne contenant que les méthodes requises par la classe d'origine. On peut considérer qu’il s’agit d’un point de vue lié au principe précédent par le fait qu’il ne vous permet pas de créer de grandes interfaces, de sorte que leur implémentation risque de rompre le LSP.
Vous pouvez voir l' inversion de dépendance dans le modèle d'usine; Ici, le composant de haut niveau (le client) et le composant de bas niveau (instance individuelle à créer) dépendent de l'abstraction.(L'interface). Une façon de l'appliquer dans une architecture en couches: vous ne devez pas définir d'interface avec une couche de la couche implémentée, mais du module appelé. Par exemple, l'API de la couche source de données ne doit pas être écrite dans la couche source de données mais dans la couche logique d'entreprise, où il est nécessaire de l'appeler. De cette manière, la couche source de données hérite / dépend du comportement défini dans la logique de l'entreprise (donc de l'inversion) et non l'inverse (comme ce serait le cas de manière normale). Cela offre une flexibilité dans la conception, permettant à la logique métier de fonctionner sans changement de code, avec une autre source de données totalement différente.