TL;DR

データが正しいビジネスルールに従っていること。Domain Modeling Made Functional では、完全性(integrity)を妥当性とも言い換えている。

なぜ必要か

Domain Modeling Made Functional によると、ドメインモデルは境界づけられたコンテキストの中で、常に完全性と整合性を保っている必要がある。完全性はデータがビジネスルールに従っていること、整合性はモデルの異なる部分が事実について一致していることである。

仕組み

同書は、完全性を型で保証する方法をいくつか示している。

  • 単純な値の制約: コンストラクタをプライベートにし、無効な値ならエラーを返すスマートコンストラクタを用意して、不正な値を作れないようにする
  • 測定単位: F# では数値に測定単位を付けられ、単位が一致しないとコンパイルエラーになる
  • 不変条件: 「注文には 1 行以上の明細がある」のような条件を、空にならないリストの型で表す
  • ビジネスルール: 検証済みと未検証のメールアドレスを別の型に分け、不正な状態を表現できないようにする

例

「1 以上 1000 以下」という制約を持つ数量は、スマートコンストラクタで次のように表す。

module UnitQuantity =
    type UnitQuantity = private UnitQuantity of int
 
    let create qty =
        if qty < 1 then
            Error "UnitQuantity can not be negative"
        else if qty > 1000 then
            Error "UnitQuantity can not be more than 1000"
        else
            Ok (UnitQuantity qty)

関連

出典