Podręcznik
4. Wzorce projektowe
4.1. BBOM - Big Ball of Mud
Big Ball of Mud (BBOM) to ironiczna nazwa dla antywzorca projektowego, który opisuje oprogramowanie pozbawione wyraźnej struktury, czytelnej architektury i dobrych praktyk programistycznych. Jest to termin używany do opisania kodu, który w miarę rozwoju projektu staje się coraz bardziej złożony, trudny do zrozumienia, utrzymania i rozwijania. Tak niestety często wyglądają projekty początkujących programistów lub zespołów, w których nie dba się o długoterminowe utrzymanie wysokiej jakości kodu. Jakie cechy charakteryzują takie projekty i jakie to niesie konsekwencje?
- Brak spójnej architektury. Kod nie ma czytelnie określonej struktury ani podziału na warstwy. Granice pomiędzy komponentami są zatarte, co w skutkuje licznymi wzajemnymi zależnościami i sprzężeniami. Znacząco utrudnia to m.in. selektywne testowanie poszczególnych bloków kodu.
- Brak separacji odpowiedzialności.
Poszczególne funkcje są przerośnięte, a ich odpowiedzialność obejmuje
więcej niż jedno ściśle zdefiniowane zadanie. W rezultacie zmiana jednej części aplikacji może mieć nieprzewidywalny wpływ na inną jej część, a w dalszej konsekwencji utrzymywanie takie systemu staje się kosztowne, gdyż wymaga dodatkowego wysiłku. W skrajnym przypadku zespół programistów stopniowo traci kontrolę nad złożonością systemu, a nowi członkowie zespołu mają trudności z orientacją w kodzie źródłowym.
- W toku rozwoju aplikacji stosowane bywają różnego rodzaju łatki i obejścia o tymczasowym charakterze. W dłuższej perspektywie takie nieprzemyślane rozwiązania jedynie nawarstwiają problemy i prowadzą do jeszcze większej złożoności.
- Skomplikowana struktura kodu skutkuje brakiem możliwości przygotowania sensownych testów jednostkowych. W rezultacie kod jest często wcale lub słabo przetestowany. Tym samym rośnie ryzyko błędów, awarii i problemów z użytkowaniem.
Aby uniknąć wpadnięcia i ugrzęźnięcia w "wielkiej kuli błota", należy zadbać o:
- zainwestowanie czasu w zaplanowanie architektury systemu oraz podział na odpowiednie warstwy i moduły.
- regularną refaktoryzację,
- stosowanie wzorców architektonicznych takich jak np. MVC, MVVM, czy mikroserwisy,
- testy jednostkowe i integracyjne, które pokrywają logikę aplikacji - pozwala to na bezpieczne wprowadzanie zmian i ogranicza narastanie tzw. długu technicznego,
- praktykowanie kultury tzw. "code review", czyli regularnego przeglądania zwłaszcza nowego kodu przez innych członków zespołu - pomaga to w utrzymaniu jakości, wymianie wiedzy w zespole, a także identyfikacji problemów,
- prowadzenie aktualnej dokumentacji oraz bieżące komentowanie kodu źródłowego, co ułatwia zrozumieć intencje projektowe i logikę - jest to szczególnie cenne dla nowych członków zespołu, a także w sytuacjach, gdy po dłuższym czasie pojawia się potrzeba wprowadzenia zmian w kodzie, nad którym przez dłuższy czas już nikt nie pracował lub jego twórcy np. zmienili miejsce pracy.
Wspomniana wyżej refaktoryzacja sama w sobie obejmuje wiele zagadnień. Zainteresowanego Czytelnika zapraszam do ponownego odwiedzenia strony Refactoring Guru - tym razem do działu poświęconego refaktoryzacji.