Паттерны проектирования
Паттерн — это отшлифованная временем схема решения частой задачи. Вы учитесь на чужих ошибках, а команда — понимает вашу структуру с первого взгляда.
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 — поняли половину архитектур.
ℹ️
Принцип, который часто спрашивают: «Композиция вместо наследования», «Единственная ответственность», «Открытость для расширения». Чтение паттернов Гаммы начинайте после года практики — база сначала.