Unterschied zwischen "Inversion of Control", "Dependency Inversion" und "Decoupling"

78

Ich lese Theorie über Abhängigkeitsinversion und -entkopplung und kann den Unterschied zwischen den beiden nicht erkennen.

Bei der Abhängigkeitsinversion geht es um die Entkopplung von Funktionskomponenten, damit Komponenten höherer Ebenen nicht von Komponenten niedrigerer Ebenen abhängen.

Die Entkopplung spricht über dasselbe und wie man es erreicht. Aber dann haben wir IoC-Container , die die Dinge noch weiter durcheinander bringen. Warum werden sie nicht eher als Abhängigkeitsinversionscontainer oder noch besser als Abhängigkeitsinjektionscontainer bezeichnet , weil sie der Laufzeitkopplung unabhängiger Komponenten dienen?

Dann haben wir Inversion of Control . Es ist im Grunde das Gleiche wie Dependency Inversion, nicht wahr? Warum gibt es drei Begriffe, die dasselbe beschreiben? Oder bin ich blind?

  1. Was ist der Unterschied zwischen den drei?
  2. Was muss IoC in IoC-Containern tun?
Robert Koritnik
quelle
@Anton Gogolev: Die Entkopplung wird mit dem zusätzlichen "o" geschrieben: en.wikipedia.org/wiki/Decoupling#Software_Development
Robert Koritnik

Antworten:

78

Die Entkopplung ist ein sehr allgemeines Prinzip, das in vielen Bereichen anwendbar ist. Die Abhängigkeitsinversion ist eine spezielle Form der Entkopplung, bei der Sie die höheren Ebenen Ihres Systems von den niedrigeren Ebenen entkoppeln, indem Sie sie in Bibliotheken unterteilen und Schnittstellen verwenden. Auf diese Weise können Sie untergeordnete Teile Ihres Systems ohne größere Nacharbeiten ersetzen.

Anstelle der übergeordneten Teile des Systems, die konkrete Instanzen der untergeordneten Klassen erstellen, kann beispielsweise ein IoC-Container verwendet werden, um die Erstellung von Objekten zu entkoppeln.

Die Inversion der Steuerung ist ein Entwurfsprinzip, das von Framework-Bibliotheken verwendet wird, mit denen das Framework die Kontrolle über die Anwendung wiedererlangen kann. Das heißt, ein Fensterframework kann den Anwendungscode zurückrufen, wenn bestimmte Ereignisse der Benutzeroberfläche auftreten. Martin Fowler verwendet den Begriff Hollywood-Prinzip wie in Rufen Sie uns nicht an, wir rufen Sie an . Die Entkopplung ist ein wichtiger Bestandteil der Umkehrung der Kontrolle.

Aber was hat ein IoC-Container mit der Umkehrung der Kontrolle zu tun? Um Martin Fowler zu zitieren :

Inversion of Control ist ein zu allgemeiner Begriff, und daher finden ihn die Leute verwirrend. Als Ergebnis vieler Diskussionen mit verschiedenen IoC-Befürwortern haben wir uns für den Namen Dependency Injection entschieden.

(Beachten Sie, dass Martin Fowler von Abhängigkeitsinjektion und nicht von Abhängigkeitsinversion spricht .)

Ein IoC-Container hilft bei der Implementierung der Abhängigkeitsinjektion, und ein besserer Begriff wäre möglicherweise der Abhängigkeitsinjektionscontainer. Der Name des IoC-Containers scheint jedoch zu bleiben. Die Abhängigkeitsinjektion ist eine wichtige Komponente bei der Abhängigkeitsinversion, aber die Verwendung von IoC-Containern für die Abhängigkeitsinjektion kann verwirrend sein, da die Inversion der Steuerung ein umfassenderes und allgemeineres Prinzip ist.

Sie weisen darauf hin, dass die Benennung nicht sehr konsistent ist, aber das sollte keine große Überraschung sein, da diese Begriffe unabhängig erfunden und verwendet wurden, obwohl sie sich überschneiden.

Martin Liversage
quelle
Ich stimme zu, obwohl ich den Begriff IoC-Container nicht verwenden würde, da er, wie Sie sagen, nicht wirklich korrekt ist. Ich denke, es ist unwichtig, hier dem (falschen) populären Namensschema zu folgen, da jeder, der das Prinzip von DI-Containern versteht, in der Lage sein sollte, die richtige Benennung zu verstehen.
Andrey Shchekin
49

Die Abhängigkeitsinjektion erreicht die Entkopplung durch Inversion of Control .

Boris Pavlović
quelle
4
ist es gedacht Inversion of Control oder ist es obwohl Dependency Inversion ? Ich würde sagen, es ist das letztere.
Robert Koritnik
1
-1 dies koppelt tatsächlich den Begriff "Abhängigkeitsinjektion" mit "Inversion der Kontrolle". Die Abhängigkeitsinjektion ist eine Entkopplungstechnik für sich.
Mauricio Scheffer
2
@Mauricio: Ich glaube nicht , Dependency Injection ist Entkoppelung oder Entkopplungstechnik überhaupt. DI bietet Mittel zum Koppeln entkoppelter Komponenten. Nicht umgekehrt.
Robert Koritnik
4
Hmmm ... Dependency Injection ist eine Form der Inversion of Control, die jedoch nicht unbedingt eine große Entkopplung bewirkt. Die Abhängigkeitsinversion bewirkt die Entkopplung und wird durch die Verwendung der Abhängigkeitsinjektion mit einer Inversion des Steuercontainers erleichtert. Hilfreich oder noch verwirrender?
Ben
Herrgott genug gesagt :( das war ein gutes Schreiben, Boris. Es gibt zu viele Möglichkeiten, alles zu tun. Das Wichtigste ist, dass es Vertrauen und Respekt innerhalb des Teams gibt. Aus reinster Sicht würden Software-Design-Prinzipien keinen Sinn haben und Bücher darüber, wenn Teamwork optimal war und Überzeugung in der eigenen Arbeit bestand.
Mike Socha III
24

Ich finde die folgende Erklärung von DIP im Wild- Artikel auf martinfowler.com einfach zu verstehen (hier DI = Dependency Injection, DIP = Dependency Inversion Principle, IoC = Inversion of Control):

Bei DI geht es darum, wie ein Objekt eine Abhängigkeit erhält. Wenn eine Abhängigkeit extern bereitgestellt wird, verwendet das System DI. Bei IoC geht es darum, wer den Anruf initiiert. Wenn Ihr Code einen Aufruf initiiert, handelt es sich nicht um IoC. Wenn der Container / das System / die Bibliothek den von Ihnen bereitgestellten Code zurückruft, handelt es sich um IoC.

Bei DIP handelt es sich dagegen um die Ebene der Abstraktion in den Nachrichten, die von Ihrem Code an das aufgerufene Objekt gesendet werden. (...) Bei DI geht es um Verkabelung, bei IoC um Richtung und bei DIP um die Form [des Objekts, von dem der Code abhängt].

Hidro
quelle
5
"Bei DI geht es um Verkabelung, bei IoC um Richtung und bei DIP um die Form [des Objekts, von dem der Code abhängt]." es war ein guter Satz;)
Amir Ziarati
Ich finde die Wortform im letzten Satz verwirrend. Es scheint nichts hinzuzufügen, was über das bereits Gesagte hinausgeht: Bei DIP geht es um Abstraktion. Ich würde sagen, bei IoC geht es um wer , bei DIP geht es um was und bei DI geht es um wie . Wer kontrolliert die Abhängigkeit? Was wird durch die Abhängigkeit abstrahiert? Wie wird die Abhängigkeit geliefert?
jaco0646
2

Abhängigkeitsinversion: Abhängig von Abstraktionen, nicht von Konkretionen.

Umkehrung der Kontrolle: Main vs Abstraction und wie der Main der Klebstoff der Systeme ist.

DIP und IoC

Dies sind einige gute Beiträge, die darüber sprechen:

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/

Daniel Andres Pelaez Lopez
quelle