Frage

Eine andere Möglichkeit, diese Frage zu stellen: Was ist Inversion of Control nach Ihnen

?

Ich stelle diese Frage, weil der Wikipedia-Artikel über IoC von einem Nicht-OO wurde entführt Erläuterung. Dies wird von der Diskussion genommen und ist aus dem Jahr 2007:

  

habe ich mir erlaubt, um die Seite neu zu schreiben, wie der vorherige Inhalt vollständig über durch sinnlose „objektorientierte“ genommen wurde Geschwätz ...

Ich sehe nicht, wie Inversion of Control keinen Sinn außerhalb der OO-Sprache macht. Es gibt bereits viele Erklärungen für die Kontrolle in prozeduralen Sprachen Aufgeben (Event-Programmierung ist ein) und rein funktionalen Sprachen werden ein Konzept wie Inversion of Control nicht benötigen, da sie Funktionen höherer Ordnung haben.

Auch in der Artikel wo Martin Fowler auf IoC erarbeitet er OO Beispiele ausschließlich behandelt.

So ist IoC ausschließlich ein OO-Konzept, und was ist es genau?

Für mich versucht IoC Funktionen in Daten innerhalb der Grenzen zu drehen, dass die meisten OO-Sprachen verhängen und versucht, diese Funktionen-as-Daten als Argumente an andere Funktionen übergeben. Das ist nicht der einzige Teil des IoC, aber es gibt einige davon.

Es gibt auch das Fabrik-Entwurfsmuster, in denen die Bäume von Objekten aufgebaut und konfiguriert werden, bevor sie weitergeleitet werden.

Für mich IoC ist ausschließlich ein OO-Konzept.

Was ist Ihre Antwort?

War es hilfreich?

Lösung

Sie schauen auf das theoretische Problem aus einer Implementations Sicht. Die erste Frage, die sich stellt sollte genau das, was Kontrolle tun Sie Invert

Dann werden Sie erkennen, dass es nicht, ob sein ein Objekt, eine Methode, Funktion oder Dingsbums ist egal, die herumgereicht wird, aber was tatsächlich der Code tut.

Kurz gesagt, wenn Sie Dependency Injection tun, kehren Sie die Kontrolle über die Erstellung und Verwendung von Abhängigkeiten (Ressourcen).

Wenn Sie eine Windows-API-Funktion einen Zeiger auf eine Callback-Funktion geben, geben Sie ihnen die Kontrolle über Ihre Funktion mit eigenen Parametern aufrufen.

Sie sehen also, IoC ist nur ein theoretisches Konzept, und natürlich kann es sein, verschiedene praktische Implementierungen davon.

Andere Tipps

Inversion of Control ist definitiv kein OO-Konzept.

IoC existiert und wird recht häufig in nicht-OO-Sprachen verwendet. Es ist sehr häufig in C, zum Beispiel. Ein gutes Beispiel hierfür ist die Windows-API -. Sie jederzeit alle Windows-API-Funktionen aufrufen, die über Rückrufe arbeiten, sind Sie im Grunde mit IoC in seiner primitivsten Form

Nehmen wir zum Beispiel einen Blick auf die EnumWindows Funktion. Mit diesem, übergeben Sie einen Funktionszeiger (EnumWindowsProc) zu einer Bibliothek, und den Code aus der Bibliothek Code ausführen.

Vergleichen Sie dies mit der Definition der Inversion of Control aus Wikipedia: "Invertierung der Steuerung auftritt, wenn ein Bibliotheksprozedur Benutzer Prozeduraufrufe (s)"

Es ist genau das gleiche.

Allerdings wirklich IoC wird sehr leistungsfähig, flexibel und einfach zu bedienen, wenn Sie ein reichhaltiges Typ-System hinzufügen, und viele der anderen Werkzeuge, die mit OOP kommen. Dies macht es häufiger, da es „schöner“ zu arbeiten, aber es hat bereits bestehen, bevor OOP.

Nun, das Konzept der „Inversion of Control“ scheint überall anwendbar Sie eine Möglichkeit haben, um Funktionszeiger zu übergeben. Grundsätzlich Plug-in-Konzepte und DLLs mit kompatibelen Signaturen (man denke an Treiber zum Beispiel) sind nichts anderes als eine Form von IoC.

Wenn jedoch IoC mit einer reichen Art und Container-Modell verwenden, müssen Sie im Grunde automatisch in der OO Welt sein. Und die Konzepte der OOP Karte sehr gut auf IoC Konzepte, vor allem in Sprachen, die Mehrfachvererbung mit rein virtuellen Klassen unterstützen (oder „Schnittstellen“, wie sie auch genannt werden).

In der Tat, die OO Implementierung von IoC ist recht aufwendig, da Funktionen sind oft nicht Bürger erster Klasse.

Wie Azder erwähnt: IoC für eine Vielzahl von Gründen verwendet wird. Ich werde einige hier zusammenfassen zu überzeugen:)

Iteration

#ruby
{1,2,3}.each{ |i| puts i }

#haskell
map [1,2,3] ( \i -> write i )

//the stl algorithms
int printint( int i ){ return printf( "%d", i ); }
std::foreach( onetwothree.begin(), onetwothree.end(), &printi );

Themen Schöpfung

CreateThread( NULL, 0, &myFunction, NULL, 0, NULL );

Allgemein Event Dispatching

//javascript
document.getElementById( "mybutton" )
            .addEventListener( 
                 function(e){ alert("buttonPressed") } );

Keines dieser Beispiele sind Object Oriented, q.e.d ..

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