コンテンツにスキップ

ありえない状態のオブジェクトが作られないよう、制約が適切に設定されているか?

Type: Structure
Category: ドメイン
Audience: 設計初心者 / 設計中のチーム / レビュワー


背景・概要

オブジェクトは生成された時点で「業務的に正しい状態」であるべき

後から制約チェックを別途書く方式はエラーが漏れやすく、複雑なロジックがばらけて保守困難になる。制約=クラスの設計そのものと捉えるとよい


  • Task(dueDate: Date, isCompleted: Boolean) のような生成時に成立する型制約を設計
  • 専用のファクトリメソッドを介してのみ生成し、整合性違反を防ぐ
  • EnumやSealed Classなどで状態の遷移範囲を明示(例:Draft → Submitted → Paid)

よくある失敗例

  • 任意のフィールドをnull許容しすぎて、存在チェックがいたる所に必要
  • status に存在しない値が入り、表示やロジック分岐でバグを生む
  • ドメインに対する状態遷移の制限がなく、不正な操作がサーバーに通る

FAQ

Q. 制約は全て型で表現すべき?

A. 可能であれば型で保証する(Type-safe)のが理想。難しい場合はファクトリやコンストラクタでのバリデーションでもOK

Q. 状態の組み合わせが多い場合は?

A. 状態遷移図にして検討したり、状態ごとに専用クラスを分けて対応することも検討するとよい


関連観点