Computer Science

Учебник Паттерны проектирования для начинающих

38 уроков · 10 разделов · бесплатно, без регистрации

Практический курс по 23 классическим паттернам проектирования (GoF). Для каждого паттерна — какую задачу он решает, идея, запускаемый пример на чистом Python и где он встречается в реальном коде. Аудитория: знающие ООП и хотя бы один язык. Вы научитесь видеть паттерны в чужом коде, осознанно применять их и не злоупотреблять.

Курс «Паттерны проектирования» состоит из 10 разделов и 38 уроков: Введение в паттерны, Порождающие паттерны, Структурные паттерны (часть 1), Структурные паттерны (часть 2), Поведенческие паттерны (часть 1), Поведенческие паттерны (часть 2) и практика, Архитектурные паттерны, Корпоративные паттерны и доступ к данным, Паттерны конкурентности и Принципы, антипаттерны и рефакторинг. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.

Программа курса

  1. 1 Введение в паттерны

    1. Что такое паттерн проектирования

      Паттерн проектирования — типовое проверенное решение задачи. Откуда взялись паттерны GoF, зачем нужны общий словарь и проверенные приёмы.

    2. Классификация: порождающие, структурные, поведенческие

      Три группы паттернов GoF: порождающие (создание объектов), структурные (композиция) и поведенческие (взаимодействие). Как ориентироваться в каталоге.

    3. Принципы хорошего дизайна: SOLID кратко

      SOLID — пять принципов ООП-дизайна: SRP, OCP, LSP, ISP, DIP. Краткое объяснение каждого с мини-примером на Python — фундамент под паттерны.

    4. Интерфейсы и когда паттерны вредят

      Принцип «программируй на уровне интерфейсов, а не реализаций» и обратная сторона — over-engineering. Когда паттерн усложняет код вместо пользы.

  2. 2 Порождающие паттерны

    1. Singleton и его критика

      Singleton гарантирует единственный экземпляр класса и глобальную точку доступа. Реализация на Python, плюсы, минусы и почему многие считают его антипаттерном.

    2. Factory Method

      Factory Method переносит выбор конкретного класса в отдельный метод. Реализация на Python, как он убирает if/elif по типу и где применяется.

    3. Abstract Factory и Builder

      Abstract Factory создаёт семейства согласованных объектов, Builder собирает сложный объект пошагово. Запускаемые примеры на Python и когда что выбрать.

    4. Prototype

      Prototype создаёт новые объекты копированием существующего экземпляра-прототипа. Реализация через copy.deepcopy, отличие shallow и deep copy, где применяется.

  3. 3 Структурные паттерны (часть 1)

    1. Adapter

      Adapter соединяет два несовместимых интерфейса, переводя вызовы одного в вызовы другого. Запускаемый пример на Python и где встречается обёртка чужого API.

    2. Decorator

      Decorator динамически добавляет объекту новые обязанности, оборачивая его. Запускаемый пример на Python, отличие от наследования, где применяется.

    3. Facade

      Facade даёт простой единый интерфейс к сложной подсистеме. Запускаемый пример на Python, отличие от Adapter и где применяется фасад над модулями.

  4. 4 Структурные паттерны (часть 2)

    1. Composite

      Composite позволяет работать с деревом объектов (файлы и папки) единообразно. Запускаемый рекурсивный пример на Python и где встречается.

    2. Proxy

      Proxy подменяет объект заместителем для ленивой загрузки, кеширования или контроля доступа. Запускаемый пример ленивого и кеширующего прокси на Python.

    3. Bridge и Flyweight кратко

      Bridge разделяет абстракцию и реализацию по двум осям. Flyweight экономит память, разделяя общее состояние. Запускаемые примеры на Python.

  5. 5 Поведенческие паттерны (часть 1)

    1. Strategy

      Strategy выносит взаимозаменяемые алгоритмы в отдельные объекты и подставляет их в рантайме. Запускаемый пример на Python, замена if/elif, где встречается.

    2. Observer

      Observer уведомляет множество подписчиков об изменении состояния субъекта. Запускаемый пример на Python, push/pull, где встречается событийная модель.

    3. Command

      Command превращает запрос в объект: его можно хранить, ставить в очередь и отменять (undo). Запускаемый пример на Python с историей и откатом.

    4. Iterator

      Iterator даёт единый способ обхода коллекции, не раскрывая её устройство. Запускаемый пример на Python через __iter__/__next__ и генераторы.

  6. 6 Поведенческие паттерны (часть 2) и практика

    1. State

      State позволяет объекту менять поведение при смене внутреннего состояния, как будто меняется его класс. Запускаемый пример конечного автомата на Python.

    2. Template Method

      Template Method задаёт скелет алгоритма в базовом классе, отдавая отдельные шаги подклассам. Запускаемый пример на Python и сравнение со Strategy.

    3. Chain of Responsibility и обзор остальных

      Chain of Responsibility передаёт запрос по цепочке обработчиков. Плюс краткий обзор Mediator, Memento и Visitor. Запускаемый пример на Python.

    4. Как выбрать паттерн и не злоупотреблять

      Антипаттерны, признаки злоупотребления паттернами и практический алгоритм выбора. Итоги курса и куда двигаться дальше — рефакторинг и архитектура.

  7. 7 Архитектурные паттерны

    1. MVC, MVP и MVVM

      Три паттерна разделения представления и логики: MVC, MVP и MVVM. Чем отличаются, как идёт поток данных, что такое связывание (data binding) и где каждый применяется.

    2. Слоистая, гексагональная и чистая архитектура

      Слои приложения и направление зависимостей: слоистая архитектура, порты и адаптеры (гексагональная), правило зависимостей чистой архитектуры и изоляция домена от инфраструктуры.

    3. Паттерны микросервисов

      Концептуальный разбор паттернов микросервисов: API Gateway и BFF, Saga для распределённых транзакций, Circuit Breaker против каскадных отказов и Service Discovery.

    4. Событийная архитектура, CQRS и Event Sourcing

      Обмен событиями между компонентами, разделение команд и запросов (CQRS) и хранение журнала событий как источника истины (Event Sourcing): как устроено, плюсы и минусы.

  8. 8 Корпоративные паттерны и доступ к данным

    1. Repository и Unit of Work

      Repository как коллекция-подобный доступ к хранилищу, Unit of Work для отслеживания изменений и атомарной фиксации, Identity Map — на примерах Python.

    2. Data Mapper против Active Record

      Две стратегии маппинга объектов на таблицы: Active Record и Data Mapper, их плюсы и минусы и где какую использует ORM (Django, Rails, SQLAlchemy, Hibernate).

    3. DTO, мапперы и слой анти-коррупции

      Объекты передачи данных (DTO), явные мапперы и anti-corruption layer: как отделить модель API от доменной модели и защитить домен от чужих систем.

    4. Внедрение зависимостей и инверсия управления

      DI вручную и через IoC-контейнер, инверсия управления, принцип инверсии зависимостей из SOLID на практике и тестируемость — на примерах Python.

  9. 9 Паттерны конкурентности

    1. Производитель-потребитель

      Паттерн производитель-потребитель: развязка через потокобезопасную очередь, обратное давление и балансировка скоростей с детерминированным демо на Python.

    2. Пул потоков (worker pool)

      Пул потоков: переиспользование воркеров, ограничение параллелизма, ThreadPoolExecutor и почему пул лучше потока на каждую задачу. Демо на Python.

    3. Future и Promise

      Future и Promise: объект-обещание отложенного результата, ожидание через result() и колбэки, как устроен async-результат. Мини-реализация на Python.

    4. Модель акторов

      Модель акторов: изоляция состояния и обмен сообщениями вместо общей памяти, почему меньше гонок, где применяется (Erlang, Akka). Демо на Python.

  10. 10 Принципы, антипаттерны и рефакторинг

    1. SOLID вглубь

      Пять принципов SOLID на примерах «плохо → хорошо»: SRP, OCP, LSP, ISP, DIP — зачем они нужны и как их применять в реальном коде на Python.

    2. DRY, KISS, YAGNI и баланс

      Три эвристики хорошего кода: не повторяйся (DRY), делай проще (KISS), не пиши лишнего (YAGNI) — и где «сухость» и преждевременная абстракция вредят.

    3. Запахи кода и антипаттерны

      God object, длинный метод, feature envy, спагетти-код: как распознавать запахи кода и антипаттерны и какими приёмами рефакторинга их лечить.

    4. Рефакторинг к паттернам и оверинжиниринг

      Когда паттерн оправдан, а когда лишний: рефакторинг к паттернам по реальной боли и как не скатиться в оверинжиниринг и преждевременную архитектуру.