Umkehrung des Kontrollflusses

Inversion of Control (IoC) ist ein Begriff, der im Zusammenhang mit der objektorientierten Programmierung ein Paradigma bezeichnet, bei dem ein mehrfach verwendbares Modul ein spezifisches Modul aufruft. Mit Modul werden abgegrenzte und eigenständige Teile einer Software bezeichnet - dabei kann es sich um Objekte oder Klassen handeln.

Die Umkehr des Kontrollflusses ist nicht zu verwechseln mit dem in der objektorientierten Programmierung gleichermaßen bekannten Prinzip von der Umkehr der Abhängigkeiten (Dependency Inversion Principle). Vielmehr kann die Umkehr des Kontrollflusses eine Folge von der Umkehr der Abhängigkeiten sein. Inversion of Control wird im allgemeinen Sprachgebrauch auch als die Anwendung des Hollywood-Prinzips dargestellt: "Don´t call us, we´ll call you". Für die Implementierung von IoC gibt es zwei Möglichkeiten - Dependency Lookup und Dependency Injection. IoC ist ein möglicher Weg, um Kopplungen zu verringern.

Sobald die Behandlung von Ereignissen von einem mehrfach verwendbaren Modul zur Verfügung gestellt werden soll, wird IoC verwendet. So rufen also nicht die spezifischen Module bei bestimmten Ereignissen die mehrfach verwendbaren Module auf, sondern umgekehrt ist das der Fall. Dabei kann das mehrfach verwendbare Modul auch als ein komplettes Framework ausgeführt sein, in dessen Rahmen dann die Klassen für spezifische und konkrete Anwendungen zusammengefasst sind. In IoC übernimmt dann das Framework die Rolle des Hauptprogramms und kümmert sich um den Lebenszyklus von Objekten. Dazu gibt das Framework eine Schnittstelle vor, die zunächst von den spezifischen Modulen implementiert werden muss, so dass diese dann anschließend vom Framework aufgerufen werden kann - man bezeichnet dies auch als Callback-Mechanismus. Es gibt dabei zwei mögliche Formen der Implementierung von IoC:

  • Dependency Lookup, dabei stellt ein Container Callbacks auf die Komponenten sowie einen Lookup-Kontext zur Verfügung. Verwendet wird dieser Ansatz beispielsweise bei Enterprise JavaBeans oder Apache Avalon. Dabei ist es Aufgabe der einzelnen Komponenten, den Lookup auf Ressourcen über entsprechende APIs des Containers zu realisieren.
  • Dependency Injection ist eine spezielle Ausprägung des IoC.

Nachfolgend wird erläutert, was IoC für die praktische Softwareentwicklung bedeuten kann.

Bei einem klassischen Ansatz ist es üblich, Klassen und deren Abhängigkeiten fest zu codieren. Dabei wird mit konkreten Klassen gearbeitet, die dann über Konstruktoren oder Properties entsprechende Abhängigkeiten erhalten.

Die konkrete Implementierung eines Objektes erzeugt Abhängigkeiten

Die konkrete Implementierung eines Objektes erzeugt Abhängigkeiten

Die Abbildung verdeutlicht diese Vorgehensweise - dabei ist LogManager direkt abhängig von der konkreten Implementierung von LogWriter. Damit wird bereits mit der Compilierung festgelegt, welche Interaktionen mit anderen Objekten ausgeführt werden. So sind Änderungen zur Laufzeit gar nicht möglich. Änderungen anderer Art können nur nach vorheriger Modifizierung des Quellcodes und wiederum anschließender Compilierung eingebracht werden.

Bei IoC erzeugt ein Container Instanzen und injiziert Abhängigkeiten

Bei IoC erzeugt ein Container Instanzen und injiziert Abhängigkeiten

Vorteilhafter ist es, wenn diese Vorgehensweise umgekehrt wird. Dabei erzeugt eine Komponente - der aus der Abbildung ersichtliche Container - die Objekte und entscheidet dynamisch zur Laufzeit, wie und in welcher Form konkrete Implementierungen zu verwenden sind. Da damit der Container die Kontrolle übernimmt spricht, man auch von Inversion of Control. Die Verwendung dieses Prinzips bedingt Abstraktionen wie Interfaces und die Nutzung von Abstrakten Klassen, um die Möglichkeit der dynamischen Beeinflussung realisieren zu können.

Informationen zum Artikel
Deutsch: Umkehrung des Kontrollflusses
Englisch: inversion of control - IoC
Veröffentlicht: 01.11.2013
Wörter: 524
Tags: Java
Links: Software, Objekt, Umkehr der Abhängigkeit, Implementierung, Dependency Injection
Übersetzung: EN
Sharing: