web-dev-qa-db-fra.com

Différence entre "Inversion de contrôle", "Inversion de dépendance" et "Découplage"

Je lis la théorie sur l'inversion de dépendance et le découplage et je peux ' t voir la différence entre les deux.

Inversion de dépendance parle de découplage des composants fonctionnels afin que les composants de niveau supérieur ne dépendent pas des composants de niveau inférieur.

Découplage parle de la même chose et comment y parvenir. Mais nous avons des conteneurs IoC qui gâchent encore plus les choses. Pourquoi ne sont-ils pas plutôt appelés Conteneurs d'inversion de dépendance ou encore mieux Conteneurs d'injection de dépendance , car ils servent au couplage d'exécution de composants indépendants?

Ensuite, nous avons Inversion de contrôle. C'est fondamentalement la même chose que Inversion de dépendance n'est-ce pas? Pourquoi y a-t-il trois termes qui décrivent la même chose? Ou suis-je aveugle?

  1. Quelle est la différence entre les trois?
  2. Que doit faire l'IoC dans les conteneurs IoC?
70
Robert Koritnik

Le découplage est un principe très général applicable dans de nombreux domaines. L'inversion des dépendances est une forme spécifique de découplage où vous dissociez les niveaux supérieurs de votre système des niveaux inférieurs en les séparant en bibliothèques et en utilisant des interfaces. Cela vous permet de remplacer les parties de niveau inférieur de votre système sans retouches majeures.

Par exemple, au lieu que les parties de niveau supérieur du système créent des instances concrètes des classes de niveau inférieur, un conteneur IoC peut être utilisé pour découpler la façon dont les objets sont créés.

L'inversion de contrôle est un principe de conception utilisé par les bibliothèques de framework qui permettent au framework de reprendre un certain contrôle de l'application. C'est-à-dire qu'un cadre de fenêtrage peut rappeler dans le code d'application lorsque certains événements d'interface utilisateur se produisent. Martin Fowler utilise le terme Principe d'Hollywood comme dans Ne nous appelez pas, nous vous appellerons. Le découplage est une partie importante de l'inversion du contrôle.

Mais qu'est-ce qu'un conteneur IoC a à voir avec l'inversion du contrôle? Pour citer Martin Fowler :

Inversion de contrôle est un terme trop générique, et donc les gens trouvent cela déroutant. En conséquence, avec de nombreuses discussions avec divers défenseurs de l'IoC, nous avons choisi le nom Dependency Injection.

(Notez que Martin Fowler parle de injection de dépendance, pas inversion de dépendance.)

Un conteneur IoC aide à implémenter l'injection de dépendance et peut-être un meilleur terme serait conteneur d'injection de dépendance. Cependant, le nom du conteneur IoC semble coller. L'injection de dépendance est un composant important dans l'inversion de dépendance, mais l'utilisation de conteneurs IoC pour l'injection de dépendance peut être source de confusion car l'inversion de contrôle est un principe plus large et plus générique.

Vous signalez que la dénomination n'est pas très cohérente, mais cela ne devrait pas être une grande surprise car ces termes ont été inventés et utilisés indépendamment, même s'ils se chevauchent.

66
Martin Liversage

Injection de dépendance atteint Découplage en utilisant Inversion de contrôle.

46
Boris Pavlović

Je trouve l'explication suivante de DIP in the Wild article sur martinfowler.com simple à comprendre (ici DI = Dependency Injection, DIP = Dependency Inversion Principle, IoC = Inversion of Control):

DI concerne la façon dont un objet acquiert une dépendance. Lorsqu'une dépendance est fournie en externe, le système utilise DI. L'IoC concerne qui initie l'appel. Si votre code initie un appel, ce n'est pas IoC, si le conteneur/système/bibliothèque rappelle dans le code que vous lui avez fourni, est-ce IoC.

DIP, d'autre part, concerne le niveau d'abstraction dans les messages envoyés de votre code à la chose qu'il appelle. (...) DI concerne le câblage, IoC concerne la direction et DIP concerne la forme [de l'objet dont dépend le code].

16
hidro

Inversion de dépendance: dépend des abstractions, pas des concrétions.

Inversion de contrôle: Main vs Abstraction, et comment le Main est la colle des systèmes.

DIP and IoC

Voici quelques bons articles à ce sujet:

https://coderstower.com/2019/03/26/dependency-inversion-why-you-shouldnt-avoid-it/

https://coderstower.com/2019/04/02/main-and-abstraction-the-decoupled-peers/

https://coderstower.com/2019/04/09/inversion-of-control-putting-all-together/