🧩 Transaction Script
✅ このスタイルの概要
1 つの処理(トランザクション)を 1 つの関数・スクリプトとして実装する構造スタイル。
画面や API の「1 ユースケース= 1 関数」というシンプルな設計で、小規模システムに向く。
✅ 解決しようとした問題
Transaction Script は Big Ball of Mud のような混沌よりは秩序があり、
次のような現実的課題を解決するために採用されることが多い。
- まずは動くものを作りたい
- 要件が複雑でない
- ドメインルールが軽く、ビジネスロジックは“処理の直列手続き”で済む
- データ構造も単純で、アプリ内部の “表現” と “DB 構造” がほぼ一致している
- 設計コストを最小にしたい(開発期間が短い)
✅ 基本思想・ルール
Transaction Script は次のような特徴を持つ:
- 各処理単位(Use Case / API Handler / バッチジョブ)ごとに関数を作る
- ビジネスロジックはその関数内部に “直列で” 書かれる
- データアクセスも関数内で直接呼ばれることが多い
- Domain Model のような複雑なオブジェクトは不要
- 他の関数との共有ロジックはできるだけ減らされる(または増やしてはいけない)
実装例のイメージ:
processOrder()
→ 入力チェック
→ 在庫確認
→ 決済呼び出し
→ 注文レコードの保存
→ 完了レスポンス
✅ 得意なアプリケーション
- CRUD 中心のシンプルアプリ
- 小規模な管理画面
- 数週間〜数ヶ月の短命プロダクト
- データモデルと UI がほぼ一致する Web アプリ
- 小規模スタートアップの MVP(最小実用製品)
❌ 不向きなケース
- ビジネスロジックが複雑で “手続き列” では表現しきれない
- 読み取り・書き込みロジックが大量に分散していく
- 同じ処理のバリエーションが増える
- ステートや不変条件の制御が必要(DDD が向く領域)
- 長期運用・機能追加が継続的に発生するプロダクト
✅ 歴史(系譜・親スタイル)
- Fowler の Patterns of Enterprise Application Architecture によって明確化された
- Big Ball of Mud → Transaction Script → Layered Architecture と発展
- 小規模 → 中規模へスケールさせる際に「限界」が現れ、
Domain Model / Layered などが登場した
✅ 関連スタイル
- Big Ball of Mud(さらに初期の混沌)
- Active Record(データ中心系での「Transaction Script の進化形」)
- Classic Layered Architecture(Transaction Script の負債を解消するアプローチ)
- Domain Model / DDD(複雑領域ではこちらが有効)
✅ 代表的なフレームワーク
Transaction Script は特定のフレームワークに依存しないが、
“1 ユースケース= 1 関数” の構造を自然に誘導する場面が多い。
-
Next.js / Node.js(API Routes / Route Handlers)
- 単一関数でリクエスト → レスポンスを完結させやすい
- 手続き的処理が中心の小規模 API に向く
-
Laravel / Rails(Controller 内の手続き的処理)
- 小規模 CRUD では Controller 内に処理が集まりやすく Transaction Script 化しやすい
-
サーバレス系(AWS Lambda / Cloud Functions)
- 1 関数 = 1 処理となるため、Transaction Script と非常に相性が良い
✅ このスタイルを支えるデザインパターン
Transaction Script 自体は “パターンをほぼ必要としないシンプル構造” だが、
以下のパターンが部分的に補助的役割を果たす。
-
Command
- 処理単位(Use Case)を操作オブジェクトとして表現する際に利用される
- トランザクション処理の「操作」を明確化できる
-
Template Method
- 複数の Transaction Script 間で処理ステップが似ている場合の抽象化に向く
- 例:共通の前処理・後処理を統一化する
-
Strategy
- 処理の“差し替え点”が発生した場合に使用されることがある
- 基本的には TS の守備範囲外だが、成長時に補助として現れる
✅ まとめ
Transaction Script は、簡単なアプリケーションに最適な「現実的・実用的な」構造スタイル。
しかし成長し続けるプロダクトでは、ロジックの重複・肥大化・変更困難・テスト困難が急速に拡大する。
そのため、「スケールしない」ことを理解したうえで使うべきスタイルと言える。