The best days are ahead of us.

『関数型ドメインモデリング』に関するメモ part3

2025-03-03 17:00:25

この記事は、Scott Wlaschinの著書『関数型ドメインモデリング』に関連する、Scott Wlaschinの講演『Reinventing the Transaction Script』に関する個人的なメモです。 原著者の主張だけではなく、筆者(猪股)の解釈と考察を含んでいます。

Martin Fowlerによるトランザクションスクリプトの定義

Fowlerによれば、トランザクションスクリプトは次のように定義されています:

トランザクションスクリプトはビジネスロジックを主に単一のプロシージャとして構成し、データベースや薄いデータベースラッパーを通じて直接呼び出しを行います。各トランザクションには独自のトランザクションスクリプトがありますが、共通のサブタスクはサブプロシージャに分割できます。

Fowlerは、このパターンの長所と短所について次のように述べています:

長所

  • シンプルさ - 少量のロジックしかないアプリケーションにとって自然
  • 理解やパフォーマンスのオーバーヘッドが少ない

短所

  • ビジネスロジックが複雑になると、整理された状態を維持するのが難しくなる
  • トランザクション間での重複が発生しやすい
  • リッチなドメインモデルの利点が得られない

Fowlerは、トランザクションスクリプトからドメインモデルへのリファクタリングは可能だが、最初から正しいアプローチを選択する方が簡単だと指摘しています。しかし、彼は「どれほどオブジェクト信者になっても、トランザクションスクリプトを除外しないでください」とも述べており、シンプルな問題に対しては単純な解決策が適切だと主張しています。

Scott Wlaschinの「トランザクションスクリプトの再発明」

Scott Wlaschinは、NDC London 2020の講演で、トランザクションスクリプトパターンに関数型プログラミングの原則を適用することで「再発明」できると主張しました。彼の主な論点は以下の通りです:

従来のトランザクションスクリプトの問題点

  • 変更が難しい
  • 再利用が難しい
  • リッチなドメインモデルがない
  • テストが難しい

FP型トランザクションスクリプトの特徴

  1. 関数としての実装 - 入力を受け取り出力を返す
  2. 合成可能な型によるリッチなドメインモデル
  3. ビジネスロジックとI/Oの分離(中央に純粋なロジック、端にI/O)
  4. 小さな関数の合成によるワークフロー構築
  5. 境界付きコンテキストによるワークフローのグループ化

FP型トランザクションスクリプトの利点

  • 一方向のデータフロー(左から右)による理解のしやすさ
  • コードの肥大化への耐性(インターフェース分離原則の自然な適用)
  • 変更の容易さ(コンポーネントの置換、機能追加、分岐の追加)
  • リッチなドメインモデルの実現
  • テストの容易さ(純粋なビジネスロジックの分離)
  • 現代的アーキテクチャパターン(オニオン、クリーン、ヘキサゴナル)との親和性

Scottは、これらの改良により、トランザクションスクリプトがモノリス、マイクロサービス、サーバーレスなど様々なデプロイオプションと組み合わせ可能な、現代的で価値のあるパターンになると主張しています。

考察:これは本当に「トランザクションスクリプト」なのか?

Scottが提案する「FP型トランザクションスクリプト」は、実際にはMartin Fowlerが定義したトランザクションスクリプトとはかなり異なっています。以下の点で疑問が生じます:

1. ドメインモデルとの類似性

Scottが提案するパターンは、以下の特徴を持ちます:

  • リッチなドメインモデル(合成可能な型システム)
  • ドメインロジックとI/Oの明確な分離
  • 小さな関数の合成によるワークフロー構築
  • 境界付きコンテキストの採用

これらは、Fowlerが描いたシンプルなトランザクションスクリプトよりも、むしろドメインモデルパターンの特徴に近いのではないでしょうか。Fowlerのドメインモデルはオブジェクト指向が前提ですが、Scottのアプローチは関数型パラダイムによるドメインモデルと見なせます。

2. 意図的な命名の可能性

Scottのアプローチで強調される「純粋なビジネスロジックをI/Oで挟む」構造は、関数型プログラミングの一般的な設計原則です。これは「関数型ドメインモデル」や「関数型コア/命令型シェル」というパターンです。

Scottがこれを「FPドメインモデル」ではなく「FP型トランザクションスクリプト」と呼んだのは、戦略的な選択だった可能性があります。「みなさんが軽視している古いパターンも、FPの考え方で見直すと実は現代的で優れたものになりますよ」というメッセージを伝えるために、あえて「トランザクションスクリプト」という言葉を使用したのかもしれません。

また、関数型プログラミングに馴染みのない開発者に対して、「新しい革命的なFPドメインモデリング」よりも「あなたが知っているトランザクションスクリプトを改良する方法」として提示することで、心理的なハードルを下げる意図があったとも考えられます。

3. 貧血ドメインモデルとの関係

関数型アプローチでは、データと振る舞いが分離されるため、一見Martin Fowlerが批判する「ドメインモデル貧血症」のようにも見えます。しかし、適切に実装すれば、ドメインレイヤーにはデータ構造と、それらを操作する関数の両方が存在し、関数型プログラミングにおける「健全な」ドメインモデルとなります。

Scottのアプローチは、ドメインモデルを「貧血症」に見せつつも、ドメインロジックを関数として整理し、実質的には豊かなドメインモデルを構築する方法と解釈できます。

結論

Scottの「FP型トランザクションスクリプト」という概念は、名前こそトランザクションスクリプトを借りていますが、その内実は関数型パラダイムに基づくドメインモデルに近いと考えられます。彼はトランザクションスクリプトという言葉を戦略的に使い、関数型プログラミングの利点をより広い開発者層に伝えようとしたのではないでしょうか。

結果として、彼のアプローチは「再発明」というより「変身」に近く、出発点はトランザクションスクリプトでも、到達点は関数型ドメインモデルとなっています。この「変身」を通じて、Scottは単にパターンを現代化するだけでなく、関数型プログラミングの考え方そのものを広めようとしていると解釈できます。