Frage

Inversion of Control (oder IoC) kann verwirrend sein, wenn es das erste mal begegnet.

  1. Was ist es?
  2. Welches problem gilt es zu lösen?
  3. Wann ist es angebracht, zu verwenden und Wann nicht?
War es hilfreich?

Lösung

Die Inversion of Control (IoC) und Dependency Injection (DI), Muster sind alle über das entfernen von Abhängigkeiten aus Ihrem code.

Zum Beispiel, sagen, dass Ihre Anwendung über eine text-editor-Komponente und Sie möchten die Rechtschreibprüfung.Ihr standard-code würde wie folgt Aussehen:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

Was wir hier getan haben erstellt eine Abhängigkeit zwischen der TextEditor und die SpellChecker.In einer IoC-Szenario würden wir stattdessen so etwas wie dies tun:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

In der ersten code-Beispiel, das wir instanziieren SpellChecker (this.checker = new SpellChecker();), was bedeutet, dass die TextEditor Klasse hängt direkt von der SpellChecker Klasse.

In der zweiten code-Beispiel erstellen wir eine Abstraktion, durch die das SpellChecker Klasse in Abhängigkeit TextEditor Konstruktor-Signatur (nicht initialisieren Abhängigkeit in der Klasse).Dies ermöglicht es uns aufrufen, die Abhängigkeit dann übergeben es an die TextEditor-Klasse, zum Beispiel so:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

Jetzt den client erstellen TextEditor Klasse hat die Kontrolle über die SpellChecker - Implementierung zu verwenden, da wir die Injektion der Abhängigkeit der TextEditor - Signatur.

Dies ist nur ein einfaches Beispiel, es gibt eine gute Artikel-Serie von Simone Busoli, das erklärt es ausführlich.

Andere Tipps

Inversion of Control ist was Sie erhalten, wenn Sie Ihr Programm Rückrufe, z.B.wie ein gui-Programm.

Zum Beispiel, in einer alten Schule Menü, haben Sie vielleicht:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

dabei Steuern die Fluss von Benutzer-Interaktion.

In einem GUI-Programm oder somesuch, sondern wir sagen:

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

So, jetzt Steuerelement invertiert...anstatt den computer akzeptieren Benutzereingaben in einer festen Reihenfolge, die der Benutzer steuert die Reihenfolge, in der die Daten eingegeben, und wenn die Daten in der Datenbank gespeichert wird.

Im Grunde, alles mit einem event-loop, Rückrufe, oder führen Sie auslöst, fällt in diese Kategorie.

Was ist Inversion of Control?

Wenn Sie befolgen Sie diese einfachen zwei Schritte, die Sie getan haben, inversion of control:

  1. Separate was-to-do-Teil aus wenn-to-do-Teil.
  2. Sicherstellen, dass wenn Teil kennt wenig wie möglich über was Teil;und Umgekehrt.

Es gibt verschiedene Techniken möglich für jeden dieser Schritte, basierend auf der Technologie/die Sprache, die Sie verwenden für Ihre Anwendung.

--

Die inversion Teil des IoC (Inversion of Control) ist die verwirrende Sache;da inversion ist ein relativer Begriff.Der beste Weg, um zu verstehen IoC ist, zu vergessen, dass Wort!

--

Beispiele

  • Event-Handling.Event-Handler (was-zu-tun-Teil) -- auslösen von Ereignissen (when-to-do-Teil)
  • Schnittstellen.Component-client (wenn-zu-tun-Teil) -- Component-Interface-Implementierung (was-zu-tun-Teil)
  • xUnit-Leuchte.Setup-und TearDown (was-zu-tun-Teil) -- xUnit-frameworks Aufrufe Setup am Anfang und Abbau am Ende (when-to-do-Teil)
  • Template-Methode design-Muster.template-Methode, wenn Sie-zu-Teil-primitiv, Unterklasse der Umsetzung, was-zu-tun-Teil
  • DLL-container-Methoden im COM.DllMain, DllCanUnload, etc (was-zu-tun-Teil) -- COM/OS (when-to-do-Teil)

Inversion von Steuerelementen wird über die Trennung von Bedenken.

Ohne IoC:Sie haben eine laptop computer und Sie versehentlich brechen die Bildschirm.Und verdammt, Sie finden die gleiche Modell laptop-Bildschirm ist nirgendwo in den Markt.So sind Sie stecken.

Mit IoC:Sie haben eine desktop computer und Sie versehentlich brechen die Bildschirm.Sie finden Sie können nur greifen fast jeden desktop-monitor aus dem Markt, und es funktioniert gut mit Ihrem desktop.

Ihrem desktop erfolgreich implementiert IoC in diesem Fall.Es akzeptiert eine Vielzahl Typ von Bildschirmen, während der laptop nicht, es braucht einen bestimmten Bildschirm zu bekommen behoben.

Inversion of Control (oder IoC), ist über erste Freiheit (Sie heiraten, und Sie verloren Freiheit und Sie kontrolliert.Sie ist geschieden, Sie müssen nur implementiert, Inversion of Control.Das ist es, was wir als "entkoppelt".Gute computer-system schreckt einige sehr enge Beziehung.) mehr Flexibilität (Die Küche, in Ihrem Büro dient nur sauberes Leitungswasser, das ist Ihre einzige Wahl, wenn Sie wollen, um zu trinken.Ihr Chef umgesetzt Inversion of Control, durch die Einrichtung einer neuen Kaffeemaschine.Jetzt bekommen Sie die Flexibilität zu wählen, Tippen Sie entweder Wasser oder Kaffee.) und weniger Abhängigkeit (Ihr partner hat einen job, den Sie don ' T haben einen job, der Sie finanziell abhängig auf Ihren partner, so dass Sie kontrolliert werden.Finden Sie einen job, Sie implementiert haben, Inversion of Control.Gute computer-system unterstützt in-Abhängigkeit.)

Wenn Sie einen desktop-computer verwenden, haben Sie geschuftet (oder sagen wir, gesteuert).Sie haben zu sitzen vor einem Bildschirm und schaue es an.Mit der Tastatur eingeben und mit der Maus navigieren.Und eine schlecht geschriebene software kann der Sklave Sie noch mehr.Wenn Sie ersetzen Sie Ihren desktop mit einem laptop, dann, Sie etwas invertiert Steuerung.Sie können leicht nehmen Sie es und bewegen.So, jetzt können Sie Steuern, wo Sie sind mit Ihrem computer, anstatt Ihren computer zu Steuern.

Durch die Implementierung von Inversion of Control, ein software - /Objekt Verbraucher bekommen mehr Steuerelemente/Einstellungen über die software/Objekte, anstatt kontrolliert zu werden oder mit weniger Optionen.

Mit den oben genannten Ideen im Kopf.Wir vermissen noch ein wichtiger Teil des IoC.In dem Szenario des IoC, die software/Objekt Verbraucher ist ein ausgereiftes framework.Das bedeutet, dass der code, den Sie erstellt haben, nicht genannt, selbst.Lassen Sie uns nun erklären, warum dieser Weg funktioniert besser für eine web-Anwendung.

Angenommen, Ihr code ist eine Gruppe von Arbeitern.Sie brauchen, um ein Auto zu bauen.Diese Arbeiter einen Platz benötigen und Werkzeuge (software framework), um das Auto aufzubauen.Ein traditionelle software-framework wird wie eine garage mit vielen Extras.So dass die Arbeiter benötigen, um einen plan zu machen, sich selbst und verwenden Sie die Werkzeuge, um das Auto aufzubauen.Gebäude ein Auto ist nicht ein einfaches Geschäft, es wird sehr schwer für die Arbeiter zu planen und zu kooperieren richtig.Ein moderne software-framework ist wie ein modernes Auto Fabrik mit allen Einrichtungen und Führungskräfte im Ort.Die Arbeitnehmer müssen sich nicht um irgendeinen plan, die Manager (Teil der Rahmen, Sie sind die klügsten Leute, und die meisten ausgefeilten plan) koordiniert, so dass die Arbeitnehmer wissen, wenn Sie Ihre Arbeit machen (framework ruft Ihr code).Der Arbeitnehmer muss nur flexibel genug sein, verwenden Sie alle tools, die Führungskräfte geben Sie (mithilfe von Dependency Injection).

Obwohl die Arbeiter geben Sie die Steuerung, die Verwaltung, das Projekt auf der top-Ebene der Führungskräfte (der Rahmen).Aber es ist gut, ein paar Profis helfen.Dies ist das Konzept der IoC wirklich kommen.

Moderne Webanwendungen mit MVC-Architektur hängt von den Rahmenbedingungen zu tun, URL-Routing und Controller setzen in Ort für Rahmen aufrufen.

Dependency Injection und Inversion der Steuerung verbunden sind.Dependency Injection ist am micro Ebene und Inversion of Control ist an der makro Ebene.Sie haben zu Essen, jeden Bissen (implementieren DI), um bis zum Ende einer Mahlzeit (Umsetzung IoC).

Vor der Verwendung von Inversion of Control, sollten Sie sich der Tatsache bewusst, dass es hat seine vor-und Nachteile, und Sie sollten wissen, warum Sie es verwenden, wenn Sie tun so.

Vorteile:

  • Ihr code wird entkoppelt, so können Sie leicht exchange Implementierungen einer Schnittstelle mit alternativen Implementierungen
  • Es ist ein starker motivator für die Kodierung gegen interfaces statt Implementierungen
  • Es ist sehr einfach zu schreiben unit-tests für Ihren code, da kommt es auf nichts anderes als die Objekte, die es annimmt, in seinem Konstruktor/setter und Sie können leicht initialisieren Sie Sie mit der rechten objects in isolation.

Nachteile:

  • IoC-nicht nur kehrt der Kontrollfluss im Programm, die es auch Wolken deutlich.Das heißt, Sie können nicht mehr nur Lesen Ihre Codes und springen von einem Ort zum anderen, weil die verbindungen, die normalerweise in Ihrem code nicht in der code nicht mehr.Stattdessen ist es in XML-Konfigurationsdateien oder Anmerkungen und in den code der IoC-container, interpretiert diese Metadaten.
  • Es entsteht eine neue Klasse von bugs, wo man die XML-config oder Ihr Anmerkungen falsch und Sie verbringen eine Menge Zeit, herauszufinden, warum Ihr IoC-container injiziert eine null-Referenz in einem Ihrer Objekte unter bestimmten Bedingungen.

Ich persönlich sehe die stärken des IoC und ich mag Sie wirklich, aber ich neigen dazu, zu vermeiden, IoC, Wann immer möglich, denn es stellt Ihre software in eine Sammlung von Klassen, die nicht mehr bilden ein "echtes" Programm, sondern nur etwas, das muss zusammen gestellt werden durch XML-Konfiguration oder die annotation von Metadaten und fallen würde (und fällt) auseinander, ohne es.

  1. Wikipedia-Artikel.Zu mir, inversion of control, drehen Sie Ihr sequentiell geschriebene code und drehen es in eine delegation Struktur.Statt in Ihrem Programm explizit die alles kontrollieren, das Programm legt eine Klasse oder Bibliothek mit bestimmten Funktionen, die aufgerufen werden, wenn bestimmte Dinge passieren.

  2. Es löst die code-Duplizierung.Zum Beispiel, in den alten Tagen, Sie würden das manuelle schreiben Sie Ihre eigene event-loop, der Abfrage der system-Bibliotheken, die für neue Ereignisse.Heutzutage werden die meisten modernen APIs, die Sie einfach sagen, das system-Bibliotheken, welche Ereignisse Sie interessiert sind, und es wird Sie wissen lassen, wenn Sie passieren.

  3. Inversion of control ist ein praktischer Weg, um code-Duplizierung zu reduzieren, und wenn Sie finden, sich selbst zu kopieren eine ganze Methode, und ändern nur ein kleines Stück von code, Sie betrachten können, deren Bekämpfung mit inversion of control.Inversion of control ist einfach gemacht in viele Sprachen über das Konzept von Delegierten, Schnittstellen oder sogar die raw-Funktion Zeiger.

    Es ist nicht geeignet zu verwenden in allen Fällen, da die Strömung eines Programms kann schwieriger sein, zu Folgen, wenn so geschrieben.Es ist eine nützliche Methode, um die design-Methoden beim schreiben einer Bibliothek, die wiederverwendet wird, aber es sollte sparsam verwendet werden, in den Kern des eigenen Programms, es sei denn es ist wirklich löst eine code-Duplizierung problem.

Aber ich denke, man muss sehr vorsichtig sein mit ihm.Wenn Sie Häufig zu diesem Muster, werden Sie sehr kompliziert-design und noch mehr komplizierten code.

Wie in diesem Beispiel mit TextEditor:wenn Sie nur eine Rechtschreibprüfung vielleicht ist es nicht wirklich notwendig, verwenden IoC ?Es sei denn, Sie schreiben unit-tests oder so ...

Trotzdem:angemessen sein.Design-Muster sind gute Praktiken aber nicht in der Bibel gepredigt werden.Tun nicht stick es überall.

Angenommen, Sie sind ein Objekt.Und Sie gehen in ein restaurant:

Ohne IoC:Fragen Sie nach "Apfel", und Sie sind immer diente apple, wenn Sie mehr stellen.

Mit IoC:Sie können Fragen für "Frucht".Sie können verschiedene Früchte jedes mal, wenn Sie serviert.für Beispiel, apple, orange oder Wassermelone.

Also, offensichtlich IoC ist vorzuziehen, wenn Sie wie die Sorten.

IoC / DI zu mir treibt die Abhängigkeiten der aufrufenden Objekte.Super einfach.

Die non-techy beantworten zu können, ist swap ein Motor im Auto, bevor Sie es einschalten.Wenn alles Haken oben rechts (die Oberfläche), Sie sind gut.

  1. Inversion of control ist ein Muster für die Entkopplung von Komponenten und Schichten im system.Das Muster wird umgesetzt durch injizieren von Abhängigkeiten in eine Komponente, wenn es aufgebaut ist.Diese Abhängigkeiten sind in der Regel als Schnittstellen zur weiteren Entkopplung und die Testbarkeit zu unterstützen.IoC / DI-Container wie Castle Windsor, Einheit Werkzeuge (Bibliotheken), die können verwendet werden für die Bereitstellung von IoC.Diese tools bieten erweiterte Funktionen, die oben und darüber hinaus einfach dependency-management, einschließlich Lebensdauer, AOP / Überwachung, Politik, etc.

  2. ein.Lindert eine Komponente von Verantwortung für die Verwaltung der Abhängigkeiten.
    b.Bietet die Möglichkeit, swap-Abhängigkeit Implementierungen in verschiedenen Umgebungen.
    c.Eine Komponente getestet werden durch verspotten von Abhängigkeiten.
    d....Bietet einen Mechanismus für den Austausch von Ressourcen innerhalb der gesamten Anwendung.

  3. ein.Kritisch, wenn dabei test-driven development.Ohne IoC kann es schwierig sein, Sie zu testen, da die zu testenden Komponenten werden sehr gekoppelt ist, um den rest des Systems.
    b.Entscheidend bei der Entwicklung von modularen Systemen.Ein Modulares system ist ein system, dessen Komponenten ersetzt werden können, ohne Neukompilierung.
    c.Kritisch, wenn es gibt viele cross-cutting-concerns, die behandelt werden müssen, partilarly in einer enterprise-Anwendung.

Ich Schreibe meine einfachen Verständnis dieser beiden Begriffe:

For quick understanding just read examples*

Dependency Injection(DI):
Dependency injection in der Regel bedeutet die übergabe eines Objekts an die Methode hängt davon ab, wie parameter an eine Methode, anstatt die Methode create der abhängigen Objekt.
Was es bedeutet, in der Praxis ist, dass die Methode nicht, hängt direkt auf eine bestimmte Implementierung;jede Implementierung, die die Anforderungen erfüllt werden können als parameter übergeben werden.

Mit dieser Objekte erzählen Ihre Abhängigkeiten.Und Frühling macht.
Dies führt zu lose gekoppelte Anwendung Entwicklung.

Quick Example:EMPLOYEE OBJECT WHEN CREATED,
              IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT
   (if address is defines as dependency by Employee object)

Inversion of Control(IoC) Container:
Dies ist gemeinsames Merkmal der Rahmenbedingungen, IOC verwaltet von java-Objekten
– Instanziierung von der Zerstörung durch seine BeanFactory.
-Java-Komponenten instanziiert werden von der IoC-container sind aufgerufen, Bohnen, und die IoC-container verwaltet bean ' s scope, lifecycle events, und alle AOP-Funktionen für die es konfiguriert wurde und codiert.

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it.

Durch die Implementierung von Inversion of Control, ein software - /Objekt Verbraucher bekommen mehr Steuerelemente/Einstellungen über die software/Objekte, anstatt kontrolliert zu werden oder mit weniger Optionen.

Inversion of control, als ein design-Leitfaden dient den folgenden Zwecken:

Es ist eine Entkopplung der Ausführung einer bestimmten Aufgabe, aus der Umsetzung.
Jedes Modul kann auf das konzentrieren, was es für entworfen ist.
Module machen Sie keine Annahmen darüber, was andere Systeme tun, sondern verlassen sich auf Ihre Verträge.
Austauschen von Modulen hat keine Nebenwirkung auf andere Module
Ich werde die Dinge Abstrakt hier sind, besuchen Sie folgende links zum detail, Verständnis für das Thema.
Gut zu Lesen mit Beispiel

Ausführliche Erklärung

Die Beantwortung der nur der erste Teil.Was ist es?

Inversion of Control (IoC) bedeutet, dass Sie zum erstellen von Instanzen von Abhängigkeiten erste und Letzte Instanz einer Klasse (Optional Injektion durch Konstruktor), anstatt eine Instanz der Klasse zuerst und dann die Instanz der Klasse erstellen von Instanzen von Abhängigkeiten.So, inversion of control, kehrt die Ablaufsteuerung des Programms. Statt die der aufgerufene controlling die Ablaufsteuerung (beim erstellen von Abhängigkeiten), die Anrufer-steuert die Ablaufsteuerung des Programms.

Zum Beispiel, Aufgabe#1 ist auf "Objekt erstellen".Ohne IOC-Konzept, task#1 erfolgen soll vom Programmierer.Aber Mit IOC-Konzept, task#1 geschieht durch container.

In kurzen Kontrolle erhält die invertierte vom Programmer zum container.So, heißt es von der inversion of control.

Ich fand ein gutes Beispiel hier.

Lassen Sie uns sagen, dass wir einige treffen in einem hotel.

Viele Menschen, viele Karaffen mit Wasser, die vielen Plastik-Becher.

Wenn jemand trinken will, Sie füllen, Tasse, Getränk, und werfen den Becher auf den Boden.

Nach Stunden-oder etwas, das wir einen Fußboden abgedeckt Kunststoff Schalen und Wasser.

Lassen invert-Steuerelement.

Die gleiche Besprechung in der gleichen Stelle, aber anstatt von Kunststoff-cups wir haben ein Kellner mit einem Glas-Pokal (Singleton)

und Sie alle Zeit bietet, um die Gäste zu trinken.

Wenn jemand trinken will, Sie bekommen vom Kellner Glas, trinken aus und senden es zurück zum Kellner.

Abgesehen von der Frage der hygienischen, Letzte form von Trink-Prozess-Kontrolle ist viel effektiver und wirtschaftlicher.

Und das ist genau das, was der Frühling (ein anderer IoC-container, zum Beispiel:Guice) ist.Anstatt lassen Sie auf Anwendung erstellen, was Sie benötigen, mit new-Schlüsselwort (unter Plastikbecher), Spring-IoC-container die ganze Zeit bieten, um die Anwendung der gleichen Instanz (singleton) der benötigte Objekt(Glas Wasser).

Denken Sie an sich als Veranstalter solcher treffen.Sie müssen den Weg, um Nachricht zu hotel Verwaltung

treffen Mitglieder müssen ein Glas Wasser, aber kein Stück Kuchen.

Beispiel:-

public class MeetingMember {

    private GlassOfWater glassOfWater;

    ...

    public void setGlassOfWater(GlassOfWater glassOfWater){
        this.glassOfWater = glassOfWater;
    }
    //your glassOfWater object initialized and ready to use...
    //spring IoC  called setGlassOfWater method itself in order to
    //offer to meetingMember glassOfWater instance

}

Nützliche links:-

Ich Stimme mit NilObject,, aber ich möchte hinzufügen, dies:

wenn Sie finden, sich selbst zu kopieren eine ganze Methode, und ändern nur ein kleines Stück von code, Sie betrachten können, deren Bekämpfung mit inversion of control

Wenn Sie sich das kopieren und einfügen von code, Sie sind fast immer dabei etwas falsch.Kodifiziert, da die design Prinzip Nur einmal.

Es scheint, dass der schwierigste an "IoC" ist die Abkürzung und die Namen, für die es steht, ist, dass es zu glamouröser einen Namen - fast ein Geräusch Namen.

Brauchen wir wirklich einen Namen, die zu beschreiben Sie den Unterschied zwischen Verfahrens-und ereignisorientierte Programmierung?OK, wenn wir es brauchen, aber tun wir müssen wählen Sie eine Marke neue "größer als das Leben" - Namen, verwirrt mehr, als es löst?

IoC wird über die Umkehrung der Beziehung zwischen dem code und third-party-code (Bibliothek/framework):

  • In normalen s/w-Entwicklung, schreiben Sie die main() Methode und rufen Sie "Bibliothek" - Methoden. Sie Kontrolle :)
  • Im IoC die "framework" - Steuerelemente main() und Aufrufe Ihrer Methoden.Die Rahmen Kontrolle :(

DI (Dependency Injection) ist etwa, wie die Steuern fließt in die Anwendung.Die herkömmliche desktop-Anwendung-control-flow aus Ihrer Anwendung(main () - Methode) für andere Bibliothek-Methode aufrufen, aber mit DI Ablaufsteuerung ist invertiert das framework kümmert sich um den Start Ihrer app, initialisieren und aufrufen Ihrer Methoden, Wann immer erforderlich.

Am Ende werden Sie immer gewinnen :)

Inversion of control wenn Sie in den Supermarkt gehen und Ihre Frau gibt Ihnen die Liste der Produkte zu kaufen.

In der Programmierung Begriffe, die Sie übergeben, eine callback-Funktion getProductList() um die Funktion, die Sie ausführen - doShopping().

Es erlaubt dem Benutzer, die Funktion zu definieren, die einige Teile von es, machen es mehr flexible.

Eine sehr einfache schriftliche Erklärung finden Sie hier

http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html

Es sagt -

"Jeder nichttrivialen Anwendung besteht aus zwei oder mehr Klassen, zusammenarbeiten mit jeder andere zu führen Sie einige business-Logik.Traditionell, jedes Objekt ist verantwortlich für den Erhalt Ihrer eigenen Verweise auf die Objekte, die es arbeitet mit (Abhängigkeiten).Bei der Anwendung DI, die Objekte Ihre Abhängigkeiten bei der Generierung Zeit durch eine externe Entität, die Koordinaten jedes Objekt in der system.In anderen Worten, Abhängigkeiten injiziert werden in die Objekte."

Inversion of Control ist ein Allgemeines Prinzip, während Dependency Injection realisiert dieses Prinzip als design-Muster für Objekt-graph-Konstruktion (d.h.Konfiguration steuert, wie die Objekte verweisen gegenseitig, anstatt das Objekt selbst Steuern, wie, um den Verweis auf ein anderes Objekt).

Blick auf Inversion of Control, design Muster, wir müssen schauen, was wir sind invertiert.Dependency Injection kehrt die Kontrolle der Konstruktion des Diagramms von Objekten.Wenn gesagt in juristischer Begriff, inversion of control, impliziert die Veränderung von control flow auf dem Programm.ZB.In der traditionellen standalone app, haben wir die main-Methode, von wo aus die Steuerung übergeben bekommt um auch andere Bibliotheken von Drittanbietern(in Fall haben wir Sie Drittanbieter-Bibliothek-Funktion), aber durch inversion of control wird übertragen von Drittanbieter-Bibliothek code unser code, als wir die service von Drittanbieter-Bibliothek.Aber es gibt auch andere Aspekte, die invertiert werden innerhalb eines Programms - z.B.Aufruf von Methoden und threads, die zur Ausführung des Codes.

Für Interessierte, die mehr Tiefe auf Inversion of Control, ein Papier veröffentlicht wurde, in der eine mehr komplette Bild von Inversion of Control as a design pattern (OfficeFloor:mithilfe der office-Muster zur Verbesserung von software-design http://doi.acm.org/10.1145/2739011.2739013 mit einer kostenlosen Kopie zum herunterladen zur Verfügung http://www.officefloor.net/about.html).

Was identifiziert wird, ist die folgende Beziehung:

Inversion of Control (Methoden) = Abhängigkeit (state), Einspritzung + Fortsetzung Injection - + Thread-Injektion

Zusammenfassung der obigen Beziehung für die Inversion der Steuerung zur Verfügung - http://dzone.com/articles/inversion-of-coupling-control

Fand ich ein sehr klares Beispiel hier der erklärt, wie die "Kontrolle ist invertiert'.

Classic-code (ohne Dependency injection)

Hier ist, wie ein code, der nicht mit DI-ungefähr so funktionieren:

  • Anwendung Bedürfnisse Foo (z.B.ein controller), also:
  • Anwendung erstellt Foo
  • Anwendung ruft Foo
    • Foo Bedürfnissen Bar (z.B.- a-service), also:
    • Foo Bar erstellt
    • Foo Aufrufe Bar
      • Bar muss Bim (ein service, repository, ...), also:
      • Bar schafft Bim
      • Bar etwas tut

Mithilfe von dependency injection

Hier ist, wie ein code mit DI ungefähr so funktionieren:

  • Anwendung Bedürfnisse Foo, die Bar, die Bedürfnisse Bim, also:
  • Anwendung erstellt Bim
  • Anwendung erstellt eine Bar und gibt es Bim
  • Anwendung erstellt werden, Foo und gibt es Bar
  • Anwendung ruft Foo
    • Foo Aufrufe Bar
      • Bar etwas tut

Die Steuerung der Abhängigkeiten wird Umgekehrt von einem Wesen namens der eine Berufung.

Welche Probleme versucht es zu lösen?

Dependency injection macht es einfach zu Austausch durch die unterschiedliche Umsetzung des injizierten Klassen.Während unit-Tests können Sie injizieren eine dummy-Implementierung, wodurch das testen sehr viel einfacher.

Ex:Angenommen, Ihre Anwendung speichert die vom Benutzer hochgeladene Datei in dem Google Drive, mit DI Ihre controller-code kann wie folgt Aussehen:

class SomeController
{
    private $storage;

    function __construct(StorageServiceInterface $storage)
    {
        $this->storage = $storage;
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

class GoogleDriveService implements StorageServiceInterface
{
    public function authenticate($user) {}
    public function putFile($file) {}
    public function getFile($file) {}
}

Wenn sich Ihre Anforderungen ändern sagen, statt GoogleDrive Sie gebeten, die Dropbox.Sie müssen nur schreiben Sie einen dropbox-Implementierung für die StorageServiceInterface.Sie nicht haben, änderungen in der controller so lange, wie Dropbox Umsetzung hält sich an die StorageServiceInterface.

Während des Tests können Sie die mock für die StorageServiceInterface mit der dummy-Implementierung, wo all die Methoden, die null zurückgeben(oder alle vordefinierten Wert wie pro Ihre Prüfung Anforderung.).

Stattdessen hätten Sie die controller-Klasse zu konstruieren, die das storage-Objekt mit der new keyword wie diese:

class SomeController
{
    private $storage;

    function __construct()
    {
        $this->storage = new GoogleDriveService();
    }

    public function myFunction () 
    {
        return $this->storage->getFile($fileName);
    }
}

Wenn Sie ändern möchten, mit der Dropbox-Implementierung, die Sie haben zu ersetzen Sie alle Zeilen, in denen new GoogleDriveService Objekt ist konstruiert und verwenden Sie die DropboxService.Außerdem bei der Prüfung der SomeController Klasse der Konstruktor erwartet immer die GoogleDriveService Klasse und die eigentlichen Methoden dieser Klasse ausgelöst werden.

Wann ist es angebracht-und Wann nicht? Meiner Meinung nach verwenden Sie DI wenn Sie denken, es gibt (oder es werden können) alternative Implementierungen einer Klasse.

Programmierung sprechen

IoC in einfache Begriffe:Es ist die Verwendung der Schnittstelle als Besondere etwas (wie ein Feld oder einen parameter) als Platzhalter, die verwendet werden können, die von einigen Klassen.Es ermöglicht die Wiederverwendbarkeit von code.

Zum Beispiel, sagen wir, wir haben zwei Klassen : Hund und Cat.Beide Aktien die gleichen Eigenschaften/Zustände:Alter, Größe, Gewicht.Also anstatt eine service-Klasse genannt DogService und CatService, Kann ich eine einzelne aufgerufen AnimalService dass es erlaubt, Hund und Katze nur, wenn Sie die Schnittstelle IAnimal.

Jedoch, pragmatisch gesprochen, es hat sich etwas nach hinten.

a) Die meisten Entwickler wissen nicht, wie es zu benutzen.Ich kann zum Beispiel erstellen Sie eine Klasse namens Kunde und Ich kann Sie erstellen, automatisch (über die tools der IDE), die eine Schnittstelle namens ICustomer.Es ist also nicht selten, dass ein Ordner gefüllt mit Klassen und Schnittstellen, egal ob die Schnittstellen, die wiederverwendet werden kann oder nicht.Es nennt sich AUFGEBLÄHT.Einige Leute könnten argumentieren, dass "möglicherweise werden wir in Zukunft nutzen könnte".:-|

b) Es hat einige limitings.Für Beispiel, lassen Sie uns reden über den Fall von Hund und Cat und ich möchte hinzufügen eines neuen service (Funktionalität) nur für Hunde.Lassen Sie uns sagen, dass ich möchte, um berechnen Sie die Anzahl der Tage, die ich brauche, zu trainieren einen Hund (trainDays()), für die Katze ist es nutzlos, Katzen können nicht trainiert werden (ich Scherze).

b.1) Wenn ich trainDays() der Service AnimalService dann funktioniert es auch mit Katzen und es ist nicht gültig in allen.

b.2) kann ich eine Bedingung hinzufügen, in trainDays() wo es wertet aus, welche Klasse verwendet wird.Aber es bricht komplett den IoC.

b.3) ich erstelle eine neue Klasse von service aufgerufen DogService nur für die neuen Funktionen.Aber, es wird erhöhen die Wartbarkeit des Codes, da haben wir zwei service-Klassen (mit ähnlicher Funktionalität) für Hund und es ist schlimm.

Ich mag diese Erklärung: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/

Starten Sie es einfach und zeigt code-Beispiele, wie gut.

enter image description here

Der Verbraucher, X, muss die verbrauchte Klasse Y, um etwas zu erreichen.Das ist alles gut und Natürliche, aber hat X wirklich brauchen, zu wissen, dass es verwendet Y?

Ist es nicht genug, dass X weiß, dass es etwas nutzt, dass das Verhalten, die Methoden, Eigenschaften etc. von Y, ohne zu wissen, wer tatsächlich implementiert das Verhalten?

Durch das extrahieren einer abstrakten definition des Verhaltens von X in Y, veranschaulicht, wie ich unten, und lassen die Verbraucher X verwenden Sie eine Instanz, die anstelle von Y kann es weiterhin zu tun, was es tut, ohne zu wissen, die Besonderheiten über Y.

enter image description here

In der Abbildung oben Y implementiert I und X verwendet eine Instanz von I.Während es durchaus möglich ist, dass X noch Y verwendet, was interessant ist, ist, dass X nicht wissen, dass.Sie weiß einfach, dass es etwas nutzt, implementiert, I.

Lesen Sie den Artikel für weitere Informationen und eine Beschreibung der Vorteile wie:

  • X ist nicht abhängig von Y mehr
  • Mehr flexible, Umsetzung entschieden werden kann, in der runtime
  • Isolierung-code-Gerät, einfacher Test

...

Ich verstehe, dass die Antwort bereits hier gegeben.Aber ich denke immer noch, einige Grundlagen über die inversion der Steuerung werden diskutiert hier in der Länge für zukünftige Leser.

Inversion of Control (IoC) wurde auf einem sehr einfachen Prinzip genannt Hollywood-Prinzip.Und es sagt,dass

Rufen Sie uns nicht an, wir rufen Sie an

Was es bedeutet, ist, dass nicht an die Hollywood zu erfüllen Sie sich Ihren Traum eher, wenn Sie würdig sind, dann Hollywood finden Sie und stellen Sie Ihr Traum wird wahr.So ziemlich Umgekehrt, nicht wahr?

Nun, wenn wir diskutieren über das Prinzip des IoC, die wir verwenden, zu vergessen, über die Hollywood.Für das IoC, es hat drei-element, Hollywood, du und eine Aufgabe, die wie für Ihren Traum erfüllen.

In unserer Welt der Programmierung, Hollywood stellen Sie ein generisches framework (können geschrieben werden, durch Sie oder jemand anderes), Sie stellen Sie den Benutzer-code, den Sie geschrieben haben, und die Aufgabe repräsentieren Sie das, was Sie erreichen wollen, mit Ihrem code.Jetzt brauchen Sie nicht immer gehen Sie zum auslösen der Aufgabe selbst, nicht im IoC!Vielmehr ist Sie so entworfen haben, alles so, dass Ihr framework löst Ihre Aufgabe für Sie.So haben Sie gebaut ein wiederverwendbares framework kann jemand ein held oder anderen ein Schurke ist.Aber das framework ist immer kostenlos, es weiß, Wann Sie zu wählen jemand und dieser jemand kennt nur das, was es sein will.

Ein Beispiel aus der Praxis wäre hier gegeben.Angenommen, Sie möchten die Entwicklung einer web-Anwendung.So erstellen Sie einen Rahmen, welcher sich um all die gemeinsamen Dinge, die eine web-Anwendung verwenden soll, wie die Bearbeitung von http-Anfrage, creating application menu, Webseiten, um cookies zu verwalten, auslösende Ereignisse etc.

Und dann lässt man einige Haken in Ihrem Rahmen, wo Sie weitere codes zum generieren von benutzerdefinierten Menüs, Seiten, cookies oder log einige user events etc.Auf jeder browser-Anfrage, Ihre framework ausgeführt wird, und führt Ihre benutzerdefinierten codes, wenn hakte dann servieren Sie es an den browser zurück.

Also, die Idee ist ziemlich einfach.Anstatt eine Benutzer-Anwendung, die alles kontrollieren, erstellen Sie zunächst ein wiederverwendbares framework, die alles kontrollieren und schreiben Sie dann Ihre benutzerdefinierten codes und Haken Sie ihn an den Rahmen zum ausführen dieser in der Zeit.

Laravel und EJB sind Beispiele für solche frameworks.

Referenz:

https://martinfowler.com/bliki/InversionOfControl.html

https://en.wikipedia.org/wiki/Inversion_of_control

Inversion of control ist über die übertragung von Steuern aus der Bibliothek an den client.Es macht mehr Sinn, wenn wir sprechen über einen client, der injiziert (geht) eine Funktion mit dem Wert (lambda-Ausdruck) in eine Funktion höherer Ordnung (Bibliothek-Funktion), der Kontrollen (änderungen) das Verhalten der library-Funktion.Ein client oder Rahmen, die injiziert Bibliothek Abhängigkeiten (tragen, Verhalten), in Bibliotheken kann auch als IoC

  1. Also die Nummer 1 über. Was ist Inversion of Control?

  2. Wartung ist die Nummer eins, was löst es für mich.Es garantiert, ich bin mit Schnittstellen, so dass zwei Klassen, die sind nicht vertraut mit jeder andere.

Mit einem container wie Castle Windsor, löst es Probleme bei der Wartung noch besser.Being able to swap out eine Komponente, die geht an einer Datenbank für eine Anwendung Datei-basierte Persistenz ohne änderung einer Zeile code, die ist genial (Konfiguration ändern, sind Sie fertig).

Und wenn man einmal in Generika, es wird noch besser.Stellen Sie sich vor, eine Nachricht publisher erhält, dass die Datensätze und Nachrichten veröffentlicht.Es kümmert sich nicht, was er veröffentlicht, aber es muss ein mapper, etwas zu nehmen aus einem Datensatz eine Nachricht.

public class MessagePublisher<RECORD,MESSAGE>
{
    public MessagePublisher(IMapper<RECORD,MESSAGE> mapper,IRemoteEndpoint endPointToSendTo)
    {
      //setup
    }
}

Ich schrieb es einmal, aber jetzt kann ich injizieren viele Arten in diesem code, wenn ich veröffentlichen verschiedene Arten von Nachrichten.Ich kann auch schreiben-Mappern, die einen Datensatz mit dem gleichen Typ und ordnen Sie Sie verschiedenen Nachrichten.Mithilfe von DI mit Generika hat mir die Fähigkeit zu schreiben, sehr wenig code ausführen viele Aufgaben.

Oh ja, es gibt Testbarkeit Bedenken, aber Sie sind Sekundär zu den Vorteilen der IoC/DI.

Ich bin auf jeden Fall lieben IoC/DI.

3 .Es wird angemessener in der minute, Sie haben ein mittelgroßes Projekt von etwas mehr Komplexität.Ich würde sagen, es wird gegebenenfalls die minute, die Sie beginnen, Schmerz zu empfinden.

Erstellen Sie ein Objekt innerhalb der Klasse aufgerufen, enge Kopplung, Frühjahr beseitigt diese Abhängigkeit, indem Sie die folgenden ein Entwurfsmuster(DI/IOC).In dem Objekt der Klasse im Konstruktor übergeben, anstatt in die Klasse.Mehr über uns geben super-Klasse-Referenz-variable im Konstruktor zu definieren, die mehr die Allgemeine Struktur.

Mit IoC-Sie sind nicht neu ' Ing bis Ihre Objekte.Ihr IoC-container wird, dass Sie und verwalten der Lebensdauer von Ihnen.

Es löst das problem, dass die manuelle änderung jeder Instanziierung eines Typs von Objekt zu einem anderen.

Es ist angemessen, wenn Sie die Funktionalität, die möglicherweise in der Zukunft ändern, oder kann unterschiedlich sein, je nach Umgebung oder Konfiguration verwendet.

Um das Verständnis des Konzepts, Inversion of Control (IoC) oder das Dependency Inversion Principle (DIP), besteht aus zwei Aktivitäten:Abstraktion und inversion.Dependency Injection (DI) ist nur eine der wenigen von der inversion Methoden.

Lesen Sie mehr über dieses können Sie meinen blog Lesen Hier

  1. Was ist es?

Es ist eine Praxis, wo Sie lassen Sie das tatsächliche Verhalten kommen von außerhalb der Grenze (Klasse in der objektorientierten Programmierung).Die Grenze Entität kennt nur die Abstraktion (e.g interface, abstract class, Delegierter in der Objekt-Orientierten-Programmierung) von ihm.

  1. Welche Probleme versucht es zu lösen?

Im Begriff der Programmierung, IoC versuchen zu lösen monolithischen code, indem Sie modulare, Entkopplung der einzelnen Teile, und stellen Sie es unit-getestet werden.

  1. Wann ist es angebracht-und Wann nicht?

Es ist angebracht, die meisten der Zeit, es sei denn, Sie haben die situation, wo Sie nur wollen, monolithischer code ("e.g sehr einfaches Programm)

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