В данном занятии курса “Otus PHP Professional“ мы рассмотрим популярные паттерны проектирования: порождающие, структурные, поведенческие шаблоны, а также GRASP.

Цели занятия

  • улучшить понимание паттернов проектирования кода.

Краткое содержание

  • часто встречающиеся проблемы при проектировании ООП-программ, способы их решения, шаблоны проектирования;

  • порождающие, структурные, поведенческие шаблоны, а также шаблон GRASP.

Результаты

  • находить места применения и применять шаблоны.

Преподаватель

  • Михаил Каморин

  • Дата: 07.04.2022

/**/


1. История и виды паттернов

Виды паттернов

(звезда) Примеры идиом — стандарты PSR (например, стандарты логирования)

Материалы по теме паттернов

Еще материалы:

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

(минус) исправлять ошибки нужно во всех копиях

(warning) решение: нужно иметь отд. репозитарий (библиотеку / утилиту) и использовать его для внешних зависимостей

Антипаттерн “Spagetti code”

Написание кода с высокой степенью вложенности

(warning) Решение: использовать статические анализаторы (codestyle): с ограничениями (например, не более 4х аргументов у метода, не более 10 строк в методе и т.п.), см. php-cs, codesniffer, php-stan

(warning) решение: код-ревью

Антипаттерн “God object”

Большой класс, в котором объединена вся логика из разных сущностей.

(минус) нарушение принципов GRASP, SOLID

(warning) решение: исп. SRP

(warning) решение: рефакторинг

Антипаттерн “Магические числа”

Использование чисел в коде (значения которых м.б. не понятны посторонним)

(warning) решение: выносить числа в константы

Антипаттерн “Хардкод”

Написание не-универсального кода

(warning) реш: не хардкодить )

Антипаттерн “Код на будущее“

Написание лишнего кода/методов (“может в будущем пригодится“)

(warning) решение: если сейчас код не нужен, лучше его удалить

Антипаттерн “Изобретение велосипеда“

Написание утилитарного кода, который уже вероятно кем-то реализован (например, библиотека для работы с неким API).

(warning) лучше исп. чужие open-source наработки, чем писать свой с нуля


Tags

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.