Wie erhöht die abhängige Einspritzung die Kopplung?

32

Auf der Wikipedia-Seite zur Abhängigkeitsinjektion erfahren wir im Abschnitt zu den Nachteilen Folgendes:

Die Abhängigkeitsinjektion erhöht die Kopplung, indem der Benutzer eines Subsystems die Anforderungen dieses Subsystems erfüllen muss.

mit einem Link zu einem Artikel gegen Abhängigkeitsinjektion .

Die Abhängigkeitsinjektion bewirkt, dass eine Klasse die Schnittstelle anstelle der konkreten Implementierung verwendet. Das sollte zu einer verminderten Kopplung führen , nicht wahr?

Was vermisse ich? Wie erhöht die Abhängigkeitsinjektion die Kopplung zwischen Klassen?

BЈовић
quelle
2
Ich bin mir nicht sicher, wer diese Liste der Nachteile geschrieben hat, aber ich würde es mit einem Körnchen Salz nehmen. Ich habe zum Beispiel gesehen, wie DI die Größe einer Codebasis um 2/3 reduzierte, indem eine Tonne redundanten Einrichtungscodes eliminiert wurde.
Rob
@RobY Ich habe meistens Factory verwendet, um die Abhängigkeit zu injizieren, und meine Erfahrung ist, dass es die Codegröße erhöht, aber das Testen vereinfacht.
Freitag,
Versuchen Sie es mit einer Alternative wie Registry oder Context Passing;) Oder verwenden Sie Code, der nur Objekte instanziiert und dann deren Eigenschaften aus config abruft. Hauptsächlich spreche ich über den Unterschied zwischen jetzt und vor 15 Jahren.
Rob
Verwandte: stackoverflow.com/a/9503612/264697 . In der Antwort von Mark Seemann wird erläutert, wie die Gesamtkopplung mithilfe der Abhängigkeitsinjektion reduziert wird.
Steven

Antworten:

42

Also, was fehle ich?

Die Abhängigkeitsinjektion verringert die Kopplung zwischen einer Klasse und ihrer Abhängigkeit. Es erhöht jedoch die Kopplung zwischen einer Klasse und ihrem Konsumenten (da der Konsument mehr Informationen benötigt, um sie zu erstellen) und der Abhängigkeit und ihrem Konsumenten (da der Konsument die zu verwendende Abhängigkeit kennen muss).

Sehr oft ist dies ein guter Kompromiss. Die Klasse sollte die Details zu ihren Abhängigkeiten über eine Schnittstelle hinaus nicht kennen und es sollte in der Verantwortung der Anwendung liegen, bestimmte Codebits miteinander zu verknüpfen.

Telastyn
quelle
Richtig, die Kopplung wird in eine Richtung verringert und in eine andere Richtung erhöht.
Paul Draper
Aber der Verbraucher schafft es nicht; Das ist eher der Punkt.
Casey
@emodendroket - Eh? Mit Inversion of Control kann der Konsument es nicht erstellen. Die Abhängigkeitsinjektion ist dazu orthogonal.
Telastyn
Nun, Sie machen eine Unterscheidung, mit der ich nicht vertraut bin, da die Begriffe normalerweise synonym verwendet werden.
Casey
22

Angenommen, Sie haben ein Subsystem S, das von einer Datenbankverbindung abhängt D. Ohne Abhängigkeitsinjektion gibt es eine relativ enge Kopplung zwischen Sund D, da Sbeide wissen müssen, wie man es benutztD und wie sie zu erstellen sind. Der Rest des Systems kann sich dieser Abhängigkeit zwischen Sund jedoch glücklicherweise nicht bewusst sein D.

Mit der Abhängigkeitsinjektion wird die Kopplung zwischen Sund Dlockerer, weil Sie aus Sdem Wissen entfernen, wie man eine D. Smuss nur wissen, wie man es benutzt. Die erhöhte Gesamtkopplung ergibt sich aus der Tatsache, dass andere Teile des Systems nun wissen müssen Dund möglicherweise wissen müssen, wie sie eines erstellen. Das Ausmaß dieser Zunahme der Kopplung hängt davon ab, wie stark die Abhängigkeit davon istD injiziert wird S:

  • Mit Konstruktorspritze der Schöpfer vonS eine Abhängigkeit von Dund möglicherweise das Wissen, wie man eine erstellt.
  • Bei der Injektion auf Methodenebene benötigt jeder Aufrufer einer Methode, Sdurch die eine DInjektion erfolgt, eine Abhängigkeit vonD und möglicherweise das Wissen, wie erstellt wird.

In beiden Fällen müssen die Anzahl der Klassen, die von Dder Erstellung abhängen , und das Wissen darüber, wie ein DStill erstellt wird, irgendwo im System vorhanden sein. Dies führt insgesamt zu einer Zunahme der Kopplung.

Bart van Ingen Schenau
quelle
Ok, es macht Sinn für Konstruktor- und Setter-Injection. Verwendet man jedoch ein Factory- oder Strategiemuster, wird die Erstellung dorthin verschoben, und die Klasse verwendet nur das injizierte Objekt. Oder ist das nicht eine Abhängigkeitsinjektion (nur Inversion der Kontrolle)?
B 4овић
Selbst mit Fabrik Injektion, der Schöpfer der SBedürfnisse einer Fabrik zu liefern D, was bedeutet es , dass wissen muss SVerwendungen D(oder zumindest einige Schnittstelle davon).
Idan Arye
7

Ich bin absolut anderer Meinung, dass es die Kopplung erhöht.

Ohne Abhängigkeitsinjektion besteht eine enge Kopplung zwischen einem Teilsystem und der konkreten Implementierung der Abhängigkeit.

Mit der Abhängigkeitsinjektion haben Sie das Subsystem von der Implementierung der Abhängigkeit abgekoppelt.

Das Argument, dass es die Kopplung zwischen dem Verbraucher und diesem Teilsystem verstärkt, ist SEHR fraglich, da dies impliziert, dass der Verbraucher jetzt eng an die vom Teilsystem geforderte Abhängigkeit gekoppelt ist. Alles was es bedeutet ist, dass Sie eng gekoppelten Code schreiben, der Ihren Konsumenten an die Abhängigkeit koppelt. Idealerweise ist ALLER Code entkoppelt.

Konstruktor-Injektion:

Die Abhängigkeitsauflösung wird von einem Abhängigkeitsinjektionscontainer oder einer Fabrik übernommen. Der Verbraucher kann eine konkrete Implementierung des Teilsystems aus dem Abhängigkeitseinspritzbehälter oder einer Fabrik erhalten.

Der Verbraucher muss nicht wissen, wie der Konstruktor des Teilsystems überhaupt aussieht. Es besteht keine Kopplung an die Subsystemabhängigkeit.

Methode Injection:

Entspricht der Konstruktorinjektion, mit der Ausnahme, dass der Konsument jetzt eine konkrete Instanz der Abhängigkeit aus dem Container oder der Fabrik abrufen muss (oder sogar die Methode / den Konstruktor injizieren lassen muss) und sie in die Methode injizieren muss. Auch hier ist der Verbraucher nicht an eine konkrete Umsetzung der Abhängigkeit gekoppelt.

TL; DR Der schlimmste Fall für die Abhängigkeitsinjektion in einem Subsystem ist, dass die Kopplung auf Consumer-Code verschoben wird. ES GIBT KEINE ERHÖHUNG DER KUPPLUNG.

Der beste Fall ist, dass alle Systeme jetzt lose gekoppelt sind und die Abhängigkeitsinjektion über Abhängigkeitsinjektionsbehälter oder -fabriken gesteuert wird.

Falke
quelle