Учебник Паттерны проектирования для начинающих
Практический курс по 23 классическим паттернам проектирования (GoF). Для каждого паттерна — какую задачу он решает, идея, запускаемый пример на чистом Python и где он встречается в реальном коде. Аудитория: знающие ООП и хотя бы один язык. Вы научитесь видеть паттерны в чужом коде, осознанно применять их и не злоупотреблять.
Курс «Паттерны проектирования» состоит из 10 разделов и 38 уроков: Введение в паттерны, Порождающие паттерны, Структурные паттерны (часть 1), Структурные паттерны (часть 2), Поведенческие паттерны (часть 1), Поведенческие паттерны (часть 2) и практика, Архитектурные паттерны, Корпоративные паттерны и доступ к данным, Паттерны конкурентности и Принципы, антипаттерны и рефакторинг. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение в паттерны
- Что такое паттерн проектирования
Паттерн проектирования — типовое проверенное решение задачи. Откуда взялись паттерны GoF, зачем нужны общий словарь и проверенные приёмы.
- Классификация: порождающие, структурные, поведенческие
Три группы паттернов GoF: порождающие (создание объектов), структурные (композиция) и поведенческие (взаимодействие). Как ориентироваться в каталоге.
- Принципы хорошего дизайна: SOLID кратко
SOLID — пять принципов ООП-дизайна: SRP, OCP, LSP, ISP, DIP. Краткое объяснение каждого с мини-примером на Python — фундамент под паттерны.
- Интерфейсы и когда паттерны вредят
Принцип «программируй на уровне интерфейсов, а не реализаций» и обратная сторона — over-engineering. Когда паттерн усложняет код вместо пользы.
- Что такое паттерн проектирования
2 Порождающие паттерны
- Singleton и его критика
Singleton гарантирует единственный экземпляр класса и глобальную точку доступа. Реализация на Python, плюсы, минусы и почему многие считают его антипаттерном.
- Factory Method
Factory Method переносит выбор конкретного класса в отдельный метод. Реализация на Python, как он убирает if/elif по типу и где применяется.
- Abstract Factory и Builder
Abstract Factory создаёт семейства согласованных объектов, Builder собирает сложный объект пошагово. Запускаемые примеры на Python и когда что выбрать.
- Prototype
Prototype создаёт новые объекты копированием существующего экземпляра-прототипа. Реализация через copy.deepcopy, отличие shallow и deep copy, где применяется.
- Singleton и его критика
3 Структурные паттерны (часть 1)
- Adapter
Adapter соединяет два несовместимых интерфейса, переводя вызовы одного в вызовы другого. Запускаемый пример на Python и где встречается обёртка чужого API.
- Decorator
Decorator динамически добавляет объекту новые обязанности, оборачивая его. Запускаемый пример на Python, отличие от наследования, где применяется.
- Facade
Facade даёт простой единый интерфейс к сложной подсистеме. Запускаемый пример на Python, отличие от Adapter и где применяется фасад над модулями.
- Adapter
4 Структурные паттерны (часть 2)
- Composite
Composite позволяет работать с деревом объектов (файлы и папки) единообразно. Запускаемый рекурсивный пример на Python и где встречается.
- Proxy
Proxy подменяет объект заместителем для ленивой загрузки, кеширования или контроля доступа. Запускаемый пример ленивого и кеширующего прокси на Python.
- Bridge и Flyweight кратко
Bridge разделяет абстракцию и реализацию по двум осям. Flyweight экономит память, разделяя общее состояние. Запускаемые примеры на Python.
- Composite
5 Поведенческие паттерны (часть 1)
- Strategy
Strategy выносит взаимозаменяемые алгоритмы в отдельные объекты и подставляет их в рантайме. Запускаемый пример на Python, замена if/elif, где встречается.
- Observer
Observer уведомляет множество подписчиков об изменении состояния субъекта. Запускаемый пример на Python, push/pull, где встречается событийная модель.
- Command
Command превращает запрос в объект: его можно хранить, ставить в очередь и отменять (undo). Запускаемый пример на Python с историей и откатом.
- Iterator
Iterator даёт единый способ обхода коллекции, не раскрывая её устройство. Запускаемый пример на Python через __iter__/__next__ и генераторы.
- Strategy
6 Поведенческие паттерны (часть 2) и практика
- State
State позволяет объекту менять поведение при смене внутреннего состояния, как будто меняется его класс. Запускаемый пример конечного автомата на Python.
- Template Method
Template Method задаёт скелет алгоритма в базовом классе, отдавая отдельные шаги подклассам. Запускаемый пример на Python и сравнение со Strategy.
- Chain of Responsibility и обзор остальных
Chain of Responsibility передаёт запрос по цепочке обработчиков. Плюс краткий обзор Mediator, Memento и Visitor. Запускаемый пример на Python.
- Как выбрать паттерн и не злоупотреблять
Антипаттерны, признаки злоупотребления паттернами и практический алгоритм выбора. Итоги курса и куда двигаться дальше — рефакторинг и архитектура.
- State
7 Архитектурные паттерны
- MVC, MVP и MVVM
Три паттерна разделения представления и логики: MVC, MVP и MVVM. Чем отличаются, как идёт поток данных, что такое связывание (data binding) и где каждый применяется.
- Слоистая, гексагональная и чистая архитектура
Слои приложения и направление зависимостей: слоистая архитектура, порты и адаптеры (гексагональная), правило зависимостей чистой архитектуры и изоляция домена от инфраструктуры.
- Паттерны микросервисов
Концептуальный разбор паттернов микросервисов: API Gateway и BFF, Saga для распределённых транзакций, Circuit Breaker против каскадных отказов и Service Discovery.
- Событийная архитектура, CQRS и Event Sourcing
Обмен событиями между компонентами, разделение команд и запросов (CQRS) и хранение журнала событий как источника истины (Event Sourcing): как устроено, плюсы и минусы.
- MVC, MVP и MVVM
8 Корпоративные паттерны и доступ к данным
- Repository и Unit of Work
Repository как коллекция-подобный доступ к хранилищу, Unit of Work для отслеживания изменений и атомарной фиксации, Identity Map — на примерах Python.
- Data Mapper против Active Record
Две стратегии маппинга объектов на таблицы: Active Record и Data Mapper, их плюсы и минусы и где какую использует ORM (Django, Rails, SQLAlchemy, Hibernate).
- DTO, мапперы и слой анти-коррупции
Объекты передачи данных (DTO), явные мапперы и anti-corruption layer: как отделить модель API от доменной модели и защитить домен от чужих систем.
- Внедрение зависимостей и инверсия управления
DI вручную и через IoC-контейнер, инверсия управления, принцип инверсии зависимостей из SOLID на практике и тестируемость — на примерах Python.
- Repository и Unit of Work
9 Паттерны конкурентности
- Производитель-потребитель
Паттерн производитель-потребитель: развязка через потокобезопасную очередь, обратное давление и балансировка скоростей с детерминированным демо на Python.
- Пул потоков (worker pool)
Пул потоков: переиспользование воркеров, ограничение параллелизма, ThreadPoolExecutor и почему пул лучше потока на каждую задачу. Демо на Python.
- Future и Promise
Future и Promise: объект-обещание отложенного результата, ожидание через result() и колбэки, как устроен async-результат. Мини-реализация на Python.
- Модель акторов
Модель акторов: изоляция состояния и обмен сообщениями вместо общей памяти, почему меньше гонок, где применяется (Erlang, Akka). Демо на Python.
- Производитель-потребитель
10 Принципы, антипаттерны и рефакторинг
- SOLID вглубь
Пять принципов SOLID на примерах «плохо → хорошо»: SRP, OCP, LSP, ISP, DIP — зачем они нужны и как их применять в реальном коде на Python.
- DRY, KISS, YAGNI и баланс
Три эвристики хорошего кода: не повторяйся (DRY), делай проще (KISS), не пиши лишнего (YAGNI) — и где «сухость» и преждевременная абстракция вредят.
- Запахи кода и антипаттерны
God object, длинный метод, feature envy, спагетти-код: как распознавать запахи кода и антипаттерны и какими приёмами рефакторинга их лечить.
- Рефакторинг к паттернам и оверинжиниринг
Когда паттерн оправдан, а когда лишний: рефакторинг к паттернам по реальной боли и как не скатиться в оверинжиниринг и преждевременную архитектуру.
- SOLID вглубь