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

108voto

ahe Punkte 2159

Bevor Sie die Umkehrung der Kontrolle anwenden, sollten Sie sich darüber im Klaren sein, dass sie ihre Vor- und Nachteile hat, und Sie sollten wissen, warum Sie sie anwenden, wenn Sie sie anwenden.

Vorteile:

  • Ihr Code wird entkoppelt, so dass Sie die Implementierungen einer Schnittstelle problemlos durch alternative Implementierungen ersetzen können
  • Es ist ein starker Motivator für die Kodierung gegen Schnittstellen anstelle von Implementierungen
  • Es ist sehr einfach, Unit-Tests für Ihren Code zu schreiben, weil er von nichts anderem abhängt als von den Objekten, die er in seinen Konstruktoren/Setzern akzeptiert, und Sie können sie leicht mit den richtigen Objekten isoliert initialisieren.

Nachteile:

  • IoC kehrt nicht nur den Kontrollfluss in Ihrem Programm um, sondern trübt ihn auch erheblich. Das bedeutet, dass Sie Ihren Code nicht mehr einfach nur lesen und von einer Stelle zur anderen springen können, weil die Verbindungen, die sich normalerweise in Ihrem Code befinden würden, nicht mehr im Code zu finden sind. Stattdessen befinden sie sich in XML-Konfigurationsdateien oder Annotationen und im Code Ihres IoC-Containers, der diese Metadaten interpretiert.
  • Es gibt eine neue Klasse von Fehlern, bei denen die XML-Konfiguration oder die Annotationen falsch sind und man viel Zeit damit verbringen kann, herauszufinden, warum der IoC-Container unter bestimmten Bedingungen eine Null-Referenz in eines der Objekte injiziert.

Ich persönlich sehe die Stärken von IoC und ich mag sie wirklich, aber ich neige dazu, IoC zu vermeiden, wann immer es möglich ist, weil es Ihre Software in eine Sammlung von Klassen verwandelt, die nicht mehr ein "echtes" Programm darstellen, sondern nur etwas, das durch XML-Konfiguration oder Annotationsmetadaten zusammengesetzt werden muss und ohne sie auseinanderfallen würde (und fällt).

3 Stimmen

Die erste Behauptung ist falsch. Idealerweise sollte es nur eine Verwendung des IOC-Containers in Ihrem Code geben, und das ist Ihre Hauptmethode. Alles andere sollte von dort aus kaskadieren

26 Stimmen

Ich denke, was er meint, ist, Sie können nicht einfach lesen: myService.DoSomething() und gehen Sie zu der Definition von DoSomething, weil mit IoC, myService ist nur eine Schnittstelle, und die tatsächliche Implementierung ist Ihnen unbekannt, es sei denn, Sie gehen es in xml-Konfigurationsdateien oder die Hauptmethode nachschlagen, wo Ihre IOC eingerichtet wird.

9 Stimmen

Hier hilft Resharper - "click go to implementation" gegen die Schnittstelle. Vermeiden von IoC (oder genauer gesagt DI aus Ihrem Beispiel) bedeutet wahrscheinlich auch, dass Sie nicht richtig testen

78voto

Ecton Punkte 10572
  1. Wikipedia-Artikel . Für mich bedeutet die Umkehrung der Kontrolle, dass Ihr sequentiell geschriebener Code in eine Delegationsstruktur umgewandelt wird. Anstatt dass Ihr Programm explizit 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 Code-Duplizierung. Früher musste man beispielsweise manuell eine eigene Ereignisschleife schreiben und die Systembibliotheken nach neuen Ereignissen abfragen. Heutzutage teilen Sie den Systembibliotheken bei den meisten modernen APIs einfach mit, an welchen Ereignissen Sie interessiert sind, und diese teilen Ihnen mit, wenn sie eintreten.

  3. Die Umkehrung der Kontrolle ist ein praktisches Mittel, um die Duplizierung von Code zu reduzieren. Wenn Sie feststellen, dass Sie eine ganze Methode kopieren und nur einen kleinen Teil des Codes ändern, können Sie die Umkehrung der Kontrolle in Betracht ziehen. Die Umkehrung der Kontrolle wird in vielen Sprachen durch das Konzept von Delegaten, Schnittstellen oder sogar Funktionszeigern erleichtert.

    Sie ist nicht in allen Fällen sinnvoll, da der Ablauf eines Programms auf diese Weise schwieriger zu verfolgen sein kann. Es ist ein nützlicher Weg, um Methoden zu entwerfen, wenn man eine Bibliothek schreibt, die wiederverwendet werden soll, aber es sollte sparsam im Kern des eigenen Programms verwendet werden, es sei denn, es löst wirklich ein Problem mit doppeltem Code.

41 Stimmen

Ich finde den Wikipedia-Artikel sehr verwirrend und verbesserungsbedürftig. Sehen Sie sich die Diskussionsseite an, um zu lachen.

2 Stimmen

Das Schreiben einer eigenen Ereignisschleife könnte immer noch eine Umkehrung der Kontrolle sein, wenn diese Ereignisschleife den Platz eines Frameworks einnimmt und der Rest des Codes das IoC-Prinzip verwendet, haben Sie gerade Ihr eigenes Framework geschrieben. Das ist eigentlich nichts Schlechtes, denn es erhöht die Lesbarkeit um den Preis, dass man nur ein bisschen mehr kodieren muss (was auch nicht immer sinnvoll ist).

52voto

Luo Jiong Hui Punkte 5044

Angenommen, Sie sind ein Objekt. Und du gehst in ein Restaurant:

Ohne IoC Sie fragen nach "Apfel" und bekommen immer einen Apfel serviert, wenn Sie mehr verlangen.

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

Daher ist IoC natürlich zu bevorzugen, wenn man die Vielfalt mag.

50voto

user2330678 Punkte 2051

Ich beantworte nur den ersten Teil. Was ist das?

Inversion of Control (IoC) bedeutet, dass zuerst Instanzen von Abhängigkeiten und dann eine Instanz einer Klasse erstellt werden (optional durch Injektion mittels Konstruktor), anstatt zuerst eine Instanz der Klasse zu erstellen und dann die Klasseninstanz Instanzen von Abhängigkeiten zu erstellen. Somit bedeutet die Umkehrung der Kontrolle invertiert el Kontrollfluss des Programms. Anstelle von el Anrufersteuerung el Kontrollfluss (beim Erstellen von Abhängigkeiten), die der Aufrufer kontrolliert den Kontrollfluss des Programms .

1 Stimmen

Es geht nicht um die Erstellung von Klassen oder Objekten, siehe hier martinfowler.com/articles/injection.html#InversionOfControl

1 Stimmen

In meinen 15 Jahren als Programmierer ist dies bei weitem die klarste Erklärung dessen, was IoC ist. Danke! Die wichtigste Antwort sagt nicht es geht um die Erstellung von Klassen oder Objekten, bei allem Respekt. Es wird erklärt, was die Umkehrung der Kontrolle ist, indem die Erstellung von Klassen als Beispiel verwendet wird :) Und der Autor verwendet ein Minimum an Sätzen und Worten, um die Antwort zu vermitteln! Bei allem Respekt, diese Antwort ist die beste in diesem Artikel. WARUM ist sie einer der letzten Einträge, die zu finden sind ...

0 Stimmen

Dies ist eine sehr gute Erklärung. Dankeschön

47voto

Michal Sznajder Punkte 9207

Aber ich denke, man muss sehr vorsichtig damit sein. Wenn man dieses Muster zu oft verwendet, wird das Design sehr kompliziert und der Code noch komplizierter.

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 Unit-Tests oder so etwas schreiben ...

Wie auch immer: seien Sie vernünftig. Entwurfsmuster sind bewährte Verfahren aber keine Bibel, die gepredigt wird. Kleben Sie sie nicht überall auf.

5 Stimmen

Woher wissen Sie, dass Sie nur eine Rechtschreibprüfung haben werden?

0 Stimmen

@Trace Sie könnten zum Beispiel wissen, wie das Programm, das Sie schreiben wollen, verwendet wird. Dennoch sind einige Techniken, wie z.B. Dependency Injection, so billig, dass es kaum einen Grund gibt, sie in einem Fall wie diesem nicht zu verwenden.

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