Wzorce projektowe w PHP
Wzorce projektowe to sposoby myślenia o programowaniu.
Stanowią one zbiór porad, gotowych rozwiązań, najlepszych praktyk i spostrzeżeń na temat rozwoju. Dla każdego paradygmatu programowania i typu zadania istnieją pewne wzorce projektowe, które są najodpowiedniejsze.
Korzyści - dlaczego warto stosować wzorce projektowe?
W programowaniu rozwiązywanie pewnych typów problemów jest powtarzalne, więc sensowne jest wybranie jednej metody rozwiązywania tych problemów i powtarzanie tej metody.
Główna korzyść pojawia się zwłaszcza podczas pracy zespołowej, gdy wszyscy wiedzą, jak będzie tworzona aplikacja (według jakiego wzorca projektowego) i po prostu go stosują. Eliminuje to niepotrzebne dziesiątki godzin spędzonych na debugowaniu dziwnie napisanego kodu i próbach zrozumienia zasad, którymi kierował się autor.
MVC - przykład zastosowania wzorca projektowego
Moim ulubionym wzorcem projektowym jest MVC (od Model View Controller), który mówi, że aplikacja jest podzielona na 3 niezależne warstwy, które wywołują się nawzajem sekwencyjnie i przekazują sobie dane.
Na przykład, podczas renderowania strony, może to wyglądać tak, że najpierw decyduje ona, jakiego typu jest to strona (na przykład szczegóły kategorii), więc wywołuje CategoryController z metodą detail.
Konkretny przykład (bardzo upraszczam):
class CategoryController{public CategoryManager $categoryManager;public function actionDetail(string $id): void{$this->template->id = $id;$this->template->category = $this->categoryManager->getById($id);}}
Uwaga:
To jest tylko przykładowy kod, który wyjaśnia zasadę działania wzorca projektowego
MVC.W prawdziwej implementacji musielibyśmy dalej kombinować, jak, na przykład, uzyskać instancję
CategoryManageri jak przekazać ją do właściwości. Zazwyczaj do tego typu zadań stosuje sięwstrzykiwanie zależności.
Przed wyrenderowaniem strony dla szczegółów kategorii, najpierw wywoływany jest CategoryController, który odbiera faktyczne żądanie (tzn. renderujemy szczegóły kategorii o określonym ID, które jest uzyskiwane przez router, na przykład w adresie URL), pobiera dane (odpytując odpowiedni Model) i przekazuje ostateczne dane do szablonu w celu wyrenderowania.
Ogromną zaletą tej zasady jest możliwość pisania wielu modeli (logiki aplikacji), które są niezależne od sposobu prezentacji danych (szablonu), co daje w efekcie kod wielokrotnego użytku. W rzeczywistości, jeśli chcemy użyć CategoryManager w innym projekcie, po prostu przepuszczamy dane przez Controller w określony sposób, który zostanie wyrenderowany zgodnie z szablonem zdefiniowanym przez sam projekt, podczas gdy logika aplikacji pozostaje taka sama i nikogo to nie obchodzi, ponieważ warstwa oprogramowania wypełniła swój uzgodniony interfejs i obowiązki.
Uwaga praktyczna:
Wzorzec projektowy
MVCjest używany przez większość nowoczesnych frameworków, takich jak Nette, Symfony, Laravel i inne.Z
MVCmożemy się również spotkać przy tworzeniu aplikacji mobilnych i innych rodzajów oprogramowania, w których musimy pobierać dane i renderować je w szablonie zgodnie z typem strony lub widoku.
Ważne wzorce projektowe dla tworzenia stron internetowych
Generalnie w programowaniu istnieje wiele wzorców projektowych, które nie nadają się do tworzenia stron internetowych. Na tej liście opisano najważniejsze wzorce, z których sam korzystam i które powinieneś znać.
Na osobnej stronie można znaleźć pełną listę wszystkich wzorców projektowych, przykłady ich użycia oraz szczegółowe wyjaśnienia.
- MVC - Zasada podziału aplikacji na
Model(logika aplikacji i dane),Widok(szablon i widok danych) orazKontroler(łączącyModeliWidok). - Wstrzykiwanie zależności - zamiast tworzyć instancje klas, definiujemy tzw. usługi, które automatycznie wstrzykujemy. Kod uwzględnia wszystkie zależności, poszczególne części mogą być wymieniane, a aplikacja jest budowana dynamicznie.
- Singleton (Singleton) - Każda klasa ma tylko jedną instancję (osobiście używam tego w połączeniu z
Dependency injection, gdzie każda usługa ma tylko jedną instancję, która jest przekazywana przez całą aplikację). - Luźna inicjalizacja (opóźniona inicjalizacja) - instancję obiektu tworzymy, gdy jest ona potrzebna po raz pierwszy.
- Adapter - Jeśli musimy zapewnić komunikację między dwiema niekompatybilnymi klasami,
Adapterkonwertuje dane z jednego typu na drugi (zazwyczaj konwertuje natywne typy danych PHP na typy danych bazy danych i z powrotem). - Polecenie - Zamiast bezpośrednio wykonywać określone zadanie (np. wysłać wiadomość e-mail), po prostu pamiętamy, że miało się ono odbyć. Następnie inny lub ten sam proces przejmie wniosek i zajmie się jego przetwarzaniem. Główną zaletą jest to, że możemy przetwarzać aplikację leniwie (a więc bardzo szybko), ponawiać próby nieudanych działań i po prostu przechowywać parametry wywołania. Jednocześnie pozwoli nam to odbierać żądania od różnych klientów, za pośrednictwem interfejsów API itp. Wysłane działania można również umieszczać w kolejce, nadawać im priorytety i ewentualnie anulować przed oceną.
- Strategia - Obejmuje pewien rodzaj algorytmów lub obiektów, które mają być zmieniane, tak aby były zamienne dla klienta.
Istnieje wiele innych wzorców projektowych, ale te są najważniejsze, które powinieneś znać.
Antywzór
Niektóre techniki programowania są uważane za antypattern, co jest dokładnym przeciwieństwem wzorca projektowego. Zwykle jest to technika, która tworzy dziwny kod, którego nie da się łatwo debugować, utrzymywać i który zachowuje się magicznie.
Typowym przykładem jest użycie zmiennych globalnych.