Wie verschiebt die Abhängigkeitsinjektion nicht nur die Komplexität in eine separate Klasse?

9

Ich habe diese Woche versucht, das Typhoon-Framework für die Abhängigkeitsinjektion zu verwenden. Ich verstehe, dass das Trennen der Konstruktion von Objekten vorteilhaft ist, um beliebige Komponenten während des Unit-Tests durch Mocks zu ersetzen, und bisher habe ich allein davon Vorteile gesehen.

Aber ich kann nicht anders, als zu glauben, dass ich vor einer riesigen View-Controller-Klasse mit zehn Header-Importen jetzt eine riesige Factory-Klasse mit zehn Header-Importen hatte. Soll ich vermeiden, eine massive Fabrikklasse zu haben?

Sieger
quelle
6
In einem Jahrzehnt erwarte ich, dass DI die Bashing-Liste von Singleton übernimmt, diesmal jedoch aus guten Gründen. Es hat einige gute Verwendungszwecke, aber ich empfehle, die Auswirkungen sehr sorgfältig zu bewerten.
Balog Pal
5
Ich denke nicht, dass die Abhängigkeitsinjektion eine Möglichkeit ist, die Komplexität zu reduzieren, sondern implizite Abhängigkeiten (Verwendung globaler Symbole / freier Variablen) zugunsten expliziter Abhängigkeiten (Verwendung expliziter Parameter / gebundener Variablen) zu vermeiden. Die Komplexität ist also immer noch vorhanden, aber Sie sind gezwungen, damit umzugehen, weil Sie sie in Ihren Methoden- / Konstruktorsignaturen explizit angeben.
Giorgio
7
Beachten Sie, dass so ziemlich jedes System zum Organisieren von Code als "nur die Komplexität woanders hin verschieben" beschrieben werden kann. Es geht nicht darum, Komplexität zu beseitigen, sondern sie auf die logischste und nützlichste Weise zu organisieren.
1
Wenn Sie 50 Header importieren müssen, müssen Sie dies irgendwo tun. DI hilft Ihnen dabei, Ihren Code einfacher zu testen.
BЈовић
2
Wollen Sie damit sagen, dass sich Ihr Controller jetzt auf das Controlling und Ihre Header-Import-Factory auf den Header-Import konzentriert? Wie kann das jemals eine schlechte Sache sein, ob Sie ein DI-Framework verwenden oder nicht?
pdr

Antworten:

16

Abhängigkeitsinjektion hilft einfach zu definieren, wie ein Objekt über ein anderes abhängiges Objekt Bescheid weiß. Es wird Ihnen nicht helfen, die Gesamtkomplexität des Systems zu reduzieren. Wenn Sie vor DI zehn Importe benötigt haben, benötigen Sie danach noch zehn Importe. Der Unterschied besteht darin, dass sich diese Importe an einem Ort (einer Klasse) befinden, der sinnvoller ist (Fabrik, Hersteller usw.).

Indem Sie zulassen, dass Abhängigkeiten über einen Konstruktor oder eine Methode bereitgestellt werden, können Sie Ihrer Klasse flexibel ein anderes, aber immer noch gültiges abhängiges Objekt bereitstellen und den Zusammenhalt dieser Klasse erhöhen, indem Sie Bedenken beseitigen.

Es gibt mehrere Prinzipien, die ähnlich sind und häufig zusammen verwendet werden: Dependency Injection (DI), Inversion of Control (IoC) und das Dependency Inversion Principle (DIP)

Aus diesem Artikel http://martinfowler.com/articles/dipInTheWild.html

Bei DI geht es um Verkabelung, bei IoC um Richtung und bei DIP um Form

Seth M.
quelle
2
+1 für das letzte Zitat. Es ist die beste Klarstellung dieser drei Konzepte, die Menschen oft missverstehen.
Haylem
Der verlinkte Artikel oben ist wirklich hervorragend. Eine ausreichend tiefe und sehr klare Erklärung.
DemetriKots
10

Die Abhängigkeitsinjektion verringert nicht die Komplexität, erhöht jedoch die Verwaltbarkeit durch Trennung von Bedenken und verringerte Kopplung.

Aber ich kann nicht anders, als zu glauben, dass ich vor einer riesigen View-Controller-Klasse mit zehn Header-Importen jetzt eine riesige Factory-Klasse mit zehn Header-Importen hatte. Soll ich vermeiden, eine massive Fabrikklasse zu haben?

Du solltest "humorvolle" Klassen vermeiden, Punkt. Nehmen wir also an, Sie teilen den View Controller in kleinere, besser wartbare Klassen auf. Jetzt sind alle dafür verantwortlich, ihre Abhängigkeiten in den Griff zu bekommen. DI hilft Ihnen dabei, dieses Abhängigkeitsmanagement von all diesen Klassen in eine Factory- / Konfigurationsklasse zu verschieben, die nur für das Abhängigkeitsmanagement verantwortlich ist - siehe Prinzip der Einzelverantwortung. Und obwohl es sicherlich viel weniger "humorvoll" ist als der ursprüngliche Ansichts-Controller, haben Sie immer die Möglichkeit, es in kleinere Abhängigkeitsverwaltungsklassen aufzuteilen, die für verschiedene Teile der Anwendung verantwortlich sind, wenn es zu groß wird.

Michael Borgwardt
quelle
2

In Laienwörtern:

Die Abhängigkeitsinjektion bringt die Komplexität dahin, wo sie weniger Schaden anrichtet.

BEARBEITEN für @gnat: DI verschiebt die Komplexität nicht nur in eine separate Klasse, sondern dorthin, wo sie weniger Schaden verursacht.

Tulains Córdova
quelle
Wie beantwortet dies die gestellte Frage?
Mücke
@gnat hat eine Bearbeitung hinzugefügt, meine Antwort erklärt meiner Meinung nach, wie DI Komplexität nicht nur in eine separate Klasse verschiebt.
Tulains Córdova