W jaki sposób wstrzykiwanie zależności nie tylko przenosi złożoność do osobnej klasy?


9

W tym tygodniu zastanawiałem się nad użyciem frameworku Typhoon do wstrzykiwania zależności. Rozumiem, że rozdzielenie konstrukcji obiektów jest korzystne w przypadku zastępowania dowolnych komponentów próbkami podczas testów jednostkowych i do tej pory widziałem same korzyści.

Ale nie mogę przestać myśleć, że gdzie wcześniej miałem ogromną klasę kontrolera widoku, która miała dziesiątki importów nagłówków, teraz mam ogromną klasę fabryki, która ma dziesiątki importów nagłówków. Czy powinienem unikać masowej klasy fabrycznej?


6
Za dziesięć lat spodziewam się, że DI przejmie listę krytyków od Singletona, ale tym razem z dobrych powodów. Ma kilka dobrych zastosowań, ale sugeruję, aby bardzo uważnie oceniać wpływ.
Balog Pal

5
Nie sądzę, że wstrzykiwanie zależności jest sposobem na zmniejszenie złożoności, ale sposobem na uniknięcie ukrytych zależności (użycie symboli globalnych / zmiennych wolnych) na rzecz wyraźnych zależności (użycie parametrów jawnych / zmiennych powiązanych). Tak więc złożoność wciąż istnieje, ale jesteś zmuszony sobie z tym poradzić, ponieważ wyrażasz to wyraźnie w podpisach metod / konstruktorów.
Giorgio

7
Zauważ, że prawie każdy system do porządkowania kodu można opisać jako „przenoszenie złożoności gdzie indziej”. Nie chodzi o usuwanie złożoności, ale o organizowanie jej w najbardziej logiczny i użyteczny sposób.

1
Jeśli musisz zaimportować 50 nagłówków, musisz to gdzieś zrobić. DI pomaga w łatwiejszym sposobie testowania jednostkowego kodu.
7овић

2
Czy mówisz, że teraz kontroler koncentruje się na kontrolowaniu, a fabryka importu nagłówków koncentruje się na imporcie nagłówków? Jak to może być źle, niezależnie od tego, czy używasz frameworka DI, czy nie?
pdr

Odpowiedzi:


16

Wstrzykiwanie zależności pomaga po prostu określić, w jaki sposób jeden obiekt wie o innym obiekcie zależnym. To nie pomoże ci zmniejszyć ogólnej złożoności systemu. Jeśli potrzebowałeś dziesiątek importu przed DI, nadal będziesz potrzebował dziesiątek importu po. Różnica polega na tym, że importowanie odbywa się w lokalizacji (klasie), która ma większy sens (fabryka, konstruktor itp.).

Pozwalając na zapewnienie zależności za pomocą konstruktora lub metody, możesz sobie pozwolić na dostarczenie innej, ale wciąż ważnej, zależnej rzeczy do swojej klasy i zwiększyć spójność tej klasy poprzez usunięcie obaw.

Istnieje kilka zasad, które są podobne i są często stosowane razem: Wstrzykiwanie zależności (DI), Inwersja kontroli (IoC) i Zasada inwersji zależności (DIP)

Z tego artykułu http://martinfowler.com/articles/dipInTheWild.html

DI to okablowanie, IoC to kierunek, a DIP to kształt


2
+1 za ostatnią wycenę. To najlepsze wyjaśnienie tych 3 pojęć, które ludzie często źle rozumieją.
haylem,

Link do artykułu powyżej jest naprawdę wyjątkowy. Wystarczająco głębokie i bardzo jasne wyjaśnienie.
DemetriKots,

10

Wstrzykiwanie zależności nie zmniejsza złożoności, ale zwiększa zwrotność przez rozdzielenie problemów i zmniejszenie sprzężenia.

Ale nie mogę przestać myśleć, że gdzie wcześniej miałem ogromną klasę kontrolera widoku, która miała dziesiątki importów nagłówków, teraz mam ogromną klasę fabryki, która ma dziesiątki importów nagłówków. Czy powinienem unikać masowej klasy fabrycznej?

Powinieneś unikać „ogromnych” zajęć, kropka. Powiedzmy, że podzieliłeś kontroler widoku na mniejsze, łatwiejsze w utrzymaniu klasy. Teraz wszyscy są odpowiedzialni za opanowanie swoich zależności. DI pomaga przenieść to zarządzanie zależnościami ze wszystkich tych klas do klasy fabryki / konfiguracji, która jest odpowiedzialna tylko za zarządzanie zależnościami - patrz Zasada pojedynczej odpowiedzialności. I choć z pewnością będzie on znacznie mniej „ogromny” niż oryginalny kontroler widoku, jeśli stanie się zbyt duży, zawsze masz możliwość podzielenia go na mniejsze klasy zarządzania zależnościami, które są odpowiedzialne za różne części aplikacji.


2

Słowami laika:

Wstrzyknięcie zależności przenosi złożoność do miejsca, w którym powoduje mniej szkód.

EDYCJA dla @gnat: DI nie tylko przenosi złożoność do osobnej klasy, ale przenosi ją tam, gdzie powoduje mniej szkód.


Jak to odpowiada na zadane pytanie?
komar

@gnat dodał edycję, moja odpowiedź wyjaśnia moim zdaniem, w jaki sposób DI nie tylko przenosi złożoność do oddzielnej klasy.
Tulains Córdova
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.