Паттерны и принципы — зачем учить

Паттерны учат не ради собеседования. Их ценность — в кругозоре и в том, что когда-нибудь возьмёшь оттуда идею. Главное — не превратить в карго-культ.

Суть

В JS-сообществе паттерны и Computer Science часто воспринимают как балласт для собесов. В C#/Java/C++ — ценят выше. Истина: знать обзорно, применять выборочно, переосмыслять раз в 3-4 года.

Зачем учить паттерны

  • Кругозор — знать о существовании
  • Резерв идей — раз в жизни понадобится
  • Общий язык с командой — «применил тут Adapter»
  • Понимание чужого кода — узнаёшь паттерны
  • Помощь AI — правильный нейминг + структура улучшают результат

Правило 25/25/50

  • 25% паттернов применяешь часто
  • 25% применяешь редко
  • 50% просто знать о существовании
  • Bridge, Composite, Flyweight — редкие
  • Adapter, Observer, Strategy — частые
  • Proxy, Decorator, Facade — постоянные

Главная опасность

«Главное, чтобы это всё не стало карго-культом.»

  • Паттерн ради паттерна — вред
  • Демонстрация знаний коллегам — антипаттерн
  • 30% людей учат паттерны для повышения самооценки
  • 5000 строк там, где хватит 100 — скрытый оверинжиниринг
  • «Сговор архитекторов» — приняли решение, никто не трогает

Адаптация под JS

  • GoF написан для Java/C#/Smalltalk
  • В JS first-class функции — паттерн меняется
  • Strategy = словарь функций по ключу, а не иерархия классов
  • Observer = EventEmitter/EventTarget
  • Iterator = generator/async iterable
  • Adapter — функция, не класс

Пример: Strategy без классов

const strategies = {
  cash: (amount) => amount,
  card: (amount) => amount * 1.02,
  crypto: (amount) => amount * 0.99,
};

const pay = (kind, amount) => strategies[kind](amount);
  • Никакой иерархии классов
  • Никакого extends Strategy
  • Та же гибкость, меньше кода
  • CTO старой школы скажет «переписывай — это не по банде четырёх»

Когда переосмыслять

  • Каждые 3-4 года полный пересмотр
  • При смене языка/фреймворка
  • При смене домена (бухгалтерия → медицина)
  • Знание без обновления мертвеет

Аналогия

«Если человек учился функциональному программированию, но никогда не применял — почему он считает это знание? Это знание только тогда, когда применяется.»

Принципы (SOLID/GRASP)

  • SOLID — единая ответственность, открытость, замещение, разделение интерфейсов, инверсия зависимостей
  • GRASP — Information expert, Creator, Controller, Low coupling, High cohesion
  • В JS они работают, но реализуются иначе
  • Не дрочиться на формулировки — понимать суть

Антипаттерны изучения

  • Учить определения наизусть
  • Слепо переносить из Java/C#
  • Применять все 23 GoF подряд
  • Использовать ради красоты в коде
  • Возмущаться, когда коллега не применил
  • Бесконечно спорить, какой паттерн «правильный»

Когда паттерн полезен

  • Решает реальную проблему в этом проекте
  • Команда понимает и принимает
  • Не усложняет код больше чем убирает дублирование
  • Можно объяснить «зачем», не упоминая GoF

🎓 Источники

  • 🎓 [🛑 Вопросы на интервью: SOLID, GRASP, паттерны GoF] · 2024-06-19 · YouTube
    • Тезисы: разрыв теории и работы; JS-сообщество против C#/Java; не карго-культ; не тянуть всё в проект; переосмыслять 3-4 года
  • 🎓 [🤷 Про софтскилы CTO и архитекторов] · 2025-11-29 · YouTube
    • Тезисы: Strategy = коллекция функций; CTO натягивают банду четырёх по Фаулеру на Swift и Kotlin
  • ⚡ [🙋 Будет ли существовать профессия фронтендер] · 2025-12-06 · YouTube
    • Тезисы: правило 25/25/50; редкие паттерны — запас идей
  • 🎓 [Нужны ли нам знания о шаблонах разработки] · AsForJS · 2025-11-04 · YouTube