Паттерн проектирования

Оригинальное название: 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, Одиночка как замаскированная глобальная переменная — всё это добавляет слоёв, не принося пользы. Хороший ориентир: если без шаблона код проще читать и менять, шаблон не нужен. Большинство паттернов опираются на принципы ООП, поэтому без понимания интерфейсов и полиморфизма они превращаются в ритуал.

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение