Dependency Inversion Principle

Dependency Inversion Principle

Das Dependency Inversion Principle (DIP; dt. "Abhängigkeits-Invertierungs-Prinzip") ist ein Prinzip beim Objektorientierten Entwurf von Software. Es beschäftigt sich mit der Abhängigkeit von Modulen.

Strukturierung von Modulen nach DIP

Im allgemeinen wird das DIP beschrieben durch:

Module hoher Ebenen sollten nicht von Modulen niedriger Ebenen abhängen.
Beide sollten von Abstraktionen abhängen.
Abstraktionen sollten nicht von Details abhängen.
Details sollten von Abstraktionen abhängen.

Inhaltsverzeichnis

Das Problem

Objektorientierte Entwürfe werden in Module strukturiert, die unterschiedliche Verantwortlichkeiten umsetzen. Eine gängige Praxis ist das Anordnen der Module in Ebenen. Um so niedriger das Modul, umso spezieller sind die Vorgänge, die es definiert. In den Modulen höherer Ebenen werden allgemein Abläufe gegeben, in welchen Module niedrigerer Ebenen benutzt werden.

Das entstehende Problem ist die Abhängigkeit der höheren Ebene zu der niedrigeren. Änderungen im niedrigeren Modul führen unweigerlich zu Änderungen im höheren Modul. Dies widerspricht aber dem eigentlichen Ansatz der Hierarchie.

Lösungsansatz von DIP

Der Lösungsansatz ist die Invertierung der Abhängigkeit. Das Modul der höheren Ebene definiert die Schnittstelle, mit der es arbeitet. Module niedrigerer Ebene realisieren die Schnittstelle.

Beispiel

Wir betrachten ein einfaches Knopf-Lampe-Modell. Das Drücken des Knopfes soll die Lampe an- und ausstellen.

Eine einfache Implementierung in Java:

public class Lampe {
 
   private boolean leuchtet = false;
 
   public void anstellen() {
      leuchtet = true;
   }
 
   public void ausstellen() {
      leuchtet = false;
   }
 
}
 
public class Knopf {
 
   private Lampe lampe;
 
   private boolean gedrueckt;
 
   public Knopf(Lampe lampe) {
      this.lampe = lampe;
   }
 
   public void drueckeKnopf() {
      gedrueckt = !gedrueckt;
      if(gedrueckt) {
         lampe.anstellen();
      } else {
         lampe.ausstellen();
      }
   }
 
}

Knopf steuert den Ablauf des Verhaltens und benutzt dazu Lampe. Demnach sollte es einem Modul höhere Ebene angehören. Jedoch verletzt das beschriebene Modell DIP, da Knopf abhängig von Lampe ist. Wird entschieden, dass die Methoden von Lampe umbenannt werden, muss auch Knopf geändert werden.

Das grundlegende Problem ist, dass Knopf direkt mit Lampe arbeitet, welches zu einem niedrigeren Modul gehört. Knopf sollte selbst definieren, wie das Objekt aussehen sollte, mit dem es arbeitet.

Die Lösung in Java:

public Interface KnopfKlient {
 
   public void geheAn();
 
   public void geheAus();
 
}
 
public class Knopf {
 
   private KnopfKlient klient;
 
   private boolean gedrueckt;
 
   public Knopf(KnopfKlient klient) {
      this.klient= klient;
   }
 
   public void drueckeKnopf() {
      gedrueckt = !gedrueckt;
      if(gedrueckt) {
         klient.geheAn();
      } else {
         klient.geheAus();
      }
   }
 
}
 
public class LampeDIP implements KnopfKlient{
 
   private leuchtet = false;
 
   public void geheAn() {
      leuchtet = true;
   }
 
   public void geheAus() {
      leuchtet = false;
   }
 
}

Die Schnittstelle KnopfKlient gehört zum gleichen Modul wie Knopf. Spezifischere Module müssen diese Schnittstelle realisieren, damit Knopf mit ihnen arbeiten kann. Somit wurde die Abhängigkeit invertiert.

Zusätzlich zu dem Brechen der Abhängigkeit wurde ein weiterer Vorteil erarbeitet: Knopf kann nun mit beliebigen Klienten arbeiten.

Das Beispiel lässt sich weiterführen. Knopf selbst wird vermutlich von einem anderen Modul aus genutzt, das entscheidet, wann der Knopf gedrückt wurde. Demnach sollte dieses Modul wiederum eine Schnittstelle definieren, das Knopf realisieren muss.

Weblinks

Artikel von Robert C. Martin

Literatur

  • Robert C. Martin: The Dependency Inversion Principle. 5/1996

Wikimedia Foundation.

Игры ⚽ Поможем решить контрольную работу

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Dependency inversion principle — In object oriented programming, the dependency inversion principle refers to a specific form of decoupling where conventional dependency relationships established from high level, policy setting modules to low level, dependency modules are… …   Wikipedia

  • Dependency Inversion Principle — …   Википедия

  • Dependency Inversion Prinzip — Das Dependency Inversion Principle (DIP; dt. Abhängigkeits Invertierungs Prinzip ) ist ein Prinzip beim Objektorientierten Entwurf von Software. Es beschäftigt sich mit der Abhängigkeit von Modulen. Strukturierung von Modulen nach DIP Im… …   Deutsch Wikipedia

  • Inversion De Contrôle — L inversion de contrôle (Inversion of Control, IoC) est un patron d architecture commun à tous les frameworks (ou cadre de développement et d exécution). Il fonctionne selon le principe que le flot d exécution d un logiciel n est plus sous le… …   Wikipédia en Français

  • Inversion de controle — Inversion de contrôle L inversion de contrôle (Inversion of Control, IoC) est un patron d architecture commun à tous les frameworks (ou cadre de développement et d exécution). Il fonctionne selon le principe que le flot d exécution d un logiciel… …   Wikipédia en Français

  • Inversion of control — In software engineering, Inversion of Control (IoC) is an abstract principle describing an aspect of some software architecture designs in which the flow of control of a system is inverted in comparison to procedural programming. In traditional… …   Wikipedia

  • Inversion of Control — Der Begriff Inversion of Control (IoC; deutsch: „Umkehrung der Steuerung“ oder „Steuerungsumkehr“) bezeichnet ein Umsetzungsparadigma, das in der objektorientierten Programmierung Anwendung findet. Dieses Paradigma beschreibt die Arbeitsweise von …   Deutsch Wikipedia

  • Hollywood Principle — In computer programming, the Hollywood Principle is stated as don t call us, we ll call you. It has applications in software engineering; see also implicit invocation for a related architectural principle. OverviewThe Hollywood principle is a… …   Wikipedia

  • Injection de dépendance — Inversion de contrôle L inversion de contrôle (Inversion of Control, IoC) est un patron d architecture commun à tous les frameworks (ou cadre de développement et d exécution). Il fonctionne selon le principe que le flot d exécution d un logiciel… …   Wikipédia en Français

  • Prinzipien Objektorientierten Designs — sind Prinzipien welche zu gutem objektorientierten Design führen sollen. Sie wurden neben anderen von Robert C. Martin, Bertrand Meyer und Barbara Liskov publiziert und propagiert. Viele Techniken der Objektorientierung wie Entwurfsmuster, Domain …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”