В данном занятии курса “Otus PHP Professional“ мы рассмотрим популярные паттерны проектирования: порождающие, структурные, поведенческие шаблоны, а также GRASP.
Цели занятия
-
улучшить понимание паттернов проектирования кода.
Краткое содержание
-
часто встречающиеся проблемы при проектировании ООП-программ, способы их решения, шаблоны проектирования;
-
порождающие, структурные, поведенческие шаблоны, а также шаблон GRASP.
Результаты
-
находить места применения и применять шаблоны.
Преподаватель
-
Михаил Каморин
-
Дата: 07.04.2022
/**/
1. История и виды паттернов
Виды паттернов
Примеры идиом — стандарты PSR (например, стандарты логирования)
Материалы по теме паттернов
Еще материалы:
-
Курс по паттернам: https://refactoring.guru/ru/design-patterns/php
-
Ultra-simplified explanation to design patterns! https://github.com/kamranahmedse/design-patterns-for-humans/
-
Мэтт зандстра PHP объекты, шаблоны и методики программирования (там паттерны есть на пхп)
https://designpatternsphp.readthedocs.io/en/latest/README.html
Для чего нужны паттерны
Для чего НЕ нужны паттерны
попрой проще обойтись без паттернов, т.к. они могут усложнять простой код/систему
2. Архитектурные паттерны
GRASP
Архитектура
Толстый клиент
не страшен обрыв связи
высокие требования к производительности
проблемы с кросс-платформенностью
Тонкий клиент
простой код
требовательный к ресурсам клиент
высокие требования к сети и серверу из-за нагрузки
Трехзвенный клиент (со звеном для хранения данных)
Паттерн MVC ~ Model View Controller
Антипаттерн “Passive MVC“
-
Fat Stupid Ugly Controller
-
сильная привязанность к фреймворку
Active MVC
Паттерн HMVC
встречается, например, в yii: куча маленьких MVC внутри
Паттерн MVVM
используется на фронте; все построено на событиях (~ js event-loop)
Паттерн PageController
-
единая точка доступа
-
характерная часть реализации MVC
3. Дизайн паттерны / Design patterns
Классификация паттернов по GoF
-
порождающие
-
структурные
-
поведенческие
Порождающий паттерн Строитель / Builder
Позволяет строить объекты по кусочкам.
Пример использования
Порождающий паттерн Синглтон / Singleton
Создает класс в единственном экземпляре.
Пример: создает соединение с БД (единственное для всех процессов)
в большинстве фреймворков существует в виде service-locator (где хранятся записи о каждом сервисе, и при обращении к нужному, он достается из справочника)
сложно тестировать
Пример кода:
класс делаем final + исп методы clone(), wakeup() — чтобы не допустить дублирований
Порождающий паттерн Фабричный метод
Используется как способ описания чего-то…
Пример:
Структурный паттерн Адаптер
Превращает один интерфейс в другой (пример: “адаптер для европейской розетки”)
фасад при этом адаптирует сразу множество классов
Пример: превращаем охотничью собаку во льва
index.php:
Поведенческий паттерн Шаблонный метод
Пример:
04. Антипаттерны
Антипаттерн copy-paste-programming
исправлять ошибки нужно во всех копиях
решение: нужно иметь отд. репозитарий (библиотеку / утилиту) и использовать его для внешних зависимостей
Антипаттерн “Spagetti code”
Написание кода с высокой степенью вложенности
Решение: использовать статические анализаторы (codestyle): с ограничениями (например, не более 4х аргументов у метода, не более 10 строк в методе и т.п.), см. php-cs, codesniffer, php-stan
решение: код-ревью
Антипаттерн “God object”
Большой класс, в котором объединена вся логика из разных сущностей.
нарушение принципов GRASP, SOLID
решение: исп. SRP
решение: рефакторинг
Антипаттерн “Магические числа”
Использование чисел в коде (значения которых м.б. не понятны посторонним)
решение: выносить числа в константы
Антипаттерн “Хардкод”
Написание не-универсального кода
реш: не хардкодить )
Антипаттерн “Код на будущее“
Написание лишнего кода/методов (“может в будущем пригодится“)
решение: если сейчас код не нужен, лучше его удалить
Антипаттерн “Изобретение велосипеда“
Написание утилитарного кода, который уже вероятно кем-то реализован (например, библиотека для работы с неким API).
лучше исп. чужие open-source наработки, чем писать свой с нуля
Нет комментариев