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