Паттерн проектирования
Оригинальное название: design patterns
Коротко
Описанная и названная схема решения задачи, которая регулярно возникает при проектировании кода: создание объектов, их связи, распределение обязанностей.
Что такое «Паттерн проектирования»
Идея пришла из архитектуры зданий, а в программирование её перенесла книга «Приёмы объектно-ориентированного проектирования» 1994 года. Четверо её авторов, которых с тех пор называют «бандой четырёх» (Gang of Four), описали 23 шаблона. Ценность была не в новизне решений — опытные программисты применяли их и раньше, — а в том, что у решений появились имена. Сказать «здесь Наблюдатель» быстрее, чем объяснять схему на доске.
Паттерн — не готовый код, который копируют, а описание: какую проблему он решает, из каких ролей состоит, какие у него плюсы и издержки. Реализация каждый раз своя.
Три группы классических шаблонов
- Порождающие — как создавать объекты: Фабрика, Строитель, Одиночка.
- Структурные — как собирать объекты в более крупные конструкции: Адаптер, Декоратор, Фасад.
- Поведенческие — как объекты взаимодействуют: Наблюдатель, Стратегия, Команда.
Позже появились шаблоны другого уровня — архитектурные (MVC, репозиторий) и шаблоны интеграции, но слово «паттерн» без уточнений обычно отсылает к этому каталогу.
Пример: Наблюдатель в WordPress
Система хуков WordPress — практическая реализация Наблюдателя. Один код объявляет событие, другие подписываются на него и ничего не знают друг о друге:
// подписчики — например, в разных плагинах
add_action( 'shop_order_paid', 'send_receipt_email' );
add_action( 'shop_order_paid', 'push_order_to_crm', 20 );
// издатель — в коде оплаты
do_action( 'shop_order_paid', $order_id );
Модуль оплаты не обязан знать про CRM и почту, а новые реакции добавляются без правки его кода. Обработчики событий в 1С-Битрикс устроены по тому же принципу.
Когда шаблон вредит
Паттерн оправдан, когда проблема, которую он решает, уже есть. Фабрика для класса с единственной реализацией, Стратегия ради одного if, Одиночка как замаскированная глобальная переменная — всё это добавляет слоёв, не принося пользы. Хороший ориентир: если без шаблона код проще читать и менять, шаблон не нужен. Большинство паттернов опираются на принципы ООП, поэтому без понимания интерфейсов и полиморфизма они превращаются в ритуал.

