Dependency Inversion Principle - 5 zasada SOLID

Zasada odwrócenia zależności.


Zasada odwrócenia zależności mówi, że:

  • kod z warstw z wyższego poziomu nie powinien zależeć od kodu z niższych warstw. Obie warstwy za to powinny być zależne od abstrakcji,
  • abstrakcje nie powinny zależeć od szczegółów a więc konkretnej implementacji. Natomiast szczegóły, czyli implementacja powinna zależeć od abstrakcji.
Głównym celem stosowania DIP (Dependency Inversion Principle) jest oddzielenie wysoko poziomowych komponentów aplikacji od komponentów nisko poziomowych. Pomiędzy komponentami wysoko poziomowymi a nisko poziomowymi powinna się znajdować warstwa abstrakcji, pozwalająca na uniezależnienie warstw. Dzięki takiemu rozwiązaniu możliwa jest zamiana jednej warstwy bez wprowadzania zmian na innym poziomie. Przykładowo warstwa biznesowa aplikacji korzysta z warstwy dostępu do danych. Aby usunąć bezpośrednie zależności pomiędzy warstwami, część biznesowa nie może posiadać referencji bezpośrednio do warstwy dostępu do danych. Referencje powinny być wstrzykiwane przez konstruktor, co w zależności od wstrzykniętego typu pozwala nam operować na innej warstwie dostępu do danych.

Przykładowy kod wykorzystujący wstrzyknięcie przez konstruktor:

class Biznesowa
{
    private IDataContext _context = null;
    public Biznesowa(IDataContext context)
    {
        _context = context;
    }
    public void DodaDoBazy()
    {
        _context.Baza.Add(new Wpis());
    }
}
W powyższym przykładzie wstrzykujemy obiekt implementujący interfejs IDataContext. Nie ma znaczenia, jaki to jest konkretnie obiekt może to być obiekt dostępu do bazy danych lub do plików tekstowych. Ważne jest tylko, aby implementował interfejs dostępu do danych. Oprócz wstrzykiwania zależności przez konstruktor istnieje również możliwość wstrzykiwania przez właściwości lub parametry metod. Dependency Inversion zostanie dokładniej opisane w kolejnych rozdziałach przy okazji Inversion of Control.



Komentarze facebook (polub nasz profil na FB aby je zobaczyć):
Ukryj menu