Definition „Steuerungsumkehr“ Was bedeutet Inversion of Control?

Von Stephan Augsten |

Inversion of Control ist ein Design-Prinzip bzw. Entwicklungsparadigma, bei dem der Kontrollfluss einer Anwendung an andere Stelle ausgelagert wird. Ein häufig zu findendes Beispiel ist, dass ein Framework die Steuerung bestimmter Programmteile übernimmt.

Anbieter zum Thema

Bei der Steuerungsumkehr wird der Kontrollfluss einer Anwendung extern, beispielsweise an das zugrunde liegende Framework, ausgelagert.
Bei der Steuerungsumkehr wird der Kontrollfluss einer Anwendung extern, beispielsweise an das zugrunde liegende Framework, ausgelagert.
(Bild: geralt / Pixabay )

Das Programmierprinzip Inversion of Control (IoC) kehrt den herkömmlichen Kontrollfluss eines Programms um. Ohne IoC sähe der Kontrollfluss so aus, dass der vom Entwickler geschriebene Programmcode Ressourcen aus Bibliotheken aufruft, um diese zu nutzen. Die Objekte sind statisch miteinander verbunden.

Wird der Kontrollfluss per Inversion of Control umgekehrt, greift stattdessen der Code aus dem Framework dynamisch auf den benutzerdefinierten Code des Entwicklers zu. Framework und benutzerdefinierter Code sind nur noch lose gekoppelt.

Vorteile von Inversion of Control

Viele Vorteile der Steuerungsumkehr hängen damit zusammen, dass Abhängigkeiten wie bereits erwähnt nur noch lose miteinander gekoppelt sind. Oder allgemeiner gesagt: Die Implementierung und das Ausführen einer Aufgabe werden durch Inversion of Control voneinander entkoppelt.

Das bedeutet, dass die wiederverwendbaren Teile des Codes, die häufiger und an verschiedenen Stellen des Programms nützlich sind, unabhängig von den Stellen entwickelt werden können, an denen ein spezifisches Problem gelöst wird. Sie mögen zwar insgesamt nur gemeinsam zum gewünschten Ergebnis führen, müssen aber nicht zeitgleich entwickelt oder angepasst werden. Weiter gedacht ergibt sich so der Vorteil, dass es leichter wird, zwischen unterschiedlichen Implementierungen (z. B. von einem Framework) zu wechseln.

Programme lassen sich zudem einfacher modular gestalten, vor allem wenn es um komplexen Code geht. Anders ausgedrückt fällt es leichter, Module unabhängiger vom Rest des Codes zu gestalten. Es kann z. B. mehr Fokus auf Module gelegt werden, die kompakt und auf eine bestimmte Aufgabe zugeschnitten sind. Auch gibt es weniger unvorhergesehene Auswirkungen auf das gesamte Projekt, wenn ein einzelnes Modul ausgetauscht wird. Ebenso kann das Testen der Software einfacher werden, wenn die Komponenten besser voneinander isoliert gehalten werden.

Nachteile von Inversion of Control

Das Umkehren des Kontrollflusses ist in vielen Fällen eine sinnvolle Option, um ein komplexes System wartbar und übersichtlich zu halten. Man sollte dennoch genau prüfen, ob es wirklich der richtige Ansatz ist. Denn IoC bedeutet auch einen höheren Aufwand bei Entwurf, Implementierung und Wartung von Software.

Es gibt Szenarien, in denen sich diese Mehrarbeit nicht bezahlt macht oder zum aktuellen Zeitpunkt im Konflikt mit den höher eingestuften Qualitätskriterien des Projekts steht. Wenn z. B. oberste Priorität hat, dass man schnell erste Ergebnisse sieht oder die Tauglichkeit eines Konzepts nachweisen kann, kann es besser sein, erst zu einem späteren Zeitpunkt auf Inversion of Control umzustellen.

Beispiele für Entwurfsmuster, die auf Inversion of Control basieren:

Dependency injection: Ein Objekt verwaltet seine Abhängigkeiten nicht selbst, sondern bekommt sie von einem separaten Stück Code zugewiesen. Die Abhängigkeiten sind an einer eigenen Komponente hinterlegt und können so übersichtlicher verwaltet werden.

Service Locator Pattern: Der Service Locator, ein zentrales Register, dient als Vermittler und gibt auf Anfrage alle Informationen weiter, die für die angefragte Aufgabe gebraucht werden. So können verschiedene Teile einer Bibliothek voneinander abgekapselt existieren und über den Service Locator trotzdem verbunden werden.

Strategy Pattern: Zur Laufzeit wird über eine vermittelnde Klasse einer von mehreren Algorithmen abhängig vom Kontext ausgewählt.

(ID:48204165)