「ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本」書籍がDDDを実践しはじめるのに分かりやすくとてもよいのですが、忘れてしまい何度か読み直しているのでまとめておきます。

ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本
- 成瀬 允宣
- 翔泳社
- 価格¥1,760(2022/05/05 01:05時点)
- 発売日2020/02/13
- 商品ランキング2,613位
値オブジェクトとは
値オブジェクトとは、システム固有の値を表現するために定義されたオブジェクトです。
例えば、氏名をシステムで扱う場合、プリミティブな値で「氏名」を扱うことも可能ですが、値オブジェクトとして扱った方が、扱いやすく表現力も増すということです。
プリミティブな値で表現した場合
値オブジェクトで表現した場合
実行
値オブジェクトには下記の特徴があります。
- 不変である
- 交換が可能である
- 等価性によって比較される
不変である
FullName
はシステム固有の値を表している値オブジェクトです。
FullName
は値FullName
は不変にすべき- 値を変更するためのふるまいである
ChangeLastName
メソッドはFullName
クラスに定義されるべきものではない
不変であるが交換が可能・・・
どうゆうこと?となりましたが
値オブジェクトはあくまで「値」であり「値の値」を変更するべきではない(そもそも「値の値」なんてものは通常ない)と捉えることでなんとなく腑に落ちました。
交換が可能である
代入こそが値を交換する表現方法です。
つまり値オブジェクトに値オブジェクトを代入することで交換ができます。
等価性によって比較される
値オブジェクトはシステム固有の値で、あくまでも値なので、その属性を取り出して比較をするのではなく、値と同じように値オブジェクト同士が比較できるようにする方が自然な記述になります。
値オブジェクトでルールを担保する
フィールドにプリミティブな値を利用していたとしても、値オブジェクトを利用していれば引数として渡された時点でチェックを行えば、ルールの担保ができます。
ふるまいをもった値オブジェクト
値オブジェクトは不変ですが、独自のふるまいが定義できます。下記の処理をプリミティブな値で表現する場合、円とドルを足してしまうなどの不具合を事前にチェックして防ぐことが難しくなります。
振る舞いを持った値オブジェクト例
実行
値オブジェクトを採用するモチベーション
- 表現力が増す
- 不正な値を存在させない
- 誤った代入を防ぐ
- ロジックの散在を防ぐ
まとめ
- 値オブジェクトのコンセプトは「システム固有の値を作ろう」
- コードがドキュメントとして機能する、ドメイン駆動設計における基本のパターン
- ドメインの概念をオブジェクトとして定義しようとするときに、まずは値オブジェクトにあてはめてみることを検討してみる
値オブジェクトについて簡単にまとめましたが、詳しくは下記書籍にてご確認ください。

ドメイン駆動設計入門 ボトムアップでわかる!ドメイン駆動設計の基本
- 成瀬 允宣
- 翔泳社
- 価格¥1,760(2022/05/05 01:05時点)
- 発売日2020/02/13
- 商品ランキング2,613位
その他参考書籍

エリック・エヴァンスのドメイン駆動設計
- Eric Evans,和智右桂,牧野祐子,今関剛
- 翔泳社
- 価格¥5,148(2022/05/05 01:05時点)
- 発売日2011/04/08
- 商品ランキング37,053位

実践ドメイン駆動設計 (Object Oriented SELECTION)
- ヴォーン・ヴァーノン,髙木 正弘
- 翔泳社
- 価格¥5,720(2022/05/05 01:05時点)
- 発売日2015/03/16
- 商品ランキング28,318位