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/ООП, но он отлично работает для бизнес-логики.

См. также