Паттерны проектирования на человеческом языке
Репозиторий давно не обновлялся
Последнее обновление было 1 год назад.
Знакомая ситуация: вы открываете статью про паттерны проектирования, а там — «инкапсуляция вариативности», «абстрактные интерфейсы взаимодействия» и прочие академические дебри. Мозг начинает закипать уже на втором абзаце, а практическая польза от прочитанного стремится к нулю. Кажется, что паттерны — это что-то для архитекторов из Enterprise-сектора, которые только и делают, что рисуют UML-диаграммы.
На самом деле паттерны — это просто готовые рецепты для решения типичных задач, с которыми мы сталкиваемся каждый день. И репозиторий design-patterns-for-humans доказывает это максимально наглядно. Автор проекта Kamran Ahmed решил объяснить сложные концепции так, чтобы они «прилипли» к памяти, используя понятные аналогии из реальной жизни вместо сухих определений.
Что внутри репозитория
Проект представляет собой структурированный справочник, где все паттерны разбиты на три классические группы: порождающие, структурные и поведенческие. Но вместо того чтобы грузить вас теорией, автор сразу дает аналогию «из жизни» и пример кода.
Хотя примеры написаны на PHP 7, концепции универсальны. Если вы пишете на Python, Java или TypeScript, логика останется ровно той же.
Порождающие паттерны: как создавать объекты без боли
Порождающие паттерны отвечают на вопрос «как создать объект так, чтобы не превратить код в кучу мусора».
Один из самых простых и жизненных примеров — Простая фабрика. Представьте, что вы строите дом и вам нужны двери. Можно самому искать дерево, клей и гвозди, а можно просто позвонить на завод и заказать готовую дверь. Вам не нужно знать, как именно её делали, — вы просто получаете результат.
В коде это выглядит так:
class DoorFactory
{
public static function makeDoor($width, $height): Door
{
return new WoodenDoor($width, $height);
}
}
// Заказ двери 100x200
$door = DoorFactory::makeDoor(100, 200);
А если создание объекта требует множества настроек? Тут на помощь приходит Строитель (Builder). Автор сравнивает его с заказом бургера в Subway. В «Простой фабрике» вы берете готовый набор, а в Builder выбираете: какой хлеб, какой соус, нужен ли сыр. Это избавляет от «телескопического конструктора», когда в функцию приходится передавать десять параметров, половина из которых — null или false.
Структурные паттерны: собираем компоненты вместе
Эти паттерны помогают объектам разной структуры работать друг с другом.
Мой любимый пример из этого раздела — Адаптер. Аналогия с переходником для розетки или картридером понятна любому. В разработке это часто случается при интеграции со сторонними API. У вас есть класс Hunter, который умеет охотиться на львов (Lion), но внезапно в игру нужно добавить дикую собаку (WildDog). У собаки нет метода roar(), зато есть bark(). Чтобы не переписывать логику охотника, мы создаем адаптер, который «оборачивает» собаку и делает её совместимой с интерфейсом льва.
class WildDogAdapter implements Lion
{
protected $dog;
public function __construct(WildDog $dog)
{
$this->dog = $dog;
}
public function roar()
{
$this->dog->bark();
}
}
Также в этом разделе отлично разобраны Фасад (простой интерфейс для сложной системы, как кнопка включения компьютера) и Декоратор (динамическое добавление свойств, как добавление молока и сахара в кофе).
Поведенческие паттерны: общение между объектами
Поведенческие паттерны описывают, как объекты распределяют обязанности и обмениваются сообщениями.
Интересно подан паттерн Цепочка обязанностей (Chain of Responsibility). Представьте, что у вас привязано три способа оплаты: банковский счет, PayPal и Bitcoin. Система сначала пробует списать деньги с банка. Если там пусто — переходит к PayPal. Если и там недостаточно средств — идет к крипте. Каждый элемент цепочки либо обрабатывает запрос, либо передает его дальше.
$bank->setNext($paypal);
$paypal->setNext($bitcoin);
$bank->pay(259); // Система сама найдет подходящий счет
Почему это стоит изучить
Главная ценность этого репозитория не в коде, а в ментальных моделях. Паттерны часто критикуют за избыточность, и автор проекта честно предупреждает: не пытайтесь впихнуть их везде. Это не «серебряная пуля», а инструмент. Если использовать их неправильно, получится месиво из классов, в которых невозможно разобраться.
Проект хорош тем, что:
- Выключает режим «академического занудства».
- Дает четкие ответы на вопрос «Когда использовать?».
- Помогает подготовиться к собеседованиям (вопросы по паттернам до сих пор в топе).
Кому пригодится
В первую очередь — джунам и мидлам, которые слышали про «банду четырех», но засыпали на пятой странице их книги. Опытным разработчикам проект поможет освежить в памяти редкие паттерны вроде «Посетителя» или «Хранителя».
Если вы чувствуете, что ваш код превращается в спагетти, или просто хотите понимать, о чем говорят коллеги на архитектурных созвонах — загляните в этот README. Это, пожалуй, самый гуманный способ подружиться с проектированием ПО.
Кстати, у автора есть и другие крутые проекты, например, знаменитые roadmap.sh, так что за качеством контента он следит серьезно. Справочник полностью открыт, и его можно использовать как карманную шпаргалку.
