UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Zod】Always-Valid Domain Modelを実装する話

ZodでAlways-Valid Domain Model を実現する話し

zenn.dev

Always-Valid Domain Model とは

  • ドメインモデルがそのライフタイムにおいて常に有効な状態を保つように設計されるアプローチ
  • ドメインモデルの不変条件をクラスのコンストラクターやメソッドを通じて強制し、不正な状態になることがないようにする
  • これにより、アプリケーションの堅牢性が向上し、ランタイムエラーの発生が減少する

ドメインモデルの有効な状態とは、例えば「数量」における「自然数」で「上限付き」が検証されていることを指す

このAlways-Valid Domain Modelの考えは、RefinementsとBranded Typeという2つの方法論を実装すると実現する

  • Refinements(値の制約): 例えばnumber型に「自然数」「上限付き」の制約を加えた値として表現すること
  • Branded Types: (同じ構造の型を区別する): 「価格」などの他のnumber型と混同されないように、これらの数値を型レベルで区別する

それぞれzodを使って実装できる

  • Refinementsはzodの本領なところだと思おうので説明は割愛
  • Branded Typesはzodのbrandを使うと実装可能なことを知った

他に記事での気づきは、Result型の定義にNeverThrowを使っているところ

github.com

これまで自分で定義していたので、これに置き換えるの良さそう

ドメインモデルを検査し、それをイミュータブルに保つやり方の良い参考記事だと思った