Kluczem do pojemników DI jest abstrakcja . Kontenery DI stanowią streszczenie tego problemu dla Ciebie. Jak można się domyślić, ma zauważalny wpływ na kod, często tłumaczony na mniejszą liczbę konstruktorów, seterów, fabryk i konstruktorów. W rezultacie sprawiają, że Twój kod jest luźniej sprzężony (z powodu IoC ), czystszy i prostszy. Chociaż nie bez kosztów.
Tła
Wiele lat temu taka abstrakcja wymagała od nas pisania różnych plików konfiguracyjnych ( programowanie deklaratywne ). Fantastycznie było widzieć, że liczba LOC znacznie się zmniejsza, ale chociaż LOCS spadły, liczba plików konfiguracyjnych nieznacznie wzrosła. W przypadku średnich i małych projektów wcale nie było problemu, ale w przypadku większych projektów rozproszenie „zestawu kodu” o 50% między kodem a deskryptorami XML stało się uciążliwe ... Niemniej jednak głównym problemem było sam paradygmat. Było dość mało elastyczne, ponieważ deskryptory pozostawiły niewiele miejsca na modyfikacje.
Paradygmat stopniowo przechodził w stronę konwencji nad konfiguracją , która wymienia pliki konfiguracyjne na adnotacje lub atrybuty. Utrzymuje nasz kod w czystości i prostocie, zapewniając jednocześnie elastyczność, której XML nie mógł.
Prawdopodobnie jest to najważniejsza różnica w stosunku do dotychczasowego sposobu pracy. Mniej kodu i więcej magii.
Z drugiej strony ...
Konwencja dotycząca konfiguracji sprawia, że abstrakcja jest tak ciężka, że ledwo wiesz, jak to działa. Czasami wydaje się magia i pojawia się jeszcze jedna wada. Kiedy już działa, wielu programistów nie dba o to, jak to działa.
Jest to utrudnienie dla tych, którzy nauczyli się DI z pojemnikami DI. Nie w pełni rozumieją znaczenie wzorców projektowych, dobrych praktyk i zasad wyodrębnionych przez kontener. Zapytałem programistów, czy są zaznajomieni z DI i jego zaletami i odpowiedzieli: - Tak, użyłem Spring IoC -. (Co do diabła to znaczy?!?)
Z każdą z tych „wad” można się zgodzić lub nie. Moim skromnym zdaniem trzeba wiedzieć, co dzieje się w twoim projekcie. W przeciwnym razie nie rozumiemy tego w pełni. Warto również wiedzieć, do czego służy DI i mieć pojęcie, jak ją wdrożyć.
Na plus...
Jedno słowo wydajność . Ramy pozwalają skupić się na tym, co naprawdę ważne. Biznes aplikacji.
Pomimo skomentowanych niedociągnięć, dla wielu z nas (których praca jest uwarunkowana terminami i kosztami) narzędzia te są nieocenionym zasobem. Moim zdaniem powinien to być nasz główny argument za wdrożeniem kontenerów DI. Produktywność .
Testowanie
Niezależnie od tego, czy wdrożymy czystą DI, czy kontenery, testowanie nie będzie stanowić problemu. Wręcz przeciwnie. Te same pojemniki często dostarczają nam próbnych testów jednostkowych po wyjęciu z pudełka. Przez lata korzystałem z moich testów jako termometrów. Mówią mi, czy w dużym stopniu polegałem na obiektach kontenerowych. Mówię to, ponieważ te kontenery mogą inicjować prywatne atrybuty bez ustawiaczy i konstruktorów. Mogą wstrzykiwać komponenty prawie w dowolnym miejscu!
Brzmi kusząco, prawda? Bądź ostrożny! Nie wpadnij w pułapkę !!
Propozycje
Jeśli zdecydujesz się na wdrożenie kontenerów, zdecydowanie zalecam stosowanie dobrych praktyk. Kontynuuj wdrażanie konstruktorów, ustawiaczy i interfejsów. Wymuszaj użycie frameworka / kontenera . Ułatwi to możliwe migracje do innego frameworka lub jego usunięcie. Może znacznie zmniejszyć zależność od kontenera.
W odniesieniu do tych praktyk:
Kiedy stosować pojemniki DI
Moja odpowiedź będzie stronnicza z własnego doświadczenia, które jest głównie na korzyść kontenerów DI (jak skomentowałem, jestem bardzo skoncentrowany na wydajności, więc nigdy nie potrzebowałem czystej DI. Wręcz przeciwnie).
Myślę, że znajdziesz interesujący artykuł Marka Seemana na ten temat, który również odpowiada na pytanie, jak wdrożyć czystą DI .
Na koniec, jeśli mówimy o Javie, rozważyłbym najpierw JSR330 - Dependency Injection .
Zreasumowanie
Korzyści :
- Oszczędność kosztów i oszczędność czasu. Wydajność.
- Mniejsza liczba komponentów.
- Kod staje się prostszy i czystszy.
Wady :
- DI jest delegowany do bibliotek stron trzecich. Powinniśmy zdawać sobie sprawę z ich kompromisów, mocnych i słabych stron.
- Krzywa uczenia się.
- Szybko sprawiają, że zapominasz o dobrych nawykach.
- Zwiększenie zależności projektu (więcej bibliotek)
- Kontenery oparte na odbiciu wymagają więcej zasobów (pamięci). Jest to ważne, jeśli ograniczają nas zasoby.
Różnice z czystym DI :
- Mniej kodu i więcej plików konfiguracyjnych lub adnotacji.