Wprowadzenie do wzorców projektowych
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 70 z 91.
Wzorce projektowe to sprawdzone rozwiązania typowych problemów, z którymi programiści wielokrotnie się spotykają podczas tworzenia oprogramowania. Zamiast za każdym razem wymyślać koło na nowo, możesz zastosować te sprawdzone szablony, aby rozwiązywać podobne problemy we własnym kodzie.
Pomyśl o wzorcach projektowych jak o przepisach. Tak jak kucharz postępuje zgodnie z przepisem, aby przygotować danie dopracowywane przez lata, programiści używają wzorców projektowych, by porządkować swój kod na sposoby przetestowane i udoskonalone przez niezliczonych programistów przed nimi.
Wzorce projektowe zazwyczaj dzieli się na trzy kategorie:
| Kategoria | Cel | Przykłady |
|---|---|---|
| Kreacyjne | Jak tworzone są obiekty | Singleton, Factory |
| Strukturalne | Jak obiekty są komponowane | Adapter, Decorator |
| Behawioralne | Jak obiekty się komunikują | Observer, Strategy |
Tak naprawdę przez cały ten kurs korzystasz ze wzorców, nawet o tym nie wiedząc. Tworząc klasy abstrakcyjne z metodami, które klasy potomne muszą implementować, stosujesz odmianę wzorca Template Method. Używając interfejsów do definiowania kontraktów, przygotowujesz się do zastosowania wzorca Strategy.
Poznawanie wzorców projektowych daje ci wspólny język z innymi programistami. Zamiast szczegółowo wyjaśniać złożoną strukturę, możesz po prostu powiedzieć „Użyłem tutaj wzorca Fabryka”, a doświadczeni programiści od razu zrozumieją twoje podejście. W kolejnych lekcjach zaimplementujemy kilka podstawowych wzorców w PHP.
Wyzwanie
ŁatwyZbudujmy prosty system formatowania wiadomości, który pokazuje, jak wzorce projektowe pomagają organizować kod. Określisz, do której kategorii wzorców należy każdy komponent, i zobaczysz, jak różne części systemu współpracują ze sobą.
Rozmieścisz swój kod w trzech plikach:
MessageFormatter.php: Utwórz interfejs o nazwieMessageFormatter, który definiuje kontrakt formatowania wiadomości. Powinien mieć jedną metodęformat(string $message): string. Reprezentuje ona kategorię behawioralną. Definiuje sposób, w jaki obiekty komunikują się i przetwarzają dane.Formatters.php: Dołącz plik MessageFormatter i utwórz dwie klasy implementujące interfejs:UppercaseFormatter: Jego metodaformat()zwraca wiadomość zamienioną na wielkie literyBracketFormatter: Jego metodaformat()umieszcza wiadomość w nawiasach kwadratowych, tak jak[message]
main.php: Dołącz plik Formatters. Otrzymasz dwa wejścia: ciąg znaków z wiadomością oraz typ formatowania ("upper"lub"bracket").Utwórz funkcję o nazwie
processMessage, która przyjmujeMessageFormatteri ciąg znaków z wiadomością, a następnie zwraca sformatowany wynik. Ta funkcja nie musi wiedzieć, który konkretny formater otrzymuje. Po prostu wywołujeformat()na przekazanym obiekcie.Na podstawie wejściowego typu formatowania utwórz odpowiedni obiekt formatera. Przekaż go do funkcji
processMessagewraz z wiadomością i wypisz wynik.W nowym wierszu wypisz, którą kategorię wzorców reprezentuje ta struktura. Ponieważ definiujemy wymienne zachowania za pomocą interfejsu, wypisz:
Pattern category: Behavioral
To wyzwanie pokazuje, jak interfejsy pozwalają wymieniać implementacje bez zmieniania kodu, który z nich korzysta: to podstawa wzorców takich jak Strategia, które poznasz na nadchodzących lekcjach.
Spróbuj swoich sił
<?php
require_once 'Formatters.php';
// Wczytaj dane wejściowe
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: Utwórz funkcję o nazwie processMessage, która przyjmuje MessageFormatter
// oraz ciąg znaków z wiadomością, a następnie zwraca sformatowany wynik
// TODO: Na podstawie $formatterType ("upper" lub "bracket") utwórz odpowiedni obiekt formatujący
// TODO: Wywołaj processMessage z obiektem formatującym i wiadomością, a następnie wypisz wynik
// TODO: Wypisz kategorię wzorca w nowym wierszu
// Format: "Pattern category: Behavioral"
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online