Transaction Script
Бизнес-операция как процедура: чёткая фиксированная последовательность шагов. Альтернатива тяжёлым доменным моделям. Близок к Template Method, но без переопределения шагов.
Что это / Зачем
- Каждая бизнес-операция — отдельная процедура (
transferMoney,placeOrder,cancelBooking). - Внутри процедуры — линейный сценарий: достать данные, проверить, изменить, сохранить.
- Хорошо подходит для информационных систем с in-memory или локальной БД и модульного монолита.
Признаки применимости
- Логика — последовательность шагов, мало бизнес-инвариантов.
- Маленький-средний проект, монолит.
- Нет нужды в полиморфных стратегиях для каждой операции.
Пример
async function transferMoney(transfer) {
const from = await accounts.getById(transfer.fromId);
const to = await accounts.getById(transfer.toId);
if (from.balance < transfer.amount) throw new Error('insufficient');
from.balance -= transfer.amount;
to.balance += transfer.amount;
await accounts.save(from);
await accounts.save(to);
return { ok: true };
}
Когда НЕ применять
- Микросервисная система → нужна Saga (Transaction Script между сервисами не работает — нет общей транзакции).
- Внешние сервисы в середине сценария → возможны частичные сбои, нужна компенсация.
- Огромный домен с сотнями инвариантов → лучше rich domain model.
Антипаттерн: размазанная транзакция
// плохо: пол-сценария в контроллере, пол — в сервисе
app.post('/transfer', async (req, res) => {
const from = await db.query('SELECT…'); // часть в контроллере
if (from.balance < req.body.amount) return res.status(400).end();
await service.actualTransfer(req.body); // часть в сервисе
res.end();
});
🎓 Источники
- 🎓 [Transaction Script и Template Method] · 2025-12-18 · YouTube
- «Если модульный монолит — Transaction Script или Template Method подходят. Если микросервисы — нужна Saga».
- Тело Transaction Script — простое процедурное программирование. Не требует наследования (в отличие от Template Method).
- 🎓 [ООП, процедурное, Transaction Script, ORM] · 2023-06-16 · YouTube
- Альтернативная позиция: Transaction Script критикуется сторонниками DDD/ООП, но он отлично работает для бизнес-логики.