【あたいおぶじぇくと】
値オブジェクト とは?
最終更新:
💡 同じ金額と通貨なら、値として同じ
IDではなく、意味のある値の組み合わせで等しいかを判断するオブジェクト。金額と通貨、座標、日付範囲などに使い、変更時は新しい値を作る不変の設計が基本。DDD以外のコードでも使われる。
📌 このページのポイント
- IDによる同一性と、値による等値性を区別する
- 金額なら数値だけでなく通貨も比較する
- 変更するなら新しい値を作る設計が基本
- 等値性の比較方法は言語・実装に合わせて用意する
普通のオブジェクトと、何が違うの?
金額なら、数字が同じだけでよい?
1000円と1000円は値として等しいけれど、1000円と1000ドルは違うね。金額なら数値と通貨のように、その概念に必要な値をまとめて比較する。メモリ上で別々に作られたかとは分けて考えるんだ。
値が同じなら、比較演算子で同じになる?
言語と実装によるよ。JavaScriptのオブジェクトを===で比較すると、同じ内容でも別の参照ならfalseになる。値を比較するequalsメソッドなどを用意し、使う側もその比較方法を選ぶ必要があるんだ。
金額を変えたいときは、どうする?
変更後の金額を表す新しいオブジェクトを作るのが基本だよ。共有した値をその場で書き換えると、別の場所にも変更が広がることがある。不変にすると、元の値を保ったまま新しい値を扱いやすいね。
住所も、必ず値オブジェクトにする?
目的によるよ。配送先の表記をまとめるなら値として扱えるけれど、地図システムで住所の関係や履歴を追うなら別の設計もある。意味のある型にすると検証をまとめやすいが、現実にその住所が存在するかまで自動で保証するわけではないんだ。
📖 おまけ:英語の意味
「Value Object」 = 値オブジェクト
💬 値の内容によって等しさを判断する設計。DDDでも使うが、ドメインモデル以外でも役立つ考え方だよ。