Jaki jest dobry sposób na wyjaśnienie wstrzyknięcia zależności ?
Znalazłem kilka samouczków na temat Google, ale żaden z nich nie zakłada, że czytelnik jest tylko początkującym językiem Java. Jak wytłumaczysz to nowicjuszowi?
design-patterns
dependency-injection
inversion-of-control
użytkownik198313
źródło
źródło
Odpowiedzi:
Daję ci zastrzyk uzależnienia dla pięciolatków.
źródło
A co z tym?
Jeśli masz klasę,
Employee
a ten pracownik ją maAddress
, możesz jąEmployee
zdefiniować w następujący sposób:Jak dotąd wszystko wygląda dobrze.
Ten kod pokazuje relację HAS-A między pracownikiem a jego adresem, w porządku.
Teraz ta relacja HAS-A stworzyła zależność między nimi. Problem dotyczy konstruktora.
Za każdym razem, gdy chcesz utworzyć
Employee
instancję, potrzebujeszAddress
instancji:Praca w ten sposób staje się problematyczna, zwłaszcza gdy chcesz przeprowadzić testy jednostkowe.
Główny problem pojawia się, gdy musisz przetestować jeden konkretny obiekt, musisz utworzyć instancję innego obiektu, a najprawdopodobniej musisz utworzyć instancję jeszcze innego obiektu, aby to zrobić. Łańcuch może stać się niemożliwy do zarządzania.
Aby tego uniknąć, możesz zmienić konstruktor w następujący sposób:
Korzystanie z konstruktora no args.
Następnie możesz ustawić adres, kiedy tylko chcesz:
Może to być przeciąganie, jeśli masz kilka atrybutów lub obiekty są trudne do utworzenia.
Pomyśl o tym, powiedzmy, dodajesz
Department
atrybut:Jeśli masz 300 pracowników, a wszyscy muszą mieć ten sam dział, a ten sam dział musi być współużytkowany przez niektóre inne obiekty (takie jak lista firmowa działów lub role każdego działu itp.), Wtedy mają trudności z widocznością
Department
obiektu i udostępnieniem go przez całą sieć obiektów.Na czym polega Dependence Injection , aby pomóc ci „wstrzyknąć” te zależności do twojego kodu. Większość ram pozwala to zrobić, określając w zewnętrznym pliku, jaki obiekt ma zostać wstrzyknięty.
Załóżmy plik właściwości dla wtryskiwacza fikcyjnej zależności:
Zdefiniujesz, co wstrzyknąć dla danego scenariusza.
To, co zrobi platforma Dependency Injector, to ustawienie odpowiednich obiektów dla ciebie, abyś nie musiał kodować
setAddress
anisetDepartment
. Odbyłoby się to poprzez refleksję, generowanie kodu lub inne techniki.Zatem następnym razem, gdy będziesz musiał przetestować
Employee
klasę, możesz wstrzyknąć próbkęAddress
iDepartments
obiekty bez konieczności kodowania całego zestawu / get dla całego testu. Co więcej, możesz wstrzykiwać rzeczywisteAddress
iDepartment
obiekty do kodu produkcyjnego i nadal mieć pewność, że Twój kod działa zgodnie z testami.To właściwie tyle.
Nadal nie sądzę, aby to wyjaśnienie było odpowiednie dla 5-latka, jak prosiłeś.
Mam nadzieję, że nadal okaże się przydatny.
źródło
Podczas pisania zajęć naturalne jest, że korzysta z innych obiektów. Możesz mieć na przykład połączenie z bazą danych lub inną usługę, z której korzystasz. Te inne obiekty (lub usługi) są zależnościami. Najprostszym sposobem na napisanie kodu jest po prostu utworzenie i użycie tych innych obiektów. Ale to oznacza, że twój obiekt ma nieelastyczny związek z tymi zależnościami: bez względu na to, dlaczego wywołujesz swój obiekt, używa tych samych zależności.
Bardziej zaawansowaną techniką jest możliwość stworzenia obiektu i zapewnienia mu zależności do użycia. Możesz więc utworzyć połączenie z bazą danych do użycia, a następnie przekazać je swojemu obiektowi. W ten sposób możesz stworzyć swój obiekt z różnymi zależnościami w różnym czasie, dzięki czemu Twój obiekt będzie bardziej elastyczny. Jest to wstrzykiwanie zależności, polegające na „wstrzyknięciu” zależności do obiektu.
BTW: W nowoczesnym stylu prezentacji wykorzystującym zdjęcia Flickr do zilustrowania koncepcji, można to zilustrować uzależnionym strzelającym z narkotykami. Och, czekaj, to zależność od iniekcji ... OK, przepraszam, zły żart.
źródło
Nie znam żadnych uproszczonych samouczków, ale mogę dać ci prawie
25250 słów lub mniej wersji:W przypadku wstrzykiwania zależności obiekt nie konfiguruje własnych składników w oparciu o rzeczy, które już zna, raczej obiekt jest konfigurowany za pomocą logiki wyższego poziomu, a następnie wywołuje komponenty, o których nie ma wbudowanej wiedzy wstępnej. Chodzi o to, aby obiekt był bardziej składnikiem, a mniej aplikacją, przenosząc zadania konfiguracyjne na wyższy poziom. Dzięki temu obiekt będzie bardziej przydatny w przyszłości lub przy innej konfiguracji.
Jest lepszy do testowania, lepiej, gdy przychodzi czas na poprawienie aplikacji. Typowa implementacja umieszcza konfigurację w formacie XML i wykorzystuje strukturę do dynamicznego ładowania klas.
źródło
Gdy otrzymasz nowe Nintendo, możesz po prostu używać przycisków i ekranu dotykowego, aby grać w gry.
Ale w fabryce Nintendo muszą wiedzieć, jak je połączyć.
Kiedy inteligentni ludzie w fabryce wypuszczą konsolę Nintendo DS, wewnątrz będzie inaczej, ale nadal będziesz wiedział, jak z niej korzystać.
źródło