Na stronie Wikipedii dotyczącej wstrzykiwania zależności, sekcja wad mówi:
Wstrzykiwanie zależności zwiększa sprzężenie, wymagając od użytkownika podsystemu zaspokojenia potrzeb tego podsystemu.
z linkiem do artykułu przeciw wstrzykiwaniu zależności .
Wstrzykiwanie zależności powoduje, że klasa korzysta z interfejsu zamiast konkretnej implementacji. To powinno skutkować zmniejszeniem sprzężenia , prawda?
czego mi brakuje? W jaki sposób wstrzykiwanie zależności zwiększa sprzężenie między klasami?
dependency-injection
coupling
BЈовић
źródło
źródło
Odpowiedzi:
Wstrzykiwanie zależności zmniejsza sprzężenie między klasą i jej zależnością. Ale zwiększa to sprzężenie między klasą a jej konsumentem (ponieważ konsument potrzebuje więcej informacji, aby ją utworzyć) oraz zależnością i jej konsumentem (ponieważ konsument musi znać zależność, której należy użyć).
Bardzo często jest to dobry kompromis. Klasa nie powinna znać szczegółów na temat swoich zależności poza interfejsem, a na aplikacji powinna spoczywać powiązanie określonych fragmentów kodu.
źródło
Załóżmy, że masz podsystem
S
zależny od połączenia z bazą danychD
. Bez wstrzykiwania zależności istnieje względnie ścisłe sprzężenie międzyS
iD
, ponieważS
musi wiedzieć zarówno, jak używać,D
jak i jak go tworzyć. Reszta systemu może jednak być błogo nieświadoma tej zależności międzyS
iD
.W przypadku wstrzykiwania zależności sprzężenie
S
iD
staje się luźniejsze, ponieważ usuwasz zS
wiedzy, jak utworzyćD
.S
po prostu musi wiedzieć, jak go używać. Zwiększone ogólne sprzężenie wynika z faktu, że inne części systemu muszą teraz wiedziećD
i być może jak je utworzyć. Zakres tego wzrostu sprzężenia zależy od tego, w jaki sposóbD
wstrzykiwana jest zależność odS
:S
potrzebuje zależnościD
i być może wiedzy, jak ją stworzyć.S
pomocą którejD
wstrzykiwany jest zastrzyk, potrzebuje zależnościD
i być może wiedzy, jak go stworzyć.W obu przypadkach liczba klas, które zależą od
D
wzrostu, i wiedza na temat tworzeniaD
wciąż musi znajdować się gdzieś w systemie. To powoduje ogólny wzrost sprzężenia.źródło
S
musi dostarczyć fabrykęD
, co oznacza, że musi wiedzieć, któreS
zastosowaniaD
(lub przynajmniej pewien jej interfejs).Zdecydowanie nie zgadzam się, że zwiększa to sprzężenie.
Bez wstrzykiwania zależności masz ścisłe połączenie między podsystemem a konkretną implementacją zależności.
Po wstrzyknięciu zależności odłączyłeś podsystem od implementacji zależności.
Argumentowanie, że zwiększa sprzężenie między konsumentem a tym podsystemem, jest BARDZO wątpliwe, ponieważ sugeruje, że konsument jest teraz ściśle powiązany z zależnością wymaganą przez podsystem. Oznacza to tylko, że piszesz ściśle powiązany kod, który łączy klienta z zależnością. Idealnie WSZYSTKO twój kod jest oddzielony.
Wtrysk Konstruktora:
Rozdzielczość zależności jest obsługiwana przez pojemnik wstrzykiwania zależności lub fabrykę. Konsument może uzyskać konkretną implementację podsystemu z pojemnika wstrzykiwania zależności lub z fabryki.
Konsument nie musi wiedzieć, jak wygląda konstruktor podsystemu. Nie ma sprzężenia z zależnością od podsystemu.
Metoda wtrysku:
To samo co wstrzykiwanie konstruktora, tyle że teraz konsument musi uzyskać konkretny przykład zależności od kontenera lub fabryki (lub nawet wstrzyknąć metodę / konstruktor) i wstrzyknąć go do metody. Znowu konsument nie jest powiązany z konkretnym wdrożeniem zależności.
TL; DR Najgorszym przypadkiem wstrzykiwania zależności w podsystemie jest przeniesienie sprzężenia na kod konsumenta. NIE MA OGÓLNEGO ZWIĘKSZENIA SPRZĘGŁA.
Najlepszym przypadkiem jest to, że wszystkie systemy są teraz luźno połączone, a wstrzykiwanie zależności jest kontrolowane przez pojemniki lub fabryki wstrzykiwania zależności.
źródło