Frage

Ich habe gelesen, eine Menge von Artikeln über Dependency Injection sowie sah eine Menge von videos, aber ich kann immer noch nicht meinen Kopf um ihn herum.Hat jemand eine gute Analogie zu erklären?

Ich beobachtete den ersten Teil der Herbst Agile screencast und noch war ein wenig verwirrt.

War es hilfreich?

Lösung

Analogy ? Ich werde ihm einen Schlag ... Ihre CD-Player Stereoanlage ohne CD mit Musik auf es nutzlos ist, ... (es ist abhängig von der CD). Wenn sie CD-Spieler mit der CD bereits gebaut, wäre es sehr schnell langweilig ...

So sie sie bauen, so dass Sie „injizieren“, um die CD kann, (auf dem es abhängig ist) in den Player. Auf diese Weise können Sie ein anderes jedes Mal, injizieren und „anders“ Verhalten (Musik) abhängig von bekommen, welche Sie injizieren.

Die einzige Voraussetzung ist, dass die CD muss kompatibel mit der Schnittstelle durch den Spieler festgelegt. (Sie können keine Blue-ray-Disk in einem 1992 CD-Player abgespielt werden.)

Andere Tipps

Die beste Analogie, die ich denken kann, ist, dass ein Mechaniker der Einstellung.

Ohne Dependency Injection, mieten Sie einen Mechaniker und der Mechaniker seine eigenen Werkzeuge bringt. Er kann lausig Werkzeuge hat, so kann er große Werkzeuge hat, so kann er einen Rohrschlüssel verwenden, wenn er eine Steckdose verwenden sollte. Sie wissen nicht, und mag es egal sein, solange er die Arbeit wird getan.

Mit Dependency Injection, Sie einen Mechaniker mieten, und Sie stellen ihn mit den Werkzeugen, die Sie ihn mit seiner Arbeit tun mögen. Sie erhalten zu wählen, was Sie als die besten oder am besten geeigneten Werkzeuge für die Arbeit, die Sie ihm zu tun Einstellung.

Betrachten Sie es als eine realisation des "Inversion of Control" - Muster.Ich denke, Ihr problem ist, Sie sind so daran gewöhnt, Sie nicht erkennen, es einfach ist das.

Lassen Sie uns am Anfang beginnen.

In den frühen Tagen von Programmen folgte einem bestimmten Pfad durch den code.Die Reihenfolge der aufgerufenen Funktionen gegeben wurde, die durch den Programmierer.

In der interaktiven Programmen, z.B.meist JEDEM Programm, können Sie nicht sagen, welche Funktion aufgerufen wird, zu welcher Zeit.Schauen Sie sich die GUI oder eine website.Man kann nicht sagen, zu welchem Zeitpunkt welche Schaltfläche oder den link geklickt wird.So die "Kontrolle" von dem, was gerade passiert, ist nicht mehr im Programm, es ist an einer äußeren Quelle.Die "Kontrolle" wurde invertiert.Die Funktion ist nicht mehr "handeln" sondern "hören".Denken Sie an die hollywood-Prinzip:"Rufen Sie uns nicht an, wir rufen dich".Ein listener ist ein gutes Beispiel für eine Realisierung dieser Muster.

IoC-realisiert von Funktionen oder "Methoden" in der "objektorientierten Welt" von heute.

"Dependency Injection" jetzt das gleiche bedeuten, aber nicht für "Methoden", die etwas tun,, aber für "Objekte", die halten Daten.

Die Daten werden nicht mehr Teil des Objekts halten.Es ist "eingefügt in das Objekt zur Laufzeit.Aufenthalt in hollywood, denken Sie an einen film-star, golf zu spielen, zu sprechen über die business, aber in Form zu halten, Sie sehnt sich nach unten, Minimierung Ihre Muskelmasse und deshalb ist Sie nur in der Lage zu transportieren, die den club zu einem Zeitpunkt.

So, auf dem Golfplatz Ihr Spiel würde stark davon abhängen, die einen Verein, Sie ist tragen.

Zum Glück für Sie, es gibt caddies, tragen eine ganze Reihe von clubs zu einer Zeit, und auch das wissen, was club zu verwenden, was Zeit.Jetzt ist Sie unabhängig von Ihrer begrenzten Möglichkeit zu tragen golf clubs."Denken Sie nicht an einen konkreten Verein zu tragen, wir kennen Sie alle und geben Sie das richtige zur richtigen Zeit".

Der film-star ist das Objekt und die golf-clubs sind die Mitglieder des Objekts machen können.Das ist dependency injection.

Vielleicht auf dem „Injektion“ Teil konzentrieren? Als ich diesen Begriff zu sehen, denke ich an Spritzen. Der Prozess der Abhängigkeiten einer Komponente auf die Komponente drängen gedacht als Injektion in das Bauteil werden kann.

Genau wie mit dem Körper, wenn es etwas, das es in der Art und Weise der Medizin muss (eine Komponente, die es braucht) Sie es in den Körper injizieren können.

In ihrem 2003 Javapolis Präsentation ( Dias ), Jon Tirsén & Aslak Hellesøy hatte eine amüsante Analogie zu einem Girl Objekt, das eine Boy küssen muss. Ich glaube ich zu erinnern, dass der BoyFactory manchmal als ‚Nachtclub‘ bekannt ist, aber das ist nicht in den Folien.

Eine andere Analogie: Lassen Sie uns sagen, Sie sind ein Entwickler und wann immer Sie möchten Sie Informatik Bücher vom Markt direkt bestellen - kennen Sie die Verkäufer und deren Preise. In der Tat Ihr Unternehmen könnte einen bevorzugten Verkäufer und Sie direkt kontaktieren. Das alles funktioniert gut, aber kann ein neuer Verkäufer sein bietet jetzt bessere Preise und Ihr Unternehmen will die ‚bevorzugten‘ Verkäufer ändern.

An diesem Punkt müssen Sie die folgenden Änderungen vornehmen - Aktualisiere die Kontaktdaten (und andere Sachen), um den neuen Anbieter zu verwenden. Sie legen noch den Auftrag direkt.

Nun betrachten wir einen neuen Schritt dazwischen einzuführen gibt es eine ‚Bibliothek‘ Offizier in der Firma, und Sie haben durch ihn zu gehen, um die Bücher zu bekommen. Zwar gibt es eine neue Abhängigkeit ist, Sie sind jetzt auf Änderungen an den Verkäufer gefeit: entweder der Verkäufer Änderungen Art der Bezahlung oder der Verkäufer selbst geändert wird, einfach Sie jetzt einen Auftrag an den Bibliothekar setzen und er bekommt für Sie die Bücher.

Von Head First Design Patterns :

  

Denken Sie daran, soll Code geschlossen werden (geändert), wie die Lotusblume am Abend, noch offen (auf Verlängerung), wie die Lotusblume am Morgen

Ein DI-fähiges Objekt kann durch die Injektion von Verhaltensweisen in anderen Klassen definiert konfiguriert werden. Die ursprüngliche Objektstruktur muss nicht ändern, um viele Variationen zu erstellen. Die Injektion kann, indem er eine Klasse Anfrage andere Arbeiter-Klassen in seinem Konstruktor explizit gemacht werden, oder es kann offensichtlich sein, wenn diese in dynamischen Sprachen wie Python mit monkeypatching.

eine Analogie einer Person-Klasse verwenden, können Sie einen grundlegenden menschlichen Rahmen nehmen, ist es eine Reihe von Organen passieren, und beobachten Sie es entwickeln. Die Person nicht direkt wissen, wie die Organe arbeiten, aber ihr Verhalten auf eine erwartete Schnittstelle bestätigen und die körperliche und geistige Manifestation des Besitzers beeinflussen.

Taschenspielerei ! Was Sie vielleicht denken, dass Sie heimlich manipuliert werden sehen kann oder ersetzt werden.

Das Leben ist voll von Dependency Injection Analogien:

  • Drucker - Patrone
  • Digitalgerät - Batterie
  • Schreiben - Stempel
  • Musiker - Instrument
  • Bus - Fahrer
  • Krankheit - Pille

Das Wesen der Inversion of Control (davon Dependency Injection eine Implementierung ist) ist die Trennung von der Verwendung eines Objekt aus der Verwaltung davon.

Die Analogie / example ich benutze, ist ein Motor. Ein Motor erfordert Kraftstoff betrieben werden, das heißt es ist depdendent auf Kraftstoff. Jedoch kann der Motor nicht für den Kraftstoff verantwortlich, die er braucht. Es ist einfach ‚fragt‘ für Kraftstoff, und es ist (in der Regel in einem Auto durch eine Kraftstoffpumpe) vorgesehen ist.

Die Analogie beginnt brechen, wenn man zu tief blicken, dass ein Motor fragt nicht für Kraftstoff, wird es durch eine Art von Management-Elemente gegeben, wie eine ECU. Man könnte in der Lage, die ECU zu einem Container zu vergleichen, aber ich bin nicht sicher, wie gültig ist dies.

Ihr Projektmanager fragt Sie eine App schreiben.

Sie könnten nur einige Code schreiben, basierend auf Ihrer Berufserfahrung so weit, aber es ist unwahrscheinlich zu sein, was Ihr PM will.

Besser wäre es, wenn Sie Ihre PM Abhängigkeit injiziert Sie mit sagen eine Spezifikation für die App. Jetzt ist Ihr Code wird auf die Spezifikation verwandt sein er Ihnen gibt.

Besser, wenn Sie gesagt wurde, wo der Quell-Repository wurde.

Besser, wenn Du gesagt wurde, was die Tech-Plattform ist.

Besser, wenn man Ihnen sagen, wenn dies getan werden muß.

Etc ..

Ich glaube, eine große Analogie ist ein sechs-Jahr-alten mit einem lego set.

Sie möchten, dass Ihre Objekte wie die lego-Steine.Jede ist unabhängig von allen anderen, und doch bietet eine klare Schnittstelle für die Verbindung zu den anderen.Wenn Sie verbinden Sie zusammen, es ist nicht wirklich wichtig, genau, die zwei Steine, die du Haken miteinander, so lange wie Sie haben eine passende Schnittstelle.

Ihre dependency injection-framework ist wie die sechs-Jahr-alten.Er folgt den Anweisungen (d.h., Ihre config-Datei, Anmerkungen, etc.) verbinden, bestimmte Steine zusammen in einer bestimmten Weise zu machen, ein bestimmtes Modell.

Natürlich, da die Steine Schnittstellen sind ziemlich verallgemeinert, Sie können gehen zusammen in viele verschiedene Möglichkeiten, so ist es leicht zu kommen mit neue Sätze von Anweisungen, die die sechs-Jahr-alten verwenden können, um ein völlig anderes Modell aus der gleichen Steine.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top