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
- Толстые контроллеры — антипаттерн. Контроллер должен только делегировать.