Warum war das Abhängigkeitsinjektionsmuster nicht in der Vierergruppe enthalten?

37

Warum wurde das Dependency Injection Muster in der nicht incluided Viererbande ? Hat die GOF vor dem Datum weitverbreitete automatisierte Tests durchgeführt? Wird die Abhängigkeitsinjektion jetzt als Kernmuster betrachtet?

Tom Squires
quelle
18
.. weil "Dependency Injection" kein Muster ist!
Dipan Mehta
1
@ DipanMehta stackoverflow.com/questions/823387/…
Tom Squires
14
Alles, was wiederholt wird, bildet ein Wiederholungsmuster. Alle Designelemente (die keine einzigartigen, verrückten Ideen sind) sind "Muster".
S.Lott,
3
Diese langen Antworten sind wahrscheinlich irreführend, da sie die Frage irgendwie bestätigen. Wie bereits erwähnt, ist die Abhängigkeitsinjektion kein Entwurfsmuster. Dies ist ein "Mechanismus" für die Objektinstanziierung, der normalerweise vom Framework verwaltet wird.
Nazar Merza
1
Die Abhängigkeitsinjektion ist ein Muster . Es widerspricht dem Service Locator-Muster. Lesen Sie Fowler , der den Begriff geprägt hat. Ich habe absolut keine Ahnung, wie viele Leute so einen Unsinn verärgert haben.
James

Antworten:

101

Ich war Herausgeber der Zeitschrift Software Development , als das Buch „Gang of Four“ herauskam, und ich kann mit voller Zuversicht sagen, dass Unit-Tests 1994, als Design Patterns ursprünglich veröffentlicht wurde, keine weit verbreitete Praxis waren .

Im Jahr 1994 war C ++ die am häufigsten verwendete objektorientierte Sprache, und die meisten Programmierer kamen aus einem C-Hintergrund. Eines der Dinge, die Menschen einfach nicht hatten, ist die Idee von Hunderten oder Tausenden von Einstiegspunkten in Ihr Programm. Du hast über das nachgedacht main(). Wenn Sie an einem großen Projekt gearbeitet haben, verfügen Sie möglicherweise über ein (normalerweise recht umfangreiches) Makefile, um ein modulbasiertes Programm zu erstellen. Aber "Unit-Testing"? Starten eines Prozesses, Erstellen des erforderlichen Speicherkontexts, Ausführen und Herunterreißen des Prozesses auf Methodenbasis ? Das war sehr radikal.

Java hat die Programmierung mit mehreren Einstiegspunkten deutlicher gemacht. Zur Zeit des ursprünglichen Dot-Com-Booms war Unit-Testing eine bekannte Technik, aber es war wirklich JUnit (circa 2001?), Das dazu führte, dass es sich entzündete und zu einer universellen Praxis wurde.

Obwohl Strategie und das allgemeine Konzept der Programmierung einer Schnittstelle Teil von GoF und dem Zeitgeist Mitte der 90er Jahre waren, kam die Idee der Injektion erst spät auf die Party (circa '03 -'05?). Ehrlich gesagt, meine grauen Haare sind immer noch ziemlich zweifelhaft in Bezug auf diesen Aspekt von DI ("Verschwinde von meinem Rasen, du verdammte Konfigurationsdateien!").

Larry OBrien
quelle
17
Ich bedaure, dass ich für eine so aufschlussreiche Antwort nur eine Stimme übrig habe.
@ Larry OBrien: Das Scannen nach konventionellen Registrierungen vereinfacht den Konfigurationscode erheblich und eliminiert praktisch die XML-Konfiguration in IOC-Containern.
Quentin-Starin
4
Ich möchte hinzufügen, dass die Abhängigkeitsinjektion im Kern überhaupt nicht von Konfigurationsdateien abhängt. Sie können alles von Hand erledigen, was die Verwendung sehr einfach macht und dennoch ein sehr flexibler Ansatz ist.
Marco-Fiset
31

Sie nannten es Strategie .

Ihre Strategie scheint alle Merkmale der Abhängigkeitsinjektion ohne den komplex klingenden Namen zu haben.

S.Lott
quelle
16
-1. Es tut uns leid! Das Strategiemuster hat nichts mit Abhängigkeitsinjektion zu tun.
Dipan Mehta
14
@Dipan: Bevor Sie dies ablehnen, sollten Sie sich die Antwort fünf Minuten lang überlegen.
Doc Brown
6
Es ist wahr, dass die Abhängigkeitsinjektion dem Strategiemuster sehr ähnlich ist, aber wenn die Leute die Abhängigkeitsinjektion sagen, meinen sie normalerweise die Umkehrung der Kontrolle, die sich meiner Meinung nach viel stärker von der Strategie (insbesondere dem IoC-Container) unterscheidet.
MattDavey
8
DI ist eher ein Schöpfungsmuster. Es schafft und injiziert Strategien. Zu sagen, es ist eine Strategie, ist nur die halbe Wahrheit. DI ist eher ein Mikrokernel-Muster! Ich kann nicht glauben, dass die Leute dem zustimmen. Strategie ist eher ein Merkmal guter DI, keine Notwendigkeit.
Falcon
0

Ich denke, dass die Abhängigkeitsinjektion relevanter ist, wenn die Implementierung in Ebenen getrennt wird. Ein weiterer Bereich, in dem wir uns mit der Abhängigkeitsinjektion befassen, sind Unit-Tests. Und Ihr Vorschlag vor dem Date scheint korrekt zu sein. Wenn die Bande 2012 Muster sammelt und trennt, wird es definitiv eine Abhängigkeitsinjektion geben.

Strategie könnte in Diskussionen auftauchen, aber Strategie spricht nicht über Abhängigkeitsinjektion. Wenn Sie jedoch ein Strategiemuster in einem einzelnen Projekt oder einer DLL verwenden (alle Klassen und Schnittstellen verbleiben in einem Projekt), scheint es, dass wir eine Abhängigkeitsinjektion durchführen. In der Tat sind wir nicht.

Wenn nun die Klassen und Interfaces, die im Strategiemuster erwähnt werden, in verschiedenen Projekten oder Ebenen getrennt sind, müssen WIR Abhängigkeitsinjektionstechniken verwenden. Wir könnten Unity-Konfigurationsdateien verwenden (allerdings ist keine Laufzeitänderung möglich). Das Strategiemuster sagt jedoch nicht aus, wie eine Abhängigkeit injiziert werden soll.

Wenn es ein Muster gibt, das der Abhängigkeitsinjektion sehr ähnlich ist, handelt es sich um das Abstract Factory-Methodenmuster. Dieses Muster könnte in einem Strategiemuster verwendet werden, um Abhängigkeiten zu injizieren.

Blaue Wolken
quelle
2
Dies beantwortet die Frage nicht. Bitte lesen Sie die ursprüngliche Frage, anstatt auf andere Antworten zu antworten :)
Andres F.
-4

Die Antwortstrategie ist zu 100% richtig. Ich habe dafür gestimmt, kann mich aber dazu äußern.

"Mit Strategy kann der Algorithmus unabhängig von den Kunden variieren, die ihn verwenden. [1] Strategy ist eines der Muster in dem einflussreichen Buch Design Patterns von Gamma et al., Das das Konzept der Verwendung von Mustern zur Beschreibung von Software-Design bekannt machte."

Ein Entwurfsmuster ist nicht von seiner Verwendung abhängig. Die Abhängigkeitsinjektion wird mithilfe des Strategiemusters implementiert. Wenn wir jedes Muster basierend auf dem Anwendungsfall benennen würden, müssten wir viele Muster umbenennen.

Das Repository-Muster ist kein neues Muster, sondern das Vorlagenmuster.

"Bei der Vorlagenmethode dieses Entwurfsmusters können ein oder mehrere Algorithmusschritte von Unterklassen überschrieben werden, um unterschiedliche Verhaltensweisen zuzulassen und gleichzeitig sicherzustellen, dass der übergeordnete Algorithmus weiterhin eingehalten wird."

Oft sind die Muster mehrere kombinierte Muster, die beispielsweise als MVC-Muster bezeichnet werden.

Der GOF hatte keine Schnittstellen zu den verwendeten Pure Abstract-Klassen und nutzte auch die Fähigkeit von C ++, von mehr als einer Klasse zu erben.

Trainer David
quelle
1
Der Zweck eines Musters ist absolut wichtig für die Unterscheidung. Unter den GoF-Mustern sind Adapter und Proxy gute Beispiele - sie haben dieselbe Form, aber einen unterschiedlichen Zweck. Ich würde auch Ihrer Behauptung widersprechen, dass DI mithilfe der Strategie implementiert wird. Strategy hat einen spezifischeren Zweck und eine spezifischere Verwendung des konfigurierten Objekts. Es ist also vernünftiger zu sagen, dass Strategy mit DI implementiert wird.
Jules