2272 Stimmen

Was bedeutet Umkehrung der Kontrolle?

Inversion of Control (IoC) kann bei der ersten Begegnung mit dem Thema ziemlich verwirrend sein.

  1. Was ist das?
  2. Welches Problem wird damit gelöst?
  3. Wann ist es angebracht, es zu verwenden und wann nicht?

352 Stimmen

Das Problem bei den meisten dieser Antworten ist die verwendete Terminologie. Was ist ein Container? Inversion? Abhängigkeit? Erklären Sie es in Laiensprache ohne große Worte.

15 Stimmen

Siehe auch auf Programmers.SE: Warum heißt die Inversion der Kontrolle so?

12 Stimmen

Es handelt sich um Dependency Injection (DI) - siehe Martin Fowlers Beschreibung hier: martinfowler.com/articles/injection.html#InversionOfControl

1954voto

urini Punkte 30897

Le site Inversion-of-Control (IoC) Muster, geht es um die Bereitstellung jede Art de callback (der die Reaktion steuert), anstatt selbst direkt zu handeln (mit anderen Worten: Umkehrung und/oder Umleitung der Kontrolle an einen externen Handler/Controller). Die Dependency-Injection (DI) Muster ist eine spezifischere Version des IoC-Musters, bei dem es darum geht, Abhängigkeiten aus Ihrem Code zu entfernen.

Alle DI Umsetzung kann berücksichtigt werden IoC aber man sollte sie nicht als IoC weil die Implementierung von Dependency-Injection schwieriger ist als Callback (werten Sie Ihr Produkt nicht ab, indem Sie stattdessen den allgemeinen Begriff "IoC" verwenden).

Nehmen wir an, Ihre Anwendung hat eine Texteditor-Komponente und Sie möchten eine Rechtschreibprüfung anbieten. Ihr Standardcode würde etwa so aussehen:

public class TextEditor {

    private SpellChecker checker;

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

Was wir hier getan haben, schafft eine Abhängigkeit zwischen der TextEditor und die SpellChecker . In einem IoC-Szenario würden wir stattdessen etwas wie folgt 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 TextEditor Klasse hängt direkt von der SpellChecker classe.

Im zweiten Codebeispiel schaffen wir eine Abstraktion, indem wir die SpellChecker Abhängigkeitsklasse in TextEditor Konstruktorsignatur (keine Initialisierung der Abhängigkeit in der Klasse). Dies ermöglicht es uns, die Abhängigkeit aufzurufen und sie dann wie folgt an die Klasse TextEditor zu übergeben:

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

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

66 Stimmen

Ein gutes, klares Beispiel. Nehmen wir jedoch an, dass die ISpellChecker-Schnittstelle nicht an den Konstruktor des Objekts übergeben werden muss, sondern als einstellbare Eigenschaft (oder SetSpellChecker-Methode) zur Verfügung steht. Würde dies immer noch als IoC gelten?

35 Stimmen

Chainguy1337 - ja, das wäre es. Mit Setter wie das ist Setter Injektion im Gegensatz zu Konstruktor Injektion (beide Abhängigkeit Injektion Techniken) genannt. IoC ist ein ziemlich generisches Muster, aber Abhängigkeit Injektion erreicht IoC

290 Stimmen

Trotz der vielen "Up"-Stimmen ist diese Antwort falsch. Siehe bitte martinfowler.com/articles/injection.html#InversionOfControl . Beachten Sie insbesondere den Teil, in dem es heißt: "Die Umkehrung der Kontrolle ist ein zu allgemeiner Begriff und wird daher von den Menschen als verwirrend empfunden. Nach vielen Diskussionen mit verschiedenen IoC-Befürwortern haben wir uns daher auf den Namen Dependency Injection geeinigt.

796voto

Mark Harrison Punkte 281807

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

In einem Menü der alten Schule könnte das zum Beispiel so aussehen:

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 ähnlichem 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

Anstatt dass der Computer die Eingaben des Benutzers in einer festen Reihenfolge annimmt, bestimmt der Benutzer die Reihenfolge, in der die Daten eingegeben werden, und wann sie in der Datenbank gespeichert werden.

Im Grunde genommen, alles mit einer Ereignisschleife, Rückrufe oder Ausführungsauslöser fallen in diese Kategorie.

189 Stimmen

Schreiben Sie diesen Kerl nicht auf. technisch gesehen hat er recht. martinfowler.com/bliki/InversionOfControl.html IoC ist ein sehr allgemeines Prinzip. Der Kontrollfluss wird durch Dependency Injection "umgekehrt", da Sie Abhängigkeiten effektiv an ein externes System (z. B. IoC-Container) delegiert haben.

44 Stimmen

Ich stimme mit Schneiders Kommentar überein. 5 Abwertungen? Das ist doch die einzige Antwort, die wirklich richtig ist. Man beachte die Einleitung: wie ein Gui-Programm'. Dependency Injection ist nur die am häufigsten anzutreffende Umsetzung von IoC.

48 Stimmen

Dies ist in der Tat eine der wenigen richtig antwortet! Leute, IoC ist pas grundlegend über Abhängigkeiten. Ganz und gar nicht.

497voto

rpattabi Punkte 9414

Was bedeutet Umkehrung der Kontrolle?

Wenn Sie diese beiden einfachen Schritte befolgen, haben Sie die Umkehrung der Kontrolle erreicht:

  1. Separate was -Zu-Tun-Teil von wenn -Teil zu tun.
  2. Sicherstellen, dass wenn Teil bekannt als wenig wie möglich über was Teil; und umgekehrt.

Für jeden dieser Schritte gibt es verschiedene Techniken, die von der Technologie/Sprache abhängen, die Sie für Ihre Implementierung verwenden.

--

Le site Inversion Teil der Inversion of Control (IoC) ist das Verwirrende daran; denn Inversion ist der relative Term. Der beste Weg, IoC zu verstehen, ist, dieses Wort zu vergessen!

--

Beispiele

  • Ereignisbehandlung. Ereignisbehandler (Was-zu-Tun-Teil) -- Auslösen von Ereignissen (Wann-zu-Tun-Teil)
  • Dependency Injection. Code, der eine Abhängigkeit konstruiert (What-to-Do-Teil) - Instanziierung und Injektion dieser Abhängigkeit für die Clients bei Bedarf, was normalerweise von DI-Tools wie Dagger übernommen wird (When-to-Do-Teil).
  • Schnittstellen. Komponenten-Client (Wann-Tun-Teil) -- Implementierung der Komponenten-Schnittstelle (Was-Tun-Teil)
  • xUnit-Befestigung. Setup und TearDown (What-to-do-Teil) -- xUnit-Frameworks rufen Setup am Anfang und TearDown am Ende auf (When-to-do-Teil)
  • Entwurfsmuster für Schablonenmethoden. Schablonenmethode when-to-do-Teil -- primitive Unterklassenimplementierung what-to-do-Teil
  • DLL-Container-Methoden in COM. DllMain, DllCanUnload, usw. (was zu tun ist) -- COM/OS (wann zu tun ist)

2 Stimmen

Wie Sie sagen Schnittstellen. Component-Client (wenn-zu-Tun-Teil) als "wenn" macht keinen Sinn, wenn wir Schnittstellen verwenden (Bsp: Dependency Injection), wir abstrahieren es einfach und geben dem Client Flexibilität über das Hinzufügen einer Implementierung, aber es gibt kein "wenn" dort beteiligt. Ich stimme mit dem "wenn" im Falle des Auslösens von Ereignissen der Ereignisbehandlung überein.

1 Stimmen

Mit "Komponenten-Client" meinte ich den Benutzer/Client der Schnittstelle. Der Client weiß, "wann" er den "was zu tun ist"-Teil auslösen muss, unabhängig davon, ob eine Erweiterung der Funktionalität beabsichtigt ist oder nicht.

1 Stimmen

Werfen Sie einen Blick auf diesen wunderbaren Artikel von Martin Fowler. Er zeigt, wie Schnittstellen den grundlegenden Teil der Umkehrung der Kontrolle ausmachen: martinfowler.com/articles/injection.html#InversionOfControl

216voto

Luo Jiong Hui Punkte 5044

Bei der Umkehrung der Kontrolle geht es um die Trennung von Belangen.

Ohne IoC : Sie haben eine Laptop Computer und Sie zerbrechen versehentlich den Bildschirm. Und verflixt, Sie finden das gleiche Modell Laptop-Bildschirm ist nirgends auf dem Markt. So sind Sie stecken.

Mit IoC : Sie haben eine Desktop Computer und Sie zerbrechen versehentlich den Bildschirm. Sie können fast jeden Desktop-Monitor auf dem Markt kaufen, der gut zu Ihrem Desktop passt.

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

1 Stimmen

@Luo Jiong Hui Gute Erklärung.

8 Stimmen

Die meisten Designmuster, wenn nicht alle, haben ihre Entsprechung in unserem täglichen Leben, das wir so gut sehen und verstehen. Der effizienteste Weg, ein Entwurfsmuster zu verstehen, besteht darin, seine Entsprechungen im täglichen Leben zu kennen. Und ich glaube, davon gibt es viele.

20 Stimmen

Falsche Antwort. Sie erläutern Dependency Injection und nicht IoC. Siehe den Kommentar von Rogério zu diese Antwort oben

169voto

Luo Jiong Hui Punkte 5044

Bei der Inversion der Kontrolle (oder IoC) geht es um Freiheit erlangen (Wenn Sie heiraten, haben Sie Ihre Freiheit verloren und werden kontrolliert. Wenn Sie sich scheiden lassen, haben Sie gerade die Umkehrung der Kontrolle eingeführt. Das ist es, was wir "entkoppelt" nennen. Ein gutes Computersystem entmutigt einige sehr enge Beziehungen). mehr Flexibilität (In der Küche Ihres Büros gibt es nur sauberes Leitungswasser, das ist Ihre einzige Wahl, wenn Sie trinken wollen. Ihr Chef hat eine neue Kaffeemaschine aufgestellt, um die Kontrolle umzukehren. Jetzt haben Sie die Flexibilität, entweder Leitungswasser oder Kaffee zu trinken.) und geringere Abhängigkeit (Ihr Partner hat einen Job, Sie haben keinen Job, Sie sind finanziell von Ihrem Partner abhängig, also werden Sie kontrolliert. Wenn Sie einen Job finden, haben Sie die Umkehrung der Kontrolle erreicht. Ein gutes Computersystem fördert die Abhängigkeit).

Wenn Sie einen Desktop-Computer benutzen, haben Sie ihn gesklavt (oder sagen wir, kontrolliert). Sie müssen vor einem Bildschirm sitzen und auf ihn schauen. Mit der Tastatur tippen Sie und mit der Maus navigieren Sie. Und eine schlecht geschriebene Software kann Sie noch mehr versklaven. Wenn Sie Ihren Desktop durch einen Laptop ersetzen, dann kehren Sie die Kontrolle ein wenig um. Sie können ihn einfach mitnehmen und umherbewegen. Jetzt können Sie selbst bestimmen, wo Sie sich mit Ihrem Computer aufhalten, anstatt dass Ihr Computer Sie steuert.

Durch die Implementierung der Inversion der Kontrolle erhält ein Software-/Objektkonsument mehr Kontrolle/Optionen über die Software/Objekte, anstatt kontrolliert zu werden oder weniger Optionen zu haben.

Mit den oben genannten Ideen im Hinterkopf. Wir vermissen immer noch einen wichtigen Teil von IoC. Im Szenario von IoC ist der Software-/Objektkonsument ein hochentwickeltes 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 brauchen einen Ort und Werkzeuge (ein Software-Framework), um das Auto zu bauen. A traditionell Software-Framework wird wie eine Werkstatt mit vielen Werkzeugen sein. Die Arbeiter müssen also selbst einen Plan erstellen und die Werkzeuge benutzen, um das Auto zu bauen. Der Bau eines Autos ist kein einfaches Unterfangen, denn es wird für die Arbeiter sehr schwierig sein, richtig zu planen und zusammenzuarbeiten. A modern Der Software-Framework wird wie eine moderne Autofabrik mit allen Einrichtungen und Managern ausgestattet sein. Die Arbeiter müssen keinen Plan machen, die Manager (Teil des Frameworks, sie sind die klügsten Leute und haben den ausgeklügeltsten Plan gemacht) helfen bei der Koordinierung, damit die Arbeiter wissen, wann sie ihre Arbeit machen müssen (das Framework ruft Ihren Code auf). Die Arbeiter müssen nur flexibel genug sein, um alle Werkzeuge zu nutzen, die ihnen die Manager zur Verfügung stellen (indem sie Dependency Injection verwenden).

Obwohl die Arbeitnehmer die Kontrolle über die Verwaltung des Projekts auf der obersten Ebene an die Manager (den Rahmen) abgeben. Aber es ist gut, wenn einige Fachleute mithelfen. Dies ist das Konzept der IoC wirklich kommen aus.

Moderne Webanwendungen mit einer MVC-Architektur sind auf das Framework angewiesen, um URL-Routing zu betreiben und Controller für den Aufruf des Frameworks bereitzustellen.

Dependency Injection und Inversion of Control sind miteinander verwandt. Dependency Injection ist bei der Mikro Ebene und die Inversion der Kontrolle auf der Makro Ebene. Man muss jeden Bissen essen (DI implementieren), um eine Mahlzeit zu beenden (IoC implementieren).

33 Stimmen

Ich habe für den Vergleich von DI mit der Ehe und IoC mit der Scheidung gestimmt.

0 Stimmen

" Obwohl die Arbeitnehmer die Kontrolle über die Verwaltung des Projekts auf der obersten Ebene den Managern (dem Rahmen) überlassen. Aber es ist gut, einige Fachleute zu haben, die helfen. Das ist der eigentliche Ursprung des Konzepts von IoC. " - Zunächst liegt die Kontrolle beim Manager. Können Sie erklären, wie diese Kontrolle umgedreht wird? Mit der Hilfe von Fachleuten (welche Art von Fachleuten)? Wie?

0 Stimmen

@Istiaque Ahmed, im Vergleich zu einer Werkstatt, in der die Arbeiter die volle Kontrolle über alles haben, kontrollieren die Manager in einer modernen Autofabrik die Produktion. Die Arbeiter werden also nicht mehr kontrolliert, sondern kontrolliert. Seien Sie sich bewusst, dass Manager in diesem Zusammenhang Teil der modernen Autofabrik sind, nicht Teil der Arbeiter. Fachleute sind die Manager, die sich mit der Planung und Herstellung von Autos auskennen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X