> Применял ли ты архитектурные шаблоны в коде (JavaScript)

Уровень: senior · Роль: frontend · Язык: JavaScript · Категория: Технические вопросы

Компании: TrendTech

Стек: Node.js, JavaScript

> Пример ответа

Короткий ответ

Да, регулярно применяю архитектурные шаблоны в frontend-разработке на JavaScript. Наиболее часто использую Module pattern для инкапсуляции состояния, Observer pattern для управления событиями в компонентах, и Middleware pattern в Express-приложениях на Node.js. В сложных SPA применяю Flux/Redux как реализацию однонаправленного потока данных. Эти шаблоны помогают поддерживать код читаемым, тестируемым и масштабируемым.

Подробное объяснение

Архитектурные шаблоны - это проверенные решения типовых проблем проектирования. В frontend-разработке на JavaScript и Node.js я использую их для:

  • Module pattern - основа любого модульного кода, особенно до появления ES modules. Позволяет скрывать внутренние детали реализации и экспортировать только публичный API. В современных проектах это часто комбинируется с ES modules или CommonJS.

  • Observer pattern - критически важен для event-driven архитектуры браузера. Реализуется через EventEmitter в Node.js, пользовательские события в DOM, или подписку на store в Redux. Позволяет слабо связывать компоненты.

  • Middleware pattern - основа Express/Koa. Каждый middleware - это функция, которая получает request/response и вызывает next. Это даёт гибкость в обработке запросов: логирование, аутентификация, валидация, сжатие.

  • Flux/Redux pattern - однонаправленный поток данных: action → reducer → store → view. Решает проблему непредсказуемого состояния в больших приложениях. Вместо двухстороннего binding (как в AngularJS) данные текут только в одном направлении.

  • Factory pattern - создание объектов без указания конкретного класса. Полезен при работе с разными типами компонентов или API-клиентов.

  • Singleton pattern - для глобальных сервисов: логгер, конфигурация, кэш. В Node.js модули кэшируются после первого require, что даёт singleton по умолчанию.

На практике

В реальных проектах я комбинирую шаблоны. Например, в React-приложении с Express-бэкендом:

  • На клиенте: Redux (Flux) для управления состоянием, Observer через подписку компонентов на store, Factory для создания action creators.
  • На сервере: Middleware для обработки запросов, Module pattern для разделения на роуты, контроллеры, сервисы, репозитории.
  • Общее: Singleton для конфигурации и логгера, Observer для WebSocket-событий.

Конкретный пример: в проекте с real-time обновлениями я использовал EventEmitter (Observer) для уведомления компонентов о новых данных с WebSocket, не создавая жёстких связей. Компоненты просто подписывались на нужные события и отписывались при unmount.

Пример кода

JAVASCRIPT
// Middleware pattern в Express
const express = require('express');
const app = express();
// Logger middleware
const logger = (req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
};
// Auth middleware
const auth = (req, res, next) => {
if (!req.headers.authorization) {
return res.status(401).json({ error: 'Unauthorized' });
}
req.user = { id: 1, role: 'admin' };
next();
};
// Module pattern для сервиса
const userService = (() => {
const users = new Map();
return {
getById: (id) => users.get(id),
create: (data) => {
const id = Date.now();
users.set(id, { ...data, id });
return users.get(id);
}
};
})();
// Использование
app.use(logger);
app.post('/api/users', auth, (req, res) => {
const user = userService.create(req.body);
res.json(user);
});

Как отвечать на собеседовании

Начни с конкретных примеров из опыта: "В проекте X я применил Middleware pattern для...". Объясни, какую проблему решал шаблон и почему выбрал именно его. Покажи понимание trade-off: например, Observer упрощает расширение, но усложняет отладку из-за неявных связей. Упомяни, что шаблоны не цель, а средство - иногда проще написать простую функцию, чем внедрять Factory. Будь готов написать код на доске или в редакторе.

Что проверяет интервьюер

  • Понимание не просто названий шаблонов, а их сути и применимости.
  • Умение выбирать правильный шаблон под конкретную задачу.
  • Знание JavaScript-специфики: замыкания для Module, EventEmitter для Observer, функции высшего порядка для Middleware.
  • Опыт работы с реальными проектами, а не только теория.
  • Понимание trade-off: каждый шаблон что-то упрощает, но усложняет другое.

Типичные ошибки

  • Называть шаблоны, но не уметь объяснить, зачем они нужны на практике.
  • Использовать Singleton там, где нужен обычный объект - это усложняет тестирование.
  • Путать Observer с Pub/Sub (в Observer субъект напрямую уведомляет наблюдателей, в Pub/Sub есть брокер).
  • Думать, что шаблоны - это серебряная пуля. Иногда простая функция лучше Factory.
  • Не учитывать особенности JavaScript: например, Module pattern через IIFE уже не актуален с появлением ES modules.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью