ブログトップ 記事一覧 ログイン 無料ブログ開設

Strategic Choice

2011-06-09

[]ドメイン駆動設計・モデル「深」化編・副作用のない関数

SIDE-EFFECT-FREE-FUNCTIONS

プロシージャよりファンクション

俯瞰図

所属するストーリの俯瞰図です。

どういうこと?

操作の呼び出しによって、オブジェクトの状態が変化することを「副作用」と言います。副作用を伴う操作を「コマンド」といい、「プロシージャ」として実現されます。副作用を伴わない操作を「クエリ」といい、「ファンクション(関数)」として実現されます。

「コマンド」が複雑に組み合わさって行くと、プログラムの振る舞いを理解するのが極端に難しくなってしまいます。できる限り「クエリ」操作を作成し、「コマンド」操作を必要最小限にとどめるようにします。

操作の種類実現方法説明
コマンドプロシージャオブジェクトの状態を変化させる。(=副作用がある)
クエリファンクションオブジェクトの状態を変化させない。(=副作用がない)

どうして?

複数のルール間に存在する相互作用や、演算の合成は、予測するのが極端に困難になります。

操作を呼び出す開発者は、結果を予想するために、呼び出し先の実装とそれが委譲する実装をすべて理解しなければなりません。開発者がインタフェースによって隠されたものを見る必要があるなら、そのインタフェースによる抽象化の効用は限定されていることになります。

安全に予測できるように抽象化されていないと、開発者は組み合わせの爆発を制御しなければならなくなります。これでは、現実に構築できるふるまいの豊かさを制限されることになってしまいます。

どうすれば?

ファンクション指向

プログラムロジックのうち、できる限り多くの部分をファンクションに置きます。コマンドは厳密に分離して、ドメインについての情報を戻さない、非常に単純な操作にします。

値オブジェクト指向

ある概念が、値オブジェクトの担う責務に合致する場合には、複雑なロジックをその値オブジェクトに移すことによって、副作用を制御できます。


同パターン

関連

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証