Was ist Inversion der Kontrolle?

  • Die Inversion der Kontrolle (oder IoC) kann beim ersten Auftreten ziemlich verwirrend sein.

    1. Was ist das? / li>
    2. Welche Probleme löst es?
    3. Wann ist es angebracht und wann nicht?
    13 May 2018
    Mark Harrisonyukondude
28 answers
  • In den Mustern Inversion of Control (IoC) und Dependency Injection (DI) geht es darum, Abhängigkeiten aus Ihrem Code zu entfernen.

    Angenommen, Ihre Anwendung hat ein Texteditor-Komponente und Sie möchten die Rechtschreibprüfung durchführen. Ihr Standardcode würde ungefähr so ​​aussehen:

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

    Was wir hier getan haben, erzeugt eine Abhängigkeit zwischen dem TextEditor und die SpellChecker. In einem IoC-Szenario würden wir stattdessen Folgendes tun:

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

    Im ersten Codebeispiel instanziieren wir SpellChecker (this.checker = new SpellChecker();), was bedeutet, dass die Klasse TextEditor direkt von der Klasse SpellChecker abhängt.

    In der Im zweiten Codebeispiel erstellen wir eine Abstraktion, indem wir die Abhängigkeitsklasse SpellChecker in der Konstruktorsignatur TextEditor haben (die Abhängigkeit in der Klasse wird nicht initialisiert). Dies ermöglicht es uns, die Abhängigkeit aufzurufen und sie wie folgt an die TextEditor-Klasse zu übergeben:

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

    Nun wird der Client erstellt Die Klasse TextEditor hat die Kontrolle darüber, welche Implementierung von SpellChecker verwendet werden soll, da wir die Abhängigkeit von der Signatur TextEditor einfügen.

    Dies ist nur ein einfaches Beispiel. Es gibt eine gute Artikelserie von Simone Busoli, die dies ausführlicher erläutert.

    15 July 2017
    Patapoom
  • Inversion der Kontrolle erhalten Sie, wenn Ihre Programmrückrufe, z. Wie ein GUI-Programm.

    In einem alten Schulmenü könnten Sie beispielsweise Folgendes haben:

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

    , wodurch der Fluss der Benutzerinteraktion gesteuert wird.

    In einem GUI-Programm oder ähnlich wird 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 wird die Steuerung invertiert ... Anstatt dass der Computer Benutzereingaben in einer festen Reihenfolge akzeptiert, steuert der Benutzer die Reihenfolge, in der sich die Daten befinden und wenn die Daten in der Datenbank gespeichert sind.

    Grundsätzlich gilt alles, was über eine Ereignisschleife, Rückrufe oder Ausführungsauslöser verfügt, in diese Kategorie.

    26 September 2012
    JainendraJitender Mahlawat
  • Was ist Inversion der Kontrolle?

    Wenn Sie diesen einfachen zwei Schritten folgen, haben Sie die Kontrolle umgekehrt:

    1. Trennen Sie den was -to-do-Teil vom wenn -to-do-Teil.
    2. Stellen Sie dies sicher wenn der Teil wenig als möglich über den Teil weiß; und umgekehrt.

    Für jeden dieser Schritte sind verschiedene Techniken möglich, basierend auf der Technologie / Sprache, die Sie für Ihre Implementierung verwenden.

    -

    Der Inversion -Teil der Inversion of Control (IoC) ist das Verwirrende; weil Inversion der relative Ausdruck ist. Der beste Weg, IoC zu verstehen, besteht darin, dieses Wort zu vergessen!

    -

    Beispiele

    • Ereignisbehandlung. Ereignishandler (Was ist zu tun) - Ereignisse auslösen (Wenn-Teil)
    • Schnittstellen. Component-Client (Wann-To-Do-Teil) - Implementierung der Komponentenschnittstelle (Was-To-Do-Teil)
    • xUnit-Fixur. Setup und TearDown (auszuführender Teil) - xUnit-Frameworks rufen Setup am Anfang und TearDown am Ende (Wenn zu erledigender Teil) auf.
    • Vorlagenmusterentwurfsmuster. Schablonenmethode When-to-do-Teil - Implementierung der primitiven Unterklasse Implementierung
    • DLL-Containermethoden in COM. DllMain, DllCanUnload usw. (auszuführender Teil) - COM / OS (auszuführender Teil)
    23 July 2010
    rpattabiJitindra Fartiyal
  • Bei der Inversion von Steuerelementen werden die Bedenken voneinander getrennt.

    Ohne IoC: Sie haben einen Laptop , und der Bildschirm ist versehentlich beschädigt. Und verdammt, Sie finden das gleiche Modell Laptop Bildschirm ist nirgends auf dem Markt. Sie stecken also fest.

    Mit IoC : Sie haben einen Desktop-Computer und Sie unterbrechen den Bildschirm aus Versehen. Sie können fast jeden Desktop-Monitor vom Markt beziehen, und er funktioniert gut mit Ihrem Desktop.

    Ihr Desktop implementiert IoC in diesem Fall erfolgreich. Es akzeptiert eine Vielzahl von Monitoren, während dies bei einem Laptop nicht der Fall ist. Es wird ein bestimmter Bildschirm benötigt, um repariert zu werden.

    20 January 2017
    Bharat MallapurHarisankar Krishna Swamy
  • Inversion of Control (oder IoC) handelt von Freiheit erlangen (Sie heiraten, Sie haben die Freiheit verloren und Sie werden kontrolliert. Sie sind geschieden und haben gerade Inversion of Control implementiert Das nannten wir "entkoppelt". Ein gutes Computersystem rät von einer sehr engen Beziehung ab. mehr Flexibilität (Die Küche in Ihrem Büro bietet nur sauberes Leitungswasser. Dies ist Ihre einzige Wahl, wenn Sie möchten Ihr Chef hat Inversion of Control implementiert, indem er eine neue Kaffeemaschine eingerichtet hat. Jetzt haben Sie die Flexibilität, entweder Leitungswasser oder Kaffee zu wählen.) und weniger Abhängigkeit (Ihr Partner hat einen Job, Sie haben nicht Wenn Sie einen Job haben, sind Sie finanziell von Ihrem Partner abhängig, sodass Sie die Kontrolle haben. Sie finden einen Job, Sie haben Inversion of Control implementiert. Ein gutes Computersystem ermutigt zur Unabhängigkeit.)

    Wenn Sie einen Desktop-Computer verwenden, haben Sie Slaves (oder sagen Sie, gesteuert). Sie müssen vor einem Bildschirm sitzen und es betrachten. Verwenden der Tastatur zum Tippen und Verwenden der Maus zum Navigieren. Und eine schlecht geschriebene Software kann Sie noch mehr unterdrücken. Wenn Sie Ihren Desktop durch einen Laptop ersetzen, haben Sie die Steuerung etwas umgekehrt. Sie können es leicht nehmen und sich bewegen. So können Sie jetzt steuern, wo Sie sich mit Ihrem Computer befinden, anstatt dass Ihr Computer ihn steuert.

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

    Vor diesem Hintergrund. Wir vermissen immer noch einen wichtigen Teil von IoC. Im IoC-Szenario ist der Software- / Objekt-Consumer ein komplexes Framework. 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 benötigen einen Ort und Werkzeuge (ein Software-Framework), um das Auto zu bauen. Ein herkömmlicher Softwarerahmen

    20 September 2016
    Sunil Gargleora
  • Bevor Sie Inversion of Control verwenden, sollten Sie sich der Tatsache bewusst sein, dass es seine Vor- und Nachteile hat, und Sie sollten wissen, warum Sie es verwenden, wenn Sie dies tun.

    Vorteile:

    • Ihr Code wird entkoppelt, sodass Sie Implementierungen einer Schnittstelle mit alternativen Implementierungen problemlos austauschen können.
    • It ist ein starker Motivator für die Codierung von Schnittstellen anstelle von Implementierungen.
    • Es ist sehr einfach, Unit-Tests für Ihren Code zu schreiben, da er von nichts anderem abhängt als von den Objekten, die er in seinem Konstruktor / Setter akzeptiert Sie können sie einfach mit den richtigen Objekten isoliert initialisieren.

    Nachteile:

    • IoC invertiert nicht nur den Steuerungsfluss in Ihrem Programm, sondern trübt ihn auch erheblich. Das bedeutet, dass Sie nicht mehr nur Ihren Code lesen und von einem Ort zum anderen springen können, da die Verbindungen, die normalerweise in Ihrem Code vorhanden wären, nicht mehr im Code enthalten sind. Stattdessen werden diese Metadaten in XML-Konfigurationsdateien oder -Anmerkungen und im Code Ihres IoC-Containers interpretiert.
    • Es tritt eine neue Klasse von Fehlern auf, bei denen Sie Ihre XML-Konfiguration oder Ihre Anmerkungen falsch eingeben Sie können viel Zeit darauf verwenden, herauszufinden, warum Ihr IoC-Container unter bestimmten Bedingungen eine Nullreferenz in eines Ihrer Objekte einfügt.

    Ich persönlich sehe das Die Stärken von IoC und ich mag sie wirklich, aber ich neige dazu, IoC zu vermeiden, wann immer dies möglich ist, da Ihre Software zu einer Sammlung von Klassen wird, die nicht länger ein "echtes" Programm sind, sondern nur etwas, das durch XML-Konfiguration oder Anmerkungen zusammengestellt werden muss Metadaten und würde ohne sie fallen (und fällt).

    08 August 2016
    Efe Ariaroo
    1. Wikipedia-Artikel . Für mich bedeutet die Umkehrung der Kontrolle, dass der sequentiell geschriebene Code in eine Delegierungsstruktur umgewandelt wird. Anstatt, dass Ihr Programm alles kontrolliert, richtet Ihr Programm eine Klasse oder Bibliothek mit bestimmten Funktionen ein, die aufgerufen werden, wenn bestimmte Dinge passieren.

    2. Es löst die Duplizierung von Code. In früheren Zeiten würden Sie beispielsweise Ihre eigene Ereignisschleife manuell schreiben und die Systembibliotheken nach neuen Ereignissen abfragen. Heutzutage teilen die meisten modernen APIs den Systembibliotheken einfach mit, welche Ereignisse Sie interessieren, und Sie werden informiert, wenn sie auftreten.

    3. Inversion der Kontrolle ist Ein praktischer Weg, um die Duplizierung von Code zu reduzieren. Wenn Sie eine ganze Methode kopieren und nur einen kleinen Teil des Codes ändern, können Sie es mit einer Umkehrung der Kontrolle in Betracht ziehen. Die Inversion der Kontrolle wird in vielen Sprachen durch das Konzept von Delegierten, Schnittstellen oder sogar rohen Funktionszeigern vereinfacht.

      Die Verwendung in allen Fällen ist nicht angemessen, da der Ablauf eines Programms auf diese Weise schwerer zu verfolgen ist. Dies ist eine nützliche Methode zum Entwerfen von Methoden, wenn eine Bibliothek erstellt wird, die wiederverwendet wird. Sie sollte jedoch im Kern Ihres eigenen Programms sparsam verwendet werden, es sei denn, ein Code-Duplizierungsproblem wird wirklich gelöst.

    4. < / ol>
    06 August 2008
    NilObject
  • Aber ich denke, man muss sehr vorsichtig damit umgehen. Wenn Sie dieses Muster überbeanspruchen, erstellen Sie ein sehr kompliziertes Design und noch komplizierteren Code.

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

    Wie auch immer: Seien Sie vernünftig. Designmuster sind gute Praktiken , aber keine zu predigende Bibel. Kleben Sie es nicht überall.

    07 August 2008
    Michal SznajderChris Meek
  • Angenommen, Sie sind ein Objekt. Und Sie gehen in ein Restaurant:

    Ohne IoC : Sie fragen nach "Apfel", und Sie erhalten immer Apfel, wenn Sie mehr verlangen.

    Mit IoC : Sie können nach "Obst" fragen. Sie können jedes Mal andere Früchte bekommen, wenn Sie serviert werden. B. Apfel-, Orangen- oder Wassermelone.

    Offensichtlich wird IoC bevorzugt, wenn Sie die Sorten mögen.

    27 July 2016
    Luo Jiong Hui
  • IoC / DI für mich gibt Abhängigkeiten zu den aufrufenden Objekten heraus. Super einfach.

    Die untechnische Antwort besteht darin, einen Motor in einem Auto auszutauschen, bevor Sie ihn einschalten. Wenn alles richtig funktioniert (die Schnittstelle), sind Sie gut.

    19 September 2008
    ferventcoder