Po pierwsze, chciałbym oddzielić podejście projektowe od koncepcji ram. Zastrzyk zależności na najprostszym i najbardziej podstawowym poziomie to po prostu:
Obiekt nadrzędny zapewnia wszystkie zależności wymagane od obiektu podrzędnego.
Otóż to. Zauważ, że nic w tym nie wymaga interfejsów, frameworków, jakiegokolwiek stylu iniekcji itp. By być uczciwym po raz pierwszy dowiedziałem się o tym wzorze 20 lat temu. To nie jest nowe.
Z powodu zamieszania przez więcej niż 2 osoby pojęcia rodzic i dziecko w kontekście zastrzyku uzależnienia:
- Element nadrzędny to obiekt, który tworzy instancję i konfiguruje używany obiekt podrzędny
- Dziecko jest elementem, który jest przeznaczony do biernie instancja. Oznacza to, że jest przeznaczony do używania wszelkich zależności dostarczonych przez rodzica i nie tworzy własnych zależności.
Wstrzykiwanie zależności jest wzorem kompozycji obiektu .
Dlaczego interfejsy?
Interfejsy są umową. Istnieją po to, by ograniczać, jak ściśle mogą być połączone dwa obiekty. Nie każda zależność wymaga interfejsu, ale pomaga w pisaniu kodu modułowego.
Po dodaniu koncepcji testowania jednostkowego możesz mieć dwie implementacje pojęciowe dla dowolnego interfejsu: rzeczywisty obiekt, którego chcesz użyć w swojej aplikacji, oraz fałszywy lub pośredni obiekt, którego używasz do testowania kodu, który zależy od obiektu. Już samo to może być wystarczającym uzasadnieniem dla interfejsu.
Dlaczego frameworki?
Zasadniczo inicjowanie i zapewnianie zależności obiektom potomnym może być zniechęcające, gdy jest ich dużo. Ramy zapewniają następujące korzyści:
- Zależności autowire od komponentów
- Konfigurowanie komponentów z pewnego rodzaju ustawieniami
- Automatyzacja kodu płyty kotła, abyś nie musiał widzieć go zapisanego w wielu lokalizacjach.
Mają także następujące wady:
- Obiekt nadrzędny jest „kontenerem”, a nie niczym w twoim kodzie
- Utrudnia to testowanie, jeśli nie można podać zależności bezpośrednio w kodzie testowym
- Może spowolnić inicjalizację, ponieważ rozwiązuje wszystkie zależności za pomocą refleksji i wielu innych sztuczek
- Debugowanie w czasie wykonywania może być trudniejsze, szczególnie jeśli kontener wstrzykuje proxy między interfejsem a rzeczywistym komponentem, który implementuje interfejs (przychodzi na myśl programowanie aspektowe wbudowane w Spring). Kontener jest czarną skrzynką i nie zawsze są zbudowane z myślą o ułatwieniu debugowania.
Wszystko to powiedziało, że są kompromisy. W przypadku małych projektów, w których nie ma dużo ruchomych części i nie ma powodu, aby używać frameworka DI. Jednak w przypadku bardziej skomplikowanych projektów, w których istnieją już pewne elementy, ramy można uzasadnić.
Co z [losowym artykułem w Internecie]?
Co z tym? Wiele razy ludzie mogą stać się nadgorliwi i dodawać wiele ograniczeń i krytykować cię, jeśli nie robisz rzeczy „w jeden prawdziwy sposób”. Nie ma jednego prawdziwego sposobu. Sprawdź, czy możesz wyodrębnić coś przydatnego z artykułu i zignoruj rzeczy, z którymi się nie zgadzasz.
Krótko mówiąc, pomyśl sam i wypróbuj wszystko.
Praca ze „starymi głowami”
Dowiedz się jak najwięcej. Wielu programistów, którzy pracują w latach 70., odkrywa, że nauczyli się nie być dogmatami w wielu sprawach. Mają metody, nad którymi pracowali od dziesięcioleci, które dają prawidłowe wyniki.
Miałem zaszczyt pracować z kilkoma z nich, a one mogą dostarczać brutalnie szczerych opinii, które mają sens. A tam, gdzie widzą wartość, dodają te narzędzia do swojego repertuaru.