Mam teraz do czynienia z integracją kontenera inwersji sterowania (IoC) z istniejącą aplikacją i szukam rekomendacji, w jaki sposób można to najłatwiej osiągnąć z ostatecznym celem zmniejszenia sprzężenia, a tym samym zwiększenia testowalności. Chociaż generalnie nie klasyfikowałbym większości klas jako obiektów boskich , każda z nich ma zbyt wiele obowiązków i ukrytych zależności poprzez statykę, singletony i brak interfejsów.
Oto kilka przykładów niektórych wyzwań, z którymi trzeba się zmierzyć:
- Rzadko stosuje się wstrzyknięcie zależności
- Istnieje wiele metod statycznych - zarówno metod fabrycznych, jak i pomocniczych
- Singletony są dość powszechne
- Interfejsy, gdy są używane, nie są zbyt szczegółowe
- Obiekty często przyciągają niepotrzebne zależności poprzez klasy podstawowe
Naszym celem jest, aby następnym razem, gdy będziemy musieli dokonać zmian w konkretnym obszarze, staramy się wyeliminować zależności, które w rzeczywistości istnieją, ale są ukryte za globalsami, takimi jak singletony i statyka.
Przypuszczam, że czyni to kontener IoC drugorzędnym w stosunku do wprowadzenia wstrzykiwania zależności, ale oczekiwałbym, że istnieje zestaw praktyk i zaleceń, które można zastosować lub rozważyć, które pomogą nam przełamać te zależności.
źródło
Odpowiedzi:
Aby wykonać coś takiego, będziesz musiał pracować etapami, każdy z nich nie jest trywialny, ale można to osiągnąć. Zanim zaczniesz, musisz zrozumieć, że nie możesz przyspieszyć tego procesu.
interface
dla każdego z nich. Ten interfejs powinien określać tylko metody, z których inne części systemu będą korzystać, aby z nim rozmawiać. UWAGA: w tym przypadku może być konieczne wykonanie więcej niż jednego przejścia.init()
metodzie serwletu .Kiedy skończysz, jedynymi metodami statycznymi, które powinieneś mieć w systemie, są te, które są naprawdę funkcjami - na przykład spójrz na
Collections
klasę lubMath
klasę. Żadna metoda statyczna nie powinna próbować uzyskać bezpośredniego dostępu do innych komponentów.To zajmie dużo czasu, odpowiednio zaplanuj. Upewnij się, że podczas przeprowadzania refaktoryzacji stajesz się bardziej SOLIDNY w swoim podejściu projektowym. Na początku będzie to bolesne. Drastycznie zmieniasz iteracyjnie wygląd swojej aplikacji.
źródło
Wybierz Efektywną pracę ze Starszym Kodem i postępuj zgodnie z jego radami. Zacznij od zbudowania wysp objętych kodem i stopniowo przejdź do bardziej uporządkowanej aplikacji. Próba masowej zmiany jest receptą na katastrofę.
źródło
Głównym powodem wprowadzenia IoC jest oddzielenie modułów. Problemem, szczególnie w Javie, jest nadzwyczaj silne powiązanie, które
new
daje operator, w połączeniu z tym, że kod wywołujący wie dokładnie, jakiego modułu użyje.Wprowadzono fabryki, aby przenieść tę wiedzę do centralnego miejsca, ale ostatecznie albo nadal okablujesz moduły za pomocą
new
/ singleton, który utrzymuje twarde wiązanie, albo czytasz w pliku konfiguracyjnym i używasz pliku refleks / Class.forName, który jest kruchy podczas refaktoryzacji .Jeśli nie masz celu zmodularyzowanego, to IoC nic ci nie da.
Wprowadzenie testów jednostkowych najprawdopodobniej to zmieni, ponieważ będziesz musiał wyśmiewać moduły, które nie są testowane, a najłatwiejszym sposobem radzenia sobie z tym, a także rzeczywistymi modułami produkcyjnymi z tym samym kodem, jest użycie frameworka IoC w celu wstrzyknięcia odpowiedniego moduły.
źródło