Ostatnio próbuję swoich sił w refactoringu kodu projektu, z którym borykam się na co dzień. Mam niewielkie doświadczenie (7msc), więc proszę to wziąć pod uwagę gdybyście chcieli coś wytłumaczyć. Słowem wstępu przedstawię klasy biorące udział w rozważaniach i pożądane zachowanie.
SubjctToOrder - klasa reprezentująca powiązanie pomiędzy klientem, a przedmiotem zamówienia rozumianym u nas w systemie jako nieruchomość
Realestate - model reprezentujący nieruchomość
Contact - model reprezentujący klienta
Wall - na wallu są wyświetlane m.in. różne powiadomienia, takie jak zmiana statusy powiązania itp.
W momencie **zmiany statusu **powiązania (SubjctToOrder) powinien zostać ustawiony odpowiedni status klienta (Contact), odpowiedni status nieruchomości (Realestate) oraz dodany post na wallu (Wall).
W momencie usunięcia powiązania sytuacja wygląda trochę inaczej. To co się rożni to ustawiana jest flaga deleted na 1 (SubjectToOrder) oraz jest dodawany inny post na wallu informujący o usunięciu powiązania. Na ten moment dla każdego komunikatu jest klejona oddzielna metoda w modelu Wall. Akcje w Concat i Realestate pozostają takie same, tylko wywoływana jest zmiana statusy na dostępny, ale wciąż jest to zmiana.
Obecnie wszystko jest robione w zakręconej metodzie postSave
. W momencie usunięcia wywoływana jest metoda softDelete
, która w zasadzie wygląda identycznie jak postSave
(co swoją drogą generuje 150 linii zduplikowanego kodu, łamie zasadę SRP i wiele innych).
Jak tak chwilę na to popatrzyłem to przypasował mi do tego Observer Pattern, ale w nim występuje jedna metoda update i po chwili jednak bardziej byłem skłonny ku zaimplementowaniu Event Managera typu SubjectToOrderStatusChanged
i SubjectToOrderDeleted
.
Pytania:
-
Jeden ze starszych programistów w odpowiedzi na mój pomysł stwierdził, że wpychanie tutaj Observera znacząco utrudnia debuggowanie i lepiej tego nie robić. Hmm.. jak ktoś używa var_dumpa, zamiast debuggera.. no nie wiem, co o tym myślicie?
-
Czy powinienem zaimplementować interface Subject i Observer odpowiednio w modelach wyżej wymienionych, czy do tego tworzy się oddzielne klasy i korzystając ze Strategii wywołuje się metody tych modeli zmieniające status w odpowiednich modelach?
-
Czy faktycznie lepszym rozwiązaniem w obecnej sytuacji będzie oparcie tego na eventach niż na Observer Pattern?
Jestem otwarty na inne pomysły, bo chcę jakoś opanować ten projekt. Na dzień dzisiejszy problemów podobnych do opisanego jest mnóstwo. Konieczne jest wywołanie tysiąca akcji np. w momencie usunięcia transakcji, a wszystko jest robione manualnie w różnych miejscach przez co jest duży bałagan.
Dziękuję za poświęcony czas.
Shalomkarolinaakarolinaakarolinaa