Dependency Inversion Principle
B. Les abstractions ne doivent pas dépendre de détails. Les détails doivent dépendre d'abstractions.
Les architectures classiques ne permettent pas la réutilisation des modules "métier"
Dans la plupart des applications, les modules de haut niveau (ceux qui portent la logique fonctionnelle de l'application ou les aspects "métier") sont construits directement sur les modules de bas niveau (par exemple les librairies graphiques ou de communication) :
Cela paraît naturel au premier abord mais pose en réalité deux problèmes essentiels :
- Les modules de haut niveau doivent être modifiés lorsque les modules de bas niveau sont modifiés.
- Il n'est pas possible de réutiliser les modules de haut niveau indépendamment de ceux de bas niveau. En d'autres termes, il n'est pas possible de réutiliser la logique d'une application en dehors du contexte technique dans lequel elle a été développée.
L'inversion des dépendances
Selon ce principe, la relation de dépendance doit être inversée : les modules de bas niveau doivent se conformer à des interfaces définies et utilisées par les modules de haut niveau.
L'abstraction comme technique d'inversion des dépendances
Considérons deux classes A et B, A utilisant B comme indiqué sur le schéma ci-dessous :
Pour inverser la dépendance de A vers B, on introduit une classe d'interface I dont derive B comme suit :
Dans ce nouveau schéma B dépend désormais du couple (A,I), la dépendance est donc inversée. Le couple (A,I) forme une sorte d'extension de la classe A dans laquelle on inclut une représentation abstraite des dépendances de A.
Remarque : On reconnaît ici le mécanisme de "délégation abstraite" présenté dans le Principe d'Ouverture/Fermeture. L'ouverture/fermeture est en effet obtenue en inversant la dépendance entre A et B, de sorte que A n'est plus impactée par des changements de B.
Vers des frameworks métier ?
Ce principe conduit à des applications dans lesquelles la logique "métier" est parfaitement réutilisable. Cette partie métier forme une sorte de "framework", qui permet de développer une même application dans des contextes techniques différents.
_____
Article original : http://www.objectmentor.com/publications/dip.pdf
Voir également DependencyInversionPrinciple
sur Wiki.