Hervorragende Erklärung der Abhängigkeitsinjektion (Inversion of Control)

Ich habe viele Erklärungen zu Dependency Injection oder DI (früher bekannt als Inversion of Control) und dem damit verbundenen Hollywood-Prinzip gelesen ("Rufen Sie uns nicht an, wir rufen Sie an."). Sie alle sind in der Regel unklar, entweder weil sie sich sofort mit sehr detaillierten Erklärungen befassen oder weil sie die Erklärung spezifisch an eine bestimmte Technologie binden. So dass entweder das Muster verloren geht oder seine Einfachheit ist. Hier ist die klarste Erklärung, die ich gefunden habe - der Kürze halber leicht bearbeitet (aus dem sehr guten Spring in Action, 2. Aufl. Von Craig Walls):

"Jede nicht triviale Anwendung besteht aus zwei oder mehr Klassen, die zusammenarbeiten, um eine Geschäftslogik auszuführen. Traditionell ist jedes Objekt dafür verantwortlich, seine eigenen Verweise auf die Objekte zu erhalten, mit denen es zusammenarbeitet (seine Abhängigkeiten) Objekte erhalten ihre Abhängigkeiten zum Zeitpunkt der Erstellung von einer externen Entität, die jedes Objekt im System koordiniert. Mit anderen Worten, Abhängigkeiten werden in Objekte eingefügt. "

Ich finde das sehr klar.

Die Abhängigkeitsinjektion wurde ursprünglich als Inversion of Control (IoC) bezeichnet, da die normale Steuerungssequenz darin besteht, dass das Objekt die Objekte findet, von denen es abhängig ist, und sie dann aufruft. Hier ist dies umgekehrt: Die Abhängigkeiten werden beim Erstellen an das Objekt übergeben. Dies zeigt auch das Hollywood-Prinzip bei der Arbeit: Rufen Sie nicht nach Ihren Abhängigkeiten, wir geben sie Ihnen, wenn wir Sie brauchen.

Wenn Sie DI nicht verwenden, fragen Sie sich wahrscheinlich, warum es eine große Sache ist. Es bietet einen entscheidenden Vorteil: lose Kupplung. Objekte können unabhängig von anderen Objekten hinzugefügt und getestet werden, da sie nur von dem abhängen, was Sie ihnen übergeben. Wenn Sie herkömmliche Abhängigkeiten verwenden, müssen Sie zum Testen eines Objekts eine Umgebung erstellen, in der alle Abhängigkeiten vorhanden und erreichbar sind, bevor Sie es testen können. Mit DI ist es möglich, das Objekt isoliert zu testen und Scheinobjekte für diejenigen zu übergeben, die Sie nicht erstellen möchten oder müssen. Ebenso wird das Hinzufügen einer Klasse zu einem Projekt erleichtert, da die Klasse in sich geschlossen ist, wodurch der "große Haarball" vermieden wird, zu dem sich große Projekte häufig entwickeln.

Die Herausforderung von DI besteht darin, eine gesamte Anwendung damit zu schreiben. Ein paar Klassen sind keine große Sache, aber eine ganze App ist viel schwieriger. Für ganze Anwendungen möchten Sie häufig ein Framework, um die Abhängigkeiten und die Interaktionen zwischen Objekten zu verwalten. DI-Frameworks werden häufig von XML-Dateien gesteuert, mit denen festgelegt wird, was an wen und wann übergeben werden soll. Spring ist ein Full-Service-Java-DI-Framework. Andere leichtere DI-Frameworks sind NanoContainer und der noch leichtere PicoContainer.

Die meisten dieser Frameworks bieten gute Tutorials, die Anfängern helfen, sich zurechtzufinden.

Diese Geschichte "Ausgezeichnete Erklärung der Abhängigkeitsinjektion (Inversion of Control)" wurde ursprünglich von JavaWorld veröffentlicht.