Controller (GRASP)

Контроллер — точка входа, которая принимает запрос от UI/сети и делегирует работу бизнес-логике. Изолирует домен от деталей транспорта.

Что это / Зачем

  • Контроллер ловит сообщение, конвертирует параметры, вызывает доменные сервисы, отдаёт результат.
  • Изолирует UI/HTTP/CLI от бизнес-логики — её можно использовать в любом окружении.
  • Предотвращает race conditions: контроллер сериализует доступ к домену.

Признаки правильного Controller

  • Тонкий: нет бизнес-логики, только координация.
  • Принимает DTO/команду, возвращает результат.
  • Не знает деталей UI и не знает деталей репозитория — только сервисы.

Пример

// HTTP-контроллер не содержит бизнес-логики
class UserController {
  constructor(userService) { this.users = userService; }
  async register(req, res) {
    const dto = parseUserDto(req.body);     // конвертация
    const user = await this.users.register(dto); // делегирование
    res.json(user);
  }
}

Антипаттерн: толстый контроллер

// плохо: HTTP-валидация + БД + email + отчёты в контроллере
app.post('/users', async (req, res) => {
  if (!req.body.email) return res.status(400).end();
  const user = await db.query('INSERT INTO users…', […]);
  await mailer.send(user.email, 'Welcome');
  await db.query('INSERT INTO audit…', […]);
  res.json(user);
});

Controller в MVC = Indirection

Controller в MVC — реализация принципа Indirection: посредник между View и Model. Тоже принцип GRASP.

🎓 Источники

  • 🎓 [GRASP принципы] · 2021-02-25 · YouTube
    • Controller экранирует UI от логики, предотвращает race conditions.
    • Controller в MVC = Indirection (посредник).
  • 🎓 [Middleware антипаттерн в Node.js 2026] · 2026-03-13 · YouTube
    • Толстые контроллеры — антипаттерн. Контроллер должен только делегировать.

См. также