Frage Was ist Inversion der Kontrolle?


Inversion of Control (oder IoC) kann beim ersten Auftreten ziemlich verwirrend sein.

  1. Was ist es?
  2. Welche Probleme löst es?
  3. Wann ist es angebracht und wann nicht?

1426
2017-08-06 03:35


Ursprung


Antworten:


Die Inversion of Control (IoC) und Dependency Injection (DI) -Muster sind alle über das Entfernen von Abhängigkeiten von Ihrem Code.

Angenommen, Ihre Anwendung hat eine Text-Editor-Komponente und Sie möchten eine Rechtschreibprüfung durchführen. Ihr Standardcode würde etwa so aussehen:

public class TextEditor {

    private SpellChecker checker;

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

Was wir hier gemacht haben, schafft eine Abhängigkeit zwischen den TextEditor und das SpellChecker. In einem IoC-Szenario würden wir stattdessen so etwas tun:

public class TextEditor {

    private IocSpellChecker checker;

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

Im ersten Codebeispiel werden wir instanziiert SpellChecker (this.checker = new SpellChecker();), was bedeutet die TextEditor Klasse hängt direkt von der ab SpellChecker Klasse.

Im zweiten Codebeispiel erstellen wir eine Abstraktion, indem wir die SpellChecker Abhängigkeitsklasse in TextEditor Konstruktorsignatur (keine Abhängigkeit in der Klasse initialisieren). Dadurch können wir die Abhängigkeit aufrufen und sie dann wie folgt an die TextEditor-Klasse übergeben:

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

Jetzt erstellt der Client das TextEditor Klasse hat die Kontrolle darüber SpellChecker Implementierung zu verwenden, weil wir die Abhängigkeit in die TextEditor Unterschrift.

Dies ist nur ein einfaches Beispiel eine gute Reihe von Artikeln von Simone Busoli, die das genauer erklärt.


1137
2017-08-06 07:22



Inversion von Control ist, was Sie erhalten, wenn Ihre Programmrückrufe, z. wie ein GUI-Programm.

Zum Beispiel könnten Sie in einem alten Schulmenü Folgendes haben:

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

dadurch wird der Fluss der Benutzerinteraktion gesteuert.

In einem GUI-Programm oder dergleichen, sagen wir stattdessen

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

Jetzt ist die Kontrolle umgekehrt ... anstatt dass der Computer Benutzereingaben in einer festen Reihenfolge akzeptiert, steuert der Benutzer die Reihenfolge, in der die Daten eingegeben werden und wenn die Daten in der Datenbank gespeichert werden.

Grundsätzlich fällt in diese Kategorie alles mit einer Ereignisschleife, Callbacks oder Ausführungsauslöser.


495
2017-08-06 05:42



Was ist Inversion der Kontrolle?

Wenn Sie diese einfachen zwei Schritte befolgen, haben Sie eine Inversion der Kontrolle vorgenommen:

  1. Trennen Waszum Teil von wannzu tun.
  2. Sicher gehen, dass wann Teil weiß wie wenig wie möglich über Was Teil; und umgekehrt.

Je nach Technologie / Sprache, die Sie für Ihre Implementierung verwenden, sind für jeden dieser Schritte mehrere Techniken möglich.

-

Das Inversion Teil der Inversion of Control (IoC) ist die verwirrende Sache; weil Inversion ist der relative Begriff. Der beste Weg, IoC zu verstehen, ist dieses Wort zu vergessen!

-

Beispiele

  • Handhabung des Events. Event Handlers (was zu tun ist Teil) - Raising Events (zu-tun-Teil)
  • Schnittstellen. Component-Client (Aufgabenbereich) - Implementierung der Komponentenschnittstelle (Was tun?)
  • xUnit fixieren. Setup und TearDown (Was tun?) - xUnit Frameworks ruft Setup zu Beginn und TearDown am Ende auf (Wow-to-do)
  • Template-Methode Entwurfsmuster. Template-Methode When-to-do-Teil - primitive Subklassenimplementierung was-zu-tun-Teil
  • DLL-Container-Methoden in COM. DllMain, DllCanUnload, usw. (was zu tun) - COM / OS (When-to-do Teil)

359
2017-07-22 17:34



Inversion of Controls bedeutet, Probleme voneinander zu trennen.

Ohne IoC: Du hast ein Laptop Computer und Sie versehentlich den Bildschirm brechen. Und verdammt, finden Sie das gleiche Modell Laptop-Bildschirm ist nirgendwo auf dem Markt. Du bist also festgefahren.

Mit IoC: Du hast ein Desktop Computer und Sie versehentlich den Bildschirm brechen. Sie können feststellen, dass Sie fast jeden Desktop-Monitor vom Markt nehmen können, und es funktioniert gut mit Ihrem Desktop.

Ihr Desktop implementiert in diesem Fall erfolgreich IoC. Es akzeptiert eine Vielzahl von Monitoren, während der Laptop nicht, es braucht einen bestimmten Bildschirm, um zu beheben.


89
2017-09-25 14:24



Inversion of Control (oder IoC) ist ungefähr Freiheit bekommen (Du heiratest, du hast die Freiheit verloren und du wirst kontrolliert. Du hast geschieden, du hast gerade Inversion of Control implementiert. Das haben wir "entkoppelt" genannt. Ein gutes Computersystem entmutigt eine sehr enge Beziehung.) mehr Flexibilität (Die Küche in Ihrem Büro serviert nur sauberes Leitungswasser, das ist Ihre einzige Wahl, wenn Sie trinken wollen. Ihr Chef hat die Umkehrung der Kontrolle durch Einrichten einer neuen Kaffeemaschine implementiert. Jetzt haben Sie die Flexibilität, entweder Leitungswasser oder Kaffee zu wählen. ) und weniger Abhängigkeit (Ihr Partner hat einen Job, Sie haben keinen Job, Sie sind finanziell von Ihrem Partner abhängig, also werden Sie kontrolliert. Sie finden einen Job, Sie haben Inversion of Control implementiert. Ein gutes Computersystem fördert die Abhängigkeit.)

Wenn Sie einen Desktop-Computer verwenden, haben Sie Sklaven (oder sagen, kontrolliert). Du musst vor einem Bildschirm sitzen und es anschauen. Verwenden Sie die Tastatur zum Tippen und Verwenden der Maus zum Navigieren. Und eine schlecht geschriebene Software kann dich noch mehr sklaven. Wenn Sie Ihren Desktop durch einen Laptop ersetzen, dann haben Sie etwas umgekehrte Kontrolle. Sie können es leicht nehmen und sich bewegen. Jetzt können Sie steuern, wo Sie mit Ihrem Computer sind, anstatt dass Ihr Computer es steuert.

Durch Implementierung von Inversion of Control erhält ein Software / Objekt-Konsument mehr Kontrolle / Optionen über die Software / Objekte, anstatt kontrolliert zu werden oder weniger Optionen zu haben.

Mit den oben genannten Ideen. Wir vermissen noch immer einen wichtigen Teil von IoC. In dem Szenario von IoC ist der Software / Objekt-Konsument ein anspruchsvoller Rahmen. Das bedeutet, dass der von Ihnen erstellte Code nicht von Ihnen selbst aufgerufen wird. Lassen Sie uns nun erklären, warum dieser Weg für eine Webanwendung besser funktioniert.

Angenommen, Ihr Code ist eine Gruppe von Arbeitern. Sie müssen ein Auto bauen. Diese Arbeiter brauchen einen Platz und Werkzeuge (ein Software-Framework), um das Auto zu bauen. EIN traditionell Software-Framework wird wie eine Garage mit vielen Werkzeugen sein. Also müssen die Arbeiter selbst einen Plan machen und die Werkzeuge benutzen, um das Auto zu bauen. Ein Auto zu bauen ist kein einfaches Geschäft, es wird sehr schwer für die Arbeiter sein, richtig zu planen und zu kooperieren. EIN modern Software-Framework wird wie eine moderne Autofabrik mit allen Einrichtungen und Managern an Ort und Stelle sein. Die Arbeiter müssen keinen Plan machen, die Manager (Teil des Rahmens, sie sind die klügsten Leute und haben den ausgeklügeltsten Plan gemacht) werden helfen zu koordinieren, so dass die Arbeiter wissen, wann sie ihren Job machen sollen (Rahmen nennt Ihren Code). Die Mitarbeiter müssen nur flexibel genug sein, um alle Tools zu verwenden, die ihnen die Manager geben (durch Dependency Injection).

Obwohl die Arbeiter die Kontrolle über die Verwaltung des Projekts auf oberster Ebene den Managern (dem Rahmenwerk) übertragen. Aber es ist gut, dass einige Profis helfen. Dies ist das Konzept von IoC wirklich herkommen.

Moderne Webanwendungen mit einer MVC-Architektur hängen vom Framework ab, um URL-Routing durchzuführen und Controller für den Aufruf des Frameworks einzurichten.

Abhängigkeitsinjektion und Inversion der Kontrolle sind verwandt. Dependency Injection ist bei der Mikro Level und Inversion der Kontrolle ist am Makro Niveau. Sie müssen jeden Bissen essen (DI umsetzen), um eine Mahlzeit zu beenden (IoC umsetzen).


80
2018-03-04 19:33



Bevor Sie Inversion of Control verwenden, sollten Sie sich der Tatsache bewusst sein, dass es Vor- und Nachteile hat und Sie wissen sollten, warum Sie es verwenden, wenn Sie dies tun.

Vorteile:

  • Ihr Code wird entkoppelt, sodass Sie Implementierungen einer Schnittstelle problemlos mit alternativen Implementierungen austauschen können
  • Es ist ein starker Motivator für die Codierung gegen Schnittstellen statt Implementierungen
  • Es ist sehr einfach Komponententests für Ihren Code zu schreiben, da es von nichts anderem als den Objekten abhängt, die es in seinen Konstruktoren / Setter akzeptiert, und Sie können sie leicht mit den richtigen Objekten isolieren.

Nachteile:

  • IoC invertiert nicht nur den Kontrollfluss in Ihrem Programm, sondern macht es auch erheblich schwächer. Das bedeutet, dass Sie Ihren Code nicht mehr nur lesen und von einem Ort zum anderen springen können, da die Verbindungen, die normalerweise in Ihrem Code vorhanden sind, nicht mehr im Code enthalten sind. Stattdessen werden diese Metadaten in XML-Konfigurationsdateien oder -Anmerkungen und im Code Ihres IoC-Containers interpretiert.
  • Es entsteht eine neue Klasse von Fehlern, bei denen Sie Ihre XML-Konfiguration oder Ihre Anmerkungen falsch erhalten und Sie können viel Zeit damit verbringen, herauszufinden, warum Ihr IoC-Container unter bestimmten Bedingungen eine Null-Referenz in eines Ihrer Objekte injiziert.

Persönlich sehe ich die Stärken von IoC und ich mag sie wirklich, aber ich tendiere dazu, IoC wann immer möglich zu vermeiden, weil es Ihre Software in eine Sammlung von Klassen verwandelt, die kein "echtes" Programm mehr darstellen, sondern nur etwas, das zusammengestellt werden muss XML-Konfiguration oder Annotation Metadaten und würde ohne sie fallen (und fällt).


73
2018-02-12 14:31



  1. Wikipedia Artikel. Inversion der Kontrolle verwandelt meinen sequentiell geschriebenen Code in eine Delegationsstruktur. Anstatt dass Ihr Programm alles explizit steuert, richtet Ihr Programm eine Klasse oder Bibliothek mit bestimmten Funktionen ein, die aufgerufen werden, wenn bestimmte Dinge passieren.

  2. Es löst die Code-Duplizierung. Zum Beispiel würden Sie in den alten Tagen manuell Ihre eigene Ereignisschleife schreiben und die Systembibliotheken nach neuen Ereignissen abfragen. In den meisten heutigen APIs teilen Sie den Systembibliotheken einfach mit, an welchen Ereignissen Sie interessiert sind, und Sie werden darüber informiert, wenn sie auftreten.

  3. Die Umkehrung der Kontrolle ist ein praktischer Weg, die Code-Duplizierung zu reduzieren, und wenn Sie eine ganze Methode kopieren und nur einen kleinen Teil des Codes ändern, können Sie in Betracht ziehen, ihn mit einer Inversion der Kontrolle in Angriff zu nehmen. Die Inversion der Kontrolle wird in vielen Sprachen durch das Konzept von Delegaten, Schnittstellen oder sogar Funktionszeigern erleichtert.

    Es ist nicht angemessen, in allen Fällen zu verwenden, weil der Ablauf eines Programms schwieriger sein kann, wenn es auf diese Weise geschrieben wird. Es ist ein nützlicher Weg, um Methoden zu entwickeln, wenn eine Bibliothek geschrieben wird, die wiederverwendet wird, aber sie sollte sparsam im Kern eines eigenen Programms verwendet werden, es sei denn, es löst wirklich ein Code-Duplikationsproblem.


55
2017-08-06 04:33



Aber ich denke, du musst sehr vorsichtig damit sein. Wenn Sie dieses Muster überstrapazieren, werden Sie sehr komplizierten Entwurf und sogar komplizierteren Code machen.

Wie in diesem Beispiel mit TextEditor: Wenn du nur einen SpellChecker hast, ist es vielleicht nicht notwendig IoC zu benutzen? Es sei denn, Sie müssen Komponententests oder etwas schreiben ...

Wie auch immer: sei vernünftig. Entwurfsmuster sind Gute Praktiken aber nicht die Bibel, die gepredigt werden soll. Klebe es nicht überall ab.


39
2017-08-06 22:08



Angenommen du bist ein Objekt. Und du gehst in ein Restaurant:

Ohne IoC: Sie fragen nach "Apfel", und Sie werden immer Apfel serviert, wenn Sie mehr fragen.

Mit IoC: Sie können nach "Obst" fragen. Sie können jedes Mal verschiedene Früchte bekommen, wenn Sie bedient werden. zum Beispiel Apfel, Orange oder Wassermelone.

Also, natürlich, IoC ist bevorzugt, wenn Sie die Sorten mögen.


35
2017-09-25 14:00