Loose coupling daje pewną elastyczność, ale jednoczesnie wnosi dodatkową złożoność - czy się przyda to zależy w sumie od potrzeb.
MOŻLIWOŚCI:
Z mojej perspektywy oznacza to, że jest większa szansa na to, że będę tworzył rozszerzenia (pisał nowy kod bez edycji istniejącego). Natomiast, gdy kod za bardzo nie idzie roszerzać no.. cóż, wtedy pozostaje modyfikowanie, a modyfikacja to nie tylko wstawianie nowych lini, ale również edycja i wpływanie na to co wcześniej działało.
Zatem na pierwszy rzut oka loose coupling:
- zwiększa szanse na pisanie nowego kodu
- zwielokratnia szansa na ponowne użycie istniejącego kodu (kompozycja)
- zmniejsza szanse na popsucie czegoś co działa
Oczywiście rozszerzenia mogą mieć także strategiczny wydźwięk, mogę dzięki nim jeden komponent zastąpić drugim. Np. teraz robię naiwną implementację, a za jakiś czas wracam i podpinam inny komponent, który wykonuje swoją pracę lepiej. Albo kupuje gotowy komponent, a z czasem gdy warunki nie będą korzystne to przechodzę do konkurencji lub robię własny. Nie mniej to otwiera bardziej furtkę i możliwości dla kadry zarządzającej niż samych programistów.
Programiści będą bardziej cenić fakt, że w ogóle pewne rzeczy będą mogli przetestować. To logika rozumowanie jest następująca spokój jest lepszy niż frustracja, a testy są lepsze niż debuggowanie.
OGRANICZENIA:
Wspomniałem wcześniej o dodatkowej złożoności. Gdzie ona się więc ukrywa?
Pomyśl, że znajomy chce poczęstować Cię ciastem swojej żony, ale zanim to zrobi wyciąga koło, kręci nim i rzuca ciasto w szprychy twierdząc, że tak małe porcje to łatwiej idzie przełknąć.
Myślę, że mniej więcej tak to widzą to inni programiści, którzy nie są przekonani do loose coupling. Oni jak czytają kod nie potrafią interpretewać tego zapisu, bo nie widać już scenariusza procedury jaką wcześniej realizował program. Tak posiekany kod ma dla nich wątpliwą wartość, ponieważ na czytanie i modyfikację muszą poświęcić więcej czasu, by skleić w głowie obraz jaki wynika ze skoków po 5 czy 10 plikach.
Ponadto w projektach IT jedyne co jest pewne to zmiana. Jeśli biznes robi stosunkowo świeży produkt i jesli postawnowi ostrzej skręcić to jak to później rzutuje na interfejsy? No cóż.. wtedy to jest kruche, rozszerzania zmienia się w modyfikację i pracy jest wiecej niż mniej.
Argument dotyczący testów jest wątpliwy, ponieważ testy bez loose coupling też da się pisać. Po prostu mamy wolne/ciężkie testy, ale z tego co widze to mało programistów woli małe testy na mockach. Ludzie wolą pisać integracyjne testy, by sprawdzić czy to działa na bazie z prawdziwego zdarzenia.
Natomiast jak ktoś lepi cruda w oparciu o gotowe ramy to przeważnie nie musi się tym zbytnio przejmować, bo ramy na ogół dostarczają różne implementacje do typowych zadań od IO, a te da się w zasadzie przepinać poprzez zmianę konfiguracji.
Na minus z mojej strony to jakieś skrajne rozwiązania do jakich prowadzi loose coupling to typu kontener zależności. Taki twór to dodatkowa wiązka magii, psucie stacktrace i możliwość napotkania nietypowych błedów.
Loose coupling zwraca się częściej, gdy projekt zależy od innych serwisów (zwłaszcza tych zewnetrznych), ale wtedy nie musisz nikogo przekonywać, ponieważ człowiek sam dojdzie do wniosku, że przydałaby się jakaś udawana implementacja i sposób na jej podmianę.
LUŹNE PRZEMYŚLENIA:
Tak pół żartem, pół serio to gdybym używał loose coupling w każdym projekcie to wiem, że można tak łatwo utrudnić pracę innym programistom. Dużo osób nie radzi sobie z tym, bo nie widzą pełnego projektu, zadania będą robić wolniej, a przetrwają tylko Ci, którym takie podejście po prostu pasuje (mniejszość). Natomiast mi to daje renomowaną podstawę, by zachęcić ("zmusić") kogoś do pisania kodu bardzo małymi porcjami, bo wtedy lżejszy jest code review i większa szansa, że ktoś odważy się napisać test obejmujący przypadki brzegowe.
alagner