参照透過性を守るとドメインモデルの自己完結性が下がることがある

ドメインモデルの純粋性という言葉は、異なる性質をまとめて指しやすい。 同じ入力から同じ結果が得られる参照透過性と、業務上の意味や判断の進め方がモデルの中で完結する自己完結性は、独立して評価する必要がある。

自己完結性も一枚岩ではない。 どの事実が必要で、その事実によって何が決まるかがモデルに書かれている状態は、意味上の自己完結性と呼べる。 必要な外部処理をいつ呼び、その結果をどこへ渡して判断を再開するかまでモデルに書かれている状態は、進行上の自己完結性と呼べる。

Decision パターンは、外部の事実が必要になると中断状態を値として返し、取得した事実を受け取って判断を再開する。 ドメイン側の関数は値だけを受け取って値だけを返すため、参照透過性を保てる。 どの事実が必要か、その事実によって許可と拒否のどちらへ進むかもドメイン側にあるため、意味上の自己完結性もおおむね保たれる。

一方、呼び出し側は ViewNeedFollowing を IsFollowing に対応づけ、取得結果を ViewNeedFollowing.Decide へ戻し、終端状態まで反復することを知っている。 記事はこれを業務判断ではなく対応表と位置づけるが、判断を最後まで進めるための知識がモデルの外にある以上、進行上の自己完結性は下がっている。 Decision パターンが純粋性、完全性、性能をすべて満たすという主張は、完全性を業務上の条件分岐がドメイン内にあることへ限定したときに成り立つ。

Souther は別の境界を選ぶ。 外部の事実を得る処理も behavior としてモデルに宣言し、その入力、出力、事後条件、呼び出す位置をドメインモデルに含める。 具体的なデータベースアクセスは Java から注入されるためモデル単独では実行できないが、依存を使って判断を進める手順はモデル内に残る。 これにより意味上と進行上の自己完結性を優先し、注入された処理を含む実行全体には参照透過性を要求しない。

したがって両者の差は、純粋性の有無ではなく、どの性質を守るためにどこへ境界を引くかにある。 Decision パターンは参照透過性を守る代わりに副作用との接続と判断の進行を外へ出し、Souther はそれらを契約としてモデルに含める代わりに実行全体の参照透過性を保証範囲から外す。 業務上の結果と実行失敗を別の経路に置くことも、この境界選択の帰結である。

https://zenn.dev/tellernovel_inc/articles/0193eb68cabb6e

https://zenn.dev/kawasima/articles/souther-ddd-trilemma

#domain-model #referential-transparency #souther #decision-pattern