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

Разбираемся, что такое паттерн проектирования, откуда они взялись и зачем команде нужен общий словарь решений.

Паттерн проектирования — это типовое, проверенное практикой решение часто встречающейся задачи проектирования, описанное так, чтобы его можно было переиспользовать в разных контекстах.

Паттерн — это идея, а не код

С самого начала зафиксируем: паттерн — это не готовый класс, который копируют в проект. Это описание того, как объекты и классы взаимодействуют, чтобы решить задачу. Один и тот же паттерн на Python, Java и Go выглядит по-разному, но идея остаётся одной.

Термин пришёл из архитектуры: в 1977 году Кристофер Александр описал «язык шаблонов» для строительства зданий. В программирование идею перенесла «банда четырёх» (Gang of Four, GoF) — Гамма, Хелм, Джонсон и Влиссидес — в книге 1994 года «Design Patterns». Те 23 паттерна до сих пор составляют ядро темы.

Зачем они нужны

У паттернов две практические пользы.

  • Общий словарь. Когда вы говорите «здесь нужен Observer», коллега сразу понимает структуру решения — не нужно объяснять десять минут. Имя паттерна сжимает абзац проектного описания в одно слово.
  • Проверенные решения. Эти приёмы отполированы тысячами проектов. Вы не изобретаете велосипед и заодно избегаете типичных ловушек, на которые уже наступали другие.

Покажем «общий словарь» на крошечном примере. Ниже — наивная заготовка Observer (подробно разберём позже). Сейчас важен не код, а то, что описать его можно одним словом.

class Newsletter:
    def __init__(self):
        self._subscribers = []

    def subscribe(self, reader):
        self._subscribers.append(reader)

    def publish(self, issue):
        for reader in self._subscribers:
            reader.receive(issue)


class Reader:
    def __init__(self, name):
        self.name = name

    def receive(self, issue):
        print(f"{self.name} получил выпуск: {issue}")


news = Newsletter()
news.subscribe(Reader("Аня"))
news.subscribe(Reader("Борис"))
news.publish("Выпуск №1")

Вывод:

Аня получил выпуск: Выпуск №1
Борис получил выпуск: Выпуск №1

Вместо «у нас есть издатель, он держит список подписчиков и при событии обходит их» достаточно сказать: «это Observer». Ради этой компрессии смысла паттерны и существуют.

Чего паттерны НЕ делают

Паттерны не делают код быстрее и не являются целью сами по себе. Они управляют сложностью и изменчивостью: добавляют гибкость там, где система будет меняться. За эту гибкость почти всегда платят лишними классами и косвенностью. Если изменчивости нет — паттерн только усложнит код. Об этом будет отдельный урок про over-engineering.

Итог

  • Паттерн — это идея решения, а не готовый код.
  • Главная польза — общий словарь и проверенные решения.
  • Паттерны добавляют гибкость ценой сложности — применяйте осознанно.
Проверьте себя
1. Что такое паттерн проектирования?
AГотовый класс, который копируют в проект
BТиповое проверенное решение задачи проектирования, описанное для переиспользования
CСтандарт оформления кода (отступы, имена)
DБиблиотека с реализацией всех 23 решений
2. Кого называют «бандой четырёх» (GoF)?
AЧетыре языка программирования
BАвторов книги 1994 года «Design Patterns»
CЧетыре категории паттернов
DСоздателей UML
3. Какая из перечисленных — НЕ цель паттернов?
AДать командам общий словарь
BПереиспользовать проверенные решения
CУскорить выполнение программы
DУправлять изменчивостью системы
Поддержать проект