不正な状態を表現不能にする

ドメイン上ありえない状態を、そもそも型として構築できないよう設計する原則(“make illegal states unrepresentable”, Yaron Minsky)。実行時バリデーションで弾く代わりに、型で構築不能にして誤りをコンパイル時に消す。

例

-- 悪い: loggedIn=true なのに user=null という不整合が表現できてしまう
type State = { loggedIn: Bool, user: User? }

-- 良い: あり得る場合だけを直和で列挙 → 不整合が存在しない
type State = LoggedOut | LoggedIn of User

手法

「parse, don’t validate」との関係

入力検証を「真偽判定」ではなく「型付き値への変換」として境界で一度だけ行う(Alexis King)。以降のコードは型がすでに正しさを保証する。パーサ/デコーダがその実装手段。

なぜ重要か

バリデーションは「書き忘れ」「順序」「漏れ」が起きるが、型による排除は全経路で機械的に保証される。ドメインモデリングの核(型駆動設計)であり、バグを「直す」のでなく「表現できなくする」発想。

関連

Graph