Архитектура · Урок 46

Паттерны проектирования

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

Module-паттерн

Инкапсуляция через замыкание: внешний код видит только «наружную» часть, внутренние детали скрыты. В JS-модулях это уже встроено — данные приватны по умолчанию.

// counter.js
let count = 0; // не доступна снаружи
export const counter = {
  inc() { count++; return count; },
  dec() { count--; return count; },
  get() { return count; }
};

Pub/Sub: связываем части без путаницы

const bus = new Map();

export const events = {
  on(name, fn) { bus.set(name, (bus.get(name) || []).concat(fn)); },
  emit(name, data) { (bus.get(name) || []).forEach((fn) => fn(data)); }
};

// модуль A: публикует
events.emit("user:saved", user);

// модуль B: подписывается, ничего не зная про A
events.on("user:saved", (u) => toast(`Сохранён ${u.name}`));
💡
Pub/Sub убирает прямые зависимости: кто создал событие — не важно. Это ядро во многих фреймворках (шина событий, стор, store). Поняли Pub/Sub — поняли половину архитектур.
ℹ️
Принцип, который часто спрашивают: «Композиция вместо наследования», «Единственная ответственность», «Открытость для расширения». Чтение паттернов Гаммы начинайте после года практики — база сначала.