Wprowadzenie do dependency Injection

Dzisiejszy post będzie taki bardziej pisany, żadnego kodu nie będzie dlatego, że dzisiaj jedynie wytłumaczę czym jest dependency injection, po co to jest, do czego służy itp w następnym poście już będzie kod.

 

Dyskusja o Dependency Injection

Jak to ktoś kiedyś powiedział „Każdy z nas prędzej czy później usłyszy słowo SOLID, niektórzy nasi przyjaciele powiedzą, że nasz kod powinien być SOLID-ny”

Dependency Injection jest bardzo związane z ostatnią zasadą dependency inversion, której „książkowa wersja” brzmi tak:

  • Wysokopoziomowe moduły nie powinny zależeć od modułów niskopoziomowych – zależności między nimi powinny wynikać z abstrakcji.
  • Abstrakcje nie powinny zależeć od szczegółów. To szczegóły powinny zależeć od abstrakcji.

Inversion of control to również bardzo ważny termin związany z Dependency Injection. Taka moja krótka regułka wyjaśniająca inversion of control brzmi „W klasycznej aplikacji to kod programisty wywołuje funkcje z zewnątrznych bibliotek, natomiast w podejściu IoC to zewnątrzny framework wywołuje kod programisty”.

No dobra, ale co Dependency injection ma wspólnego z tymi dwoma pojęciami? Cóż, wszystko 🙂 Dependency inversion wyjaśnia jak powinien wyglądać kod, żeby zależności tego kodu wynikały z abstrakcji a żeby nie musiały ciągnać za sobą masy referencji bez których nie będą działać.

Jedynie Dependency Injection pokazuje już gotowe rozwiązania jak zaimplementować zasady Dependency Inversion oraz Inversion of control w praktyce.

Okej, po kolei 🙂

  • Dependency inversion tłumaczy nam jak pisać luźno powiązane ze sobą klasy, głównie chodzi o to, żeby unikać new() w klasach bo głównie to słówko robi problemy z zależnościami, że trzeba jakieś referencje później zaciągać po jakiś zmianach w kodzie 🙂 .
  • Inversion of control mówi nam o zależnościach jak klasy powinny zależeć od siebie, żeby nie umieszczać w klasie typu konkretnego innej klasy tylko jej interfejsu, żeby ta klasa zależała od abstrakcji.
  • A dependency injection mówi nam jak zastosować inversion of control no bo bądźmy poważni 🙂 okej interfejsy to abstrakcje, ale w jakiś sposób musimy typ konkretny przypisać do tego interfejsu 🙂

Jeśli będziesz znał dependency Injection to już nie będziesz musiał martwić się, że jak zmienisz coś w jakiejś klasie to czy to nie wywoła błędu w innej klasie od niej zależnej, więc warto szybko nauczyć się dependency injection kiedy mamy już trochę tych zależności z innych klas.

I jak będziemy znać Dependency Injection to będziemy kozakami 🙂

Kolejny bardzo duża zaleta Dependency Injection jest taka, że kiedy nasz kod nie będzie już ciągnął za sobą masy zależności będzie go o wiele łatwiej przetestować, nie będzie trzeba bawić się w mockowanie tych wszystkich klas, których testowana klasa potrzebuje do działania, ponieważ w testowanej klasie nie będzie referencji do klas o typach konkretnych, tylko ich interfejsy.

Czyli wykorzystując zalety niesione przez dependency Injection otrzymamy o wiele bardziej czytelny i elastyczny kod i co za tym idzie łatwiejszy w utrzymaniu i testowaniu.

Później w przykładach z dependency injection będe wykorzystywał testy jednostkowe, ale na ten temat materiałów jest dużo w sieci oraz gdy już wszystko powiemy na temat dependency Injection to wtedy prawdopodobnie pojawią się materiały na temat testów jednostkowych 🙂

I to nie jest prawda co ta Pani poniżej mówi 😂😂😂

Może a testach stracimy trochę czasu na początku, ale później nam się to zwróci, bo nie będziemy musieli co chwilę poprawiać bugów.

 

Dependency injection frameworks

Takie frameworki jak np Weld, Spring, Guice, Play framework, Salta, Glassfish HK2, Dagger wspierają dependency injection, ale nie są konieczne by zaimplementować dependency injection.

 

Struktura

A jak wygląda diagram dependency injection? Martin Fowler opisuje to tak:

Klasa MovieLister jest zależna od klasy MovieFinder oraz jego interfejsu, czyli po prostu klasa MovieFinder jest wstrzykiwana do klasy MovieLister, naturalnie rzecz biorąc typem wstrzykiwanej klasy będzie jej interfejs, żeby zależność ta pochodziła z abstrakcji 🙂

 

Zalety

  • Dependency injection umożliwia klientowi elastyczność konfigurowania. Tylko zachowanie klienta jest naprawione. Klient może działać we wszystkim co obsługuje wewnętrzny interfejs na którego oczekuje.
  • Dependency Injection zmniejsza powiązanie między klasą a jej zależnością.
  • Jako, że Dependency injection nie wymaga żadnych zmian w zachowaniu kodu, to można to zastosować do refaktoryzacji dotychczasowego kodu. Rezultatem są klienci, którzy są bardziej niezależni i łatwiejsi to testowania w izolacji za pomocą stubów i różnych atrap.
  • W dependency injection klient nie musi wiedzieć co dokładnie znajduje się w kodzie którego musi użyć. W związku z tym pomaga to odizolować klienta od zmian w projekcie co przekłada się na większą elastyczność, testowalność i łatwość konserwacji.
  • Dependency injection umożliwia jednoczesny lub niezależny rozwój projektu. To znaczy, że np załóżmy czterech programistów może tworzyć niezależnie od siebie klasy, które będą wykorzystywały siebie nazwzajem a jednocześnie będą musiały znać jedynie interfejsy przez, które będą się komunikować klasy.

 

Wady

  • Dependency injection zmusza do złożoności aby wyjść z klas i powiązań między klasami, które nie zawsze są łatwe do zarządzania.
  • Dependency injection może uzależniać od tego schematu wstrzykiwania zależności a jak wiemy nadmierne korzystanie z wzorców powoduje dużo problemów 🙂
  • Dependency injection wymaga opracowania z góry, przemyślanego działania tworzenia zależności między klasami, np mamy klasę A i interfejs B, ale nie mamy klasy C, która musi wykorzystać interfejs B w takim wypadku musimy przemyśleć czy to wszystko ma ręce i nogi.
  • Dependency injection sprawia, że kod jest trudniejszy do wykrycia, ponieważ oddziela zachowanie od konstrukcji systemu. Oznacza to, że trzeba śledzić większą ilość plików aby obserwować działanie systemu.

Pomimo tych wszystkich wad, których i tak można po części uniknąć, jeśli nie będzimy nadużywać DI to i tak dependency injection, żeby uniknąć masy zależności jest jak najbardziej warty użycia.

Spokojnie 🙂 w następnym artykule będą już przykłady z kodem 🙂

 

Podsumowanie

Na razie wiemy po co mniej więcej jest dependency injection i do czego może się przydać, w następnym artykule będziemy już wstrzykiwać zależności na konkretnym przykładzie.

Standardowo, przypominam o newsletterze, którym wysyłam powiadomienia o nowych wpisach oraz dodatkowe informacje na temat, ogółem mówiąc, świecie IT.

KONIECZNIE dołącz do społeczności DevmanCommunity na fb, części społeczności jest w jednym miejscu 🙂

-strona na fb: Devman.pl-Sławomir Kowalski

-grupa na fb: DevmanCommunity

Pytaj, komentuj pod spodem na końcu wpisu, podziel się nim, oceń go, rób co wolisz🙂

Do następnego ! Do zobaczenia 🙂

 
Jeśli ten wpis ci się przydał podziel się nim ze swoimi znajomymi :)

Post a comment

Be first!

avatar
  Subscribe  
Notify about