Ten wpis rozpoczyna serię materiałów o wzorcach projektowych. Czym w ogóle są obiektowe wzorce projektowe? Kiedy warto się ich uczyć? Jak będzie wyglądała ta seria artykułów? Odpowiedzi na te i inne pytania znajdziecie w dalszej części.
Wzorców projektowych trzeba nauczyć się jak najszybciej w swojej karierze programistycznej i zacząć ich używać. Jednak nie wszyscy powinni od razu zgłębiać ten temat. Istnieje kilka etapów w karierze, kiedy warto się nimi zainteresować.
Przyznam, że kilkukrotnie z wielu źródeł próbowałem nauczyć się obiektowych wzorców projektowych. Was też zachęcam do sprawdzania różnych materiałów. Niektórym mogą przypaść do gustu moje opracowania, innym niekoniecznie. Sam czasem odsyłam do innych źródeł, które uważam za wartościowe. Co jest pewne – chcąc być dobrym developerem, nie wolno odpuścić tego zagadnienia.
Zanim jednak temat wzorców… Co trzeba wiedzieć wcześniej? Dobre przyswojenie konkretnych wzorców projektowych na pewno wiąże się z doświadczeniem w programowaniu obiektowym oraz znajomością i rozumieniem zasad SOLID. Ja dodatkowo odnoszę się do przykładów i implementacji w PHP, więc głównie do osób znających ten język kieruję tę serię.
Jedna dodatkowa uwaga. Na początku wiele wzorców będzie pasowało do prawie wszystkich problemów. Niestety, oznacza to wtedy, że niekoniecznie dobrze rozumie się ich istotę. Złe użycie narzędzi prowadzi do tego, że zamiast rozwiązywać konkretny problem, można sobie utrudnić dalszy rozwój i utrzymanie kodu. Dobrze przeczekać ten okres i nie wymyślać problemu tylko po to żeby użyć danego wzorca projektowego. Nie oznacza to, że nie można ich wykorzystywać. W końcu po to powstały.
Czym są wzorce projektowe?
Wzorzec projektowy to sposób na rozwiązanie często powtarzającego się problemu projektowego w aplikacjach. Nie jest to jednak algorytm, który daje rozwiązanie na tacy. To bardziej zbiór uniwersalnych zasad wspierających dobre praktyki. To dlatego może zostać źle zaimplementowany, bo trzeba dopasować go do potrzeb, a nie przepisać jeden do jednego. To właśnie dzięki temu znajdzie zastosowanie w wielu miejscach, bo ma świetny poziom abstrakcji. Dla mnie esencją wzorców projektowych jest to, że pomagają utrzymać kod w dobrej kondycji i ustrzec się w przyszłości wielu problemów. Są rozwiązaniami sprawdzonymi w boju.
Obiektowe wzorce projektowe można podzielić na trzy grupy:
- wzorce kreacyjne – odpowiedzialne za tworzenie konkretnych obiektów;
- wzorce strukturalne – definiujące strukturę i powiązanie interfejsów;
- wzorce behawioralne – opisujące zachowania obiektów.
Struktura wpisu
Każdy wzorzec projektowy to osobny wpis. Posiada zdjęcie prezentujące diagram UML omawianego przykładu i ogólny opis. Dodatkowo, przedstawiam problem i rozwiązanie z przykładową implementacją w PHP, a także plusy i minusy danego wzorca projektowego. Na samym końcu jest też blok opinii, w którym to pokrótce podsumowuję i oceniam wzorzec. Jest to miejsce na moją subiektywną ocenę. Taki blok to fajna opcja na przyszłość żeby wrócić i szybko sobie odświeżyć jakie są wady i zalety danego podejścia. Każdy z Was może także wyrazić opinię w komentarzu – do czego zachęcam.
O jakich wzorcach…
Nie jest ich w gruncie rzeczy tak mało, a ja postaram się przedstawić ich jak najwięcej. Oczywiście tylko te które mogą być użyte w aplikacjach webowych w PHP. Mam na myśli wzorce programowania obiektowego.
Raczej używam nazw anglojęzycznych, bo też tak pisze się kod na co dzień,. Jeśli jednak istnieje sensowne tłumaczenie to chętnie je podaję. Czasem jestem pod wrażeniem, jak świetnie jednym czy dwoma słowami są one nazwane. W zasadzie nazwa jednoznacznie określa do czego służą – stąd też warto ją rozumieć.
Linki do opisanych wzorców projektowych
Wzorce kreacyjne
- Abstract Factory (Fabryka Abstrakcyjna)
- Builder (Budowniczy)
- Factory Method (Metoda Wytwórcza)
- Prototype (Prototyp)
- Simple Factory (Prosta Fabryka)
- Singleton
Wzorce strukturalne
- Adapter
- Bridge (Most)
- Composite (Kompozyt)
- Decorator (Dekorator)
- Facade (Fasada)
- Proxy (Pełnomocnik)
Wzorce behawioralne
- Chain Of Responsibility (Łańcuch Zobowiązań)
- Command (Polecenie)
- Iterator
- Memento (Pamiątka)
- Null Object (Pusty Obiekt)
- Observer (Obserwator)
- State (Stan)
- Strategy (Strategia)
- Template Method (Metoda Szablonowa)
- Visitor (Odwiedzający)
Pełne repozytorium na platformie github: Design Patterns PHP
Przydało by sięcoś o CQRSA i DDD, cośo DRY
Nie wykluczam w przyszłości, bo też jest to na liście tematów, które chcę poruszać. Dzięki za propozycje.