Dependency Inversion Principle (DIP)

Reguła Odwróconej Zależności jest ostatnią z pięciu zasad zawartych w skrócie SOLID. DIP czyli Dependency Inversion Principle mówi o tym, że moduły wysokopoziomowe nie powinny zależeć od modułów niskopoziomowych. Zarówno pierwsze jak i drugie powinny zależeć od abstrakcji. Dodatkowo abstrakcje nie powinny zależeć od szczegółów, to szczegóły powinny zależeć od abstrakcji. Innymi słowy klasa używająca innej klasy powinna używać jej nie bezpośrednio, a przez interfejs.

Przykład kodu bez użycia zasady:

public class Pracownik {
   public String Imie { get; set; }
}
public class RepozytoriumPracownikow {
   public void Dodaj(Pracownik pracownik) {
       //dodaj pracownika do bazy
   }
}
public class ObslugaPracownikow {
   RepozytoriumPracownikow repozytoriumPracownikow = new RepozytoriumPracownikow();
   public void Dodaj(Pracownik pracownik) {
       repozytoriumPracownikow.Dodaj(pracownik);
   }
}

W powyższym przykładzie klasa ObslugaPracownikow jest modułem wysokopoziomowym, natomiast klasa RepozytoriumPracownikow jest modułem niskopoziomowym. Jak możemy zauważyć klasa ObslugaPracownikow używa bezpośrednio klasy RepozytoriumPracownikow, czyli jest od niej zależna. Jest to złamanie Reguły Odwróconej Zależności.

Przykład kodu zgodnego z zasadą DIP:

public class Pracownik {
   public String Imie { get; set; }
}
public interface IRepozytoriumPracownikow {
   void Dodaj(Pracownik pracownik);
}
public class RepozytoriumPracownikow implements IRepozytoriumPracownikow {
   @Override	
   public void Dodaj(Pracownik pracownik) {
       //dodaj pracownika do bazy
   }
}
public class ObslugaPracownikow {
   private IRepozytoriumPracownikow iRepozytoriumPracownikow;
   public ObslugaPracownikow (IRepozytoriumPracownikow iRepozytoriumPracownikow) {
       this.iRepozytoriumPracownikow = iRepozytoriumPracownikow;
   }
   public void Dodaj(Pracownik pracownik) {
       iRepozytoriumPracownikow.Dodaj(pracownik);
   }
}

W powyższym kodzie klasa ObslugaPracownikow nie zależy już od klasy RepozytoriumPracownikow, a jedynie od abstrakcji. W tym przypadku jest to interfejs IRepozytoriumPracownikow. Dzięki takiemu zabiegowi udało się odwrócić zależności, czyli spełniliśmy regułę DIP.

Scroll to Top