Mój przyjaciel pracuje dla małej firmy nad projektem, którego każdy programista nienawidziłby: jest zmuszany do jak najszybszego zwolnienia, jest jedynym, który wydaje się dbać o dług techniczny, klient nie ma zaplecza technicznego itp.
Opowiedział mi historię, która kazała mi pomyśleć o stosowności wzorców projektowych w projektach takich jak ten. Oto historia.
Musieliśmy wyświetlać produkty w różnych miejscach na stronie. Na przykład menedżerowie treści mogą przeglądać produkty, ale także użytkowników końcowych lub partnerów za pośrednictwem interfejsu API.
Czasami brakowało informacji o produktach: na przykład kilka z nich nie miało żadnej ceny, gdy produkt został właśnie utworzony, ale cena nie została jeszcze określona. Niektóre nie miały opisu (opis jest złożonym obiektem z historiami modyfikacji, zlokalizowaną zawartością itp.). Niektórym brakowało informacji o wysyłce.
Zainspirowany moimi ostatnimi czytaniami o wzorach projektowych, pomyślałem, że to doskonała okazja do użycia magicznego wzoru Null Object . Zrobiłem to i wszystko było gładkie i czyste. Wystarczyło zadzwonić,
product.Price.ToString("c")
żeby wyświetlić cenę lubproduct.Description.Current
opis; nie są wymagane żadne warunki warunkowe. Aż pewnego dnia interesariusz poprosił o wyświetlenie go inaczej w interfejsie API, poprzeznull
użycie JSON. A także inaczej dla menedżerów treści, pokazując „Cena nieokreślona [Zmień]”. Musiałem zamordować mój ukochany wzór Null Object, ponieważ nie było już takiej potrzeby.W ten sam sposób musiałem usunąć kilka abstrakcyjnych fabryk i kilku budowniczych, w końcu zastąpiłem mój piękny wzór fasady bezpośrednimi i brzydkimi połączeniami, ponieważ podstawowe interfejsy zmieniały się dwa razy dziennie przez trzy miesiące, a nawet Singleton mnie opuścił kiedy wymagania mówiły, że dany obiekt musiał być inny w zależności od kontekstu.
Ponad trzy tygodnie pracy polegały na dodawaniu wzorców projektowych, a następnie ich rozerwaniu miesiąc później, a mój kod w końcu stał się na tyle spaghetti, że nikt, w tym ja, nie może go utrzymać. Czy nie lepiej byłoby nigdy nie używać tych wzorów?
Rzeczywiście musiałem popracować nad projektami, w których wymagania ciągle się zmieniają i są podyktowane przez osoby, które tak naprawdę nie mają na myśli spójności ani spójności produktu. W tym kontekście nie ma znaczenia, jak zwinny jesteś, otrzymasz eleganckie rozwiązanie problemu, a kiedy go w końcu wdrożysz, dowiesz się, że wymagania zmieniły się tak drastycznie, że Twoje eleganckie rozwiązanie nie pasuje już dłużej.
Jakie byłoby rozwiązanie w tym przypadku?
Nie używasz żadnych wzorców projektowych, przestajesz myśleć i piszesz kodu bezpośrednio?
Interesujące byłoby doświadczenie, w którym zespół pisze kod bezpośrednio, podczas gdy inny zastanawia się dwa razy przed pisaniem, ryzykując wyrzucenie oryginalnego projektu kilka dni później: kto wie, może obie drużyny miałyby ten sam dług techniczny. W przypadku braku takich danych twierdziłbym jedynie, że pisanie kodu bez uprzedniego myślenia podczas pracy nad projektem trwającym 20 miesięcy nie wydaje się właściwe .
Utrzymać wzorzec projektowy, który nie ma już sensu, i spróbować dodać więcej wzorców dla nowo utworzonej sytuacji?
To też nie wydaje się właściwe. Wzory są używane w celu uproszczenia zrozumienia kodu; umieścić zbyt wiele wzorców, a kod stanie się bałaganem.
Czy zaczniesz myśleć o nowym projekcie, który obejmuje nowe wymagania, a następnie powoli przebudujesz stary projekt na nowy?
Jako teoretyk i ten, który faworyzuje Agile, jestem całkowicie w to zaangażowany. W praktyce, gdy wiesz, że będziesz musiał co tydzień wracać do tablicy i przerabiać większą część poprzedniego projektu, a klient po prostu nie ma wystarczających środków, aby ci za to zapłacić, ani wystarczająco dużo czasu, aby czekać , to prawdopodobnie nie zadziała.
Jakieś sugestie?