値オブジェクトを使う4つのモチベーション
値オブジェクトを導入する主なモチベーションは、以下の4点に集約される。
1.表現力を高める
プリミティブ型は汎用的であるがゆえに、コード上でその意味を十分に表現できない。
値オブジェクトを導入することで、システム固有の概念を明確に表現できる。
2.不正な値を排除する
値オブジェクトは生成時にバリデーションを行い、不正な値が存在する余地をなくす。
3.誤った代入を防ぐ
型として明確に定義されているため、異なる概念を誤って代入してしまうリスクを低減できる。
4.ロジックの散在を防ぐ
値に関するルールやロジックを一箇所に集約し、コードの一貫性と保守性を向上させる。
値オブジェクトの意義
「システム固有の値を作る」というシンプルな考え方が、値オブジェクトの核とされる。
どのシステムにも特有の値が存在するが、プリミティブ型だけで構築すると、その意味やルールが不明瞭になりがちである。
値オブジェクトは、こうしたドメイン固有のルールを内包し、コードそのものをドキュメントとして機能させる。
システムの仕様はドキュメントで管理されることが多いが、ルールをコードに落とし込むことで、仕様の参照や維持が容易にできる。
値オブジェクトは、ドメイン知識をコードに反映させるDDDの基本パターンとされる。
このように、値オブジェクトはシステムの保守性や信頼性を高める重要な役割を担う。
フロントエンドにおけるDDDの取り入れ方
ビジネスロジックは domain/ディレクトリに置く
データ取得は infrastructure/にまとめる
のように整理できる。
src
┗domain/ # 値オブジェクトやエンティティ (User.ts Money.tsなど)
┗application/ #ユースケース層(fetchUser.tsなど)
┗infrastructure/ #API通信(apiClient.ts など)
┗pages/ # ページ
┗components/ # UIコンポーネント
- 「ビジネスロジック (ドメイン)」と「UI(コンポーネント)」を分けて管理しやすくなる
- バックエンドのDDDとフロントのDDDを統一できる