Dlaczego wzorzec wstrzykiwania zależności nie został uwzględniony w Gangu czterech?

37

Dlaczego wzorzec wstrzykiwania zależności nie został uwzględniony w grupie czterech osób ? Czy wcześniejsze, szeroko rozpowszechnione automatyczne testy GOF? Czy wstrzykiwanie zależności jest obecnie uważane za podstawowy wzór?

Tom Squires
źródło
18
.. ponieważ „Wstrzykiwanie zależności” nie jest wzorem!
Dipan Mehta
1
@DipanMehta stackoverflow.com/questions/823387/…
Tom Squires
14
Wszystko, co się powtarza, tworzy wzór powtarzania. Wszystkie elementy projektu (które nie są wyjątkowymi, szalonymi pomysłami) są „wzorami”.
S.Lott,
3
Te długie odpowiedzi są prawdopodobnie mylące, ponieważ w pewnym sensie potwierdzają pytanie. Chociaż, jak wspomniano, wstrzykiwanie zależności nie jest wzorcem projektowym. Jest to „mechanizm” tworzenia instancji obiektów, zwykle obsługiwany przez framework.
Nazar Merza
1
Wstrzykiwanie zależności jest wzorcem . To sprzeciwia wzór lokalizatora usług. Przeczytaj Fowler, który wymyślił ten termin. Nie mam pojęcia, ile osób głosowało za takimi bzdurami.
James

Odpowiedzi:

101

Byłem redaktorem magazynu Software Development, kiedy ukazała się książka Gang of Four, i mogę z całkowitą pewnością stwierdzić, że testy jednostkowe nie były powszechną praktyką w 1994 r., Kiedy to po raz pierwszy opublikowano wzorce projektowe .

W 1994 r. C ++ był najczęściej używanym językiem obiektowym i większość programujących go osób pochodziła z języka C. Jedną z rzeczy „myślenia w obiektach”, których ludzie po prostu nie mieli, jest pomysł setek lub tysięcy punktów wejścia do twojego programu. Myślałeś o main(). Jeśli pracowałeś nad dużym projektem, możesz mieć (zwykle dość skomplikowany) plik makefile, aby utworzyć program oparty na modułach. Ale „testowanie jednostkowe”? Uruchamianie procesu, budowanie niezbędnego kontekstu pamięci, wykonywanie go i rozrywanie go według metody ? To było bardzo radykalne.

Java uczyniła programowanie z wieloma punktami wejścia bardziej oczywistym. Do czasu boomu Dot-Com testy jednostkowe były dobrze znaną techniką, ale tak naprawdę to JUnit (około 2001?) Spowodował, że zapaliło się i stało się powszechną praktyką.

Chociaż strategia i ogólna koncepcja programowania interfejsu były częścią GoF i zeitgeist z połowy lat 90., pomysł iniekcji przyszedł dość późno na imprezę (około '03 -05?). Szczerze mówiąc, moje siwe włosy są nadal dość wątpliwe w odniesieniu do tego aspektu DI („Zejdź z trawnika, cholerne pliki konfiguracyjne!”).

Larry OBrien
źródło
17
Żałuję, że mam tylko jeden głos, aby udzielić tak wnikliwej odpowiedzi.
@ Larry OBrien: skanowanie w poszukiwaniu rejestracji opartych na konwencjach znacznie upraszcza kod konfiguracji i praktycznie eliminuje konfigurację xml w kontenerach ioc.
quentin-starin
4
Chciałbym dodać, że zastrzyk zależności w jego rdzeniu wcale nie zależy od plików konfiguracyjnych. Możesz zrobić to wszystko ręcznie, co czyni go bardzo łatwym w użyciu i nadal jest bardzo elastycznym podejściem.
marco-fiset
31

Nazwali to Strategią .

Wydaje się, że ich strategia ma wszystkie cechy wstrzykiwania zależności bez nazwy o złożonym brzmieniu.

S.Lott
źródło
16
-1. Przepraszam! Wzór strategii nie ma nic wspólnego z wtryskiem zależności.
Dipan Mehta
14
@Dipan: zanim przejdziesz do głosowania, lepiej zastanów się nad odpowiedzią za pięć minut.
Doc Brown
6
prawdą jest, że Wstrzykiwanie Zależności można uznać za bardzo podobne do Wzorca Strategii, ale kiedy ludzie mówią, że Wstrzykiwanie Zależności zwykle oznacza Odwrócenie Kontroli, które moim zdaniem jest znacznie bardziej odmienne od Strategii (zwłaszcza kontener IoC).
MattDavey,
8
DI jest bardziej twórczym wzorcem. Tworzy i wstrzykuje strategie. Mówienie, że to strategia, to tylko połowa prawdy. DI jest bardziej wzorem mikrojądra! Nie mogę uwierzyć, że ludzie głosują za tym. Strategia jest raczej cechą dobrego DI, a nie koniecznością.
Falcon,
0

Myślę, że Wstrzykiwanie zależności jest bardziej odpowiednie przy rozdzielaniu implementacji na poziomach. Kolejnym obszarem, w którym myślimy o wstrzykiwaniu zależności, są testy jednostkowe. A twoja sugestia przed datą wydaje się poprawna. Jeśli gang miałby zbierać i segregować wzorce w 2012 roku, na pewno będzie tam zastrzyk zależności.

Strategia może pojawiać się w dyskusjach, ale strategia nie mówi o zastrzyku zależności. Ale gdy używasz wzorca strategii w jednym projekcie lub dll (wszystkie klasy i interfejsy pozostają w jednym projekcie), wydaje się, że robimy wstrzykiwanie zależności. W rzeczywistości nie jesteśmy.

Teraz, jeśli klasy i interfejsy wymienione we wzorcu strategii zostaną rozdzielone w różnych projektach lub warstwach, wówczas będziemy musieli zastosować techniki wstrzykiwania zależności. Możemy użyć plików konfiguracyjnych jedności (jednak nie jest możliwa zmiana środowiska wykonawczego). Ale wzorzec strategii nie mówi, jak wstrzyknąć zależność.

Jeśli istnieje wzorzec bardzo podobny do wstrzykiwania zależności, to jest to wzorzec metody abstrakcyjnej fabryki. Ten wzorzec może być użyty wewnątrz wzorca strategii do wstrzyknięcia zależności.

Niebieskie chmury
źródło
2
To nie odpowiada na pytanie. Przeczytaj oryginalne pytanie zamiast odpowiadać na inne odpowiedzi :)
Andres F.,
-4

odpowiedź Strategia jest w 100% poprawna. Zagłosowałem, ale mogę komentować.

„Strategia pozwala algorytmowi zmieniać się niezależnie od klientów, którzy go używają. [1] Strategia jest jednym z wzorców zawartych w wpływowej książce Design Patterns autorstwa Gamma i in., Która spopularyzowała koncepcję używania wzorców do opisywania projektowania oprogramowania”.

Wzór projektowy nie zależy od jego użycia. Wstrzykiwanie zależności jest realizowane przy użyciu wzorca strategii. Gdybyśmy nazwali każdy wzorzec na podstawie przypadku użycia, musielibyśmy zmienić nazwę wielu wzorców.

Wzorzec repozytorium nie jest nowym wzorcem, jest Wzorzec szablonu.

„W metodzie szablonowej tego wzorca projektowego jeden lub więcej kroków algorytmu można zastąpić podklasami, aby umożliwić różne zachowania, zapewniając jednocześnie, że algorytm nadrzędny jest nadal przestrzegany”.

Często wzory są łączone i nazywane wieloma wzorami, takimi jak wzór MVC.

GOF nie miał interfejsów używanych klas Pure Abstract, a także skorzystał ze zdolności C ++ do dziedziczenia z więcej niż jednej klasy.

Trener David
źródło
1
Cel wzorca jest absolutnie ważny przy rozróżnianiu. Wśród wzorców GoF, Adapter i Proxy są dobrymi przykładami - mają tę samą formę, ale inny cel. Nie zgadzam się również z twoim twierdzeniem, że DI jest wdrażane przy użyciu strategii; Strategia ma bardziej szczegółowy cel i sposób użycia skonfigurowanego obiektu, więc rozsądniej jest powiedzieć, że Strategia jest implementowana za pomocą DI.
Jules