【あたいおぶじぇくと】

値オブジェクト とは?

最終更新:
💡 同じ金額と通貨なら、値として同じ

IDではなく、意味のある値の組み合わせで等しいかを判断するオブジェクト。金額と通貨、座標、日付範囲などに使い、変更時は新しい値を作る不変の設計が基本。DDD以外のコードでも使われる。

📌 このページのポイント
値オブジェクト:比べるのは中身エンティティ値オブジェクトID:1ID:2田中田中≠同名でも別の人10001000JPYJPY=同じ金額・通貨IDの一致と、値の一致を分けよう
左はユーザーIDによる同一性、右は金額と通貨による等値性の例。比較方法は実装する。値を変えるときは新しい値を作る設計が基本。
ひよこ ひよこ
普通のオブジェクトと、何が違うの?
ペンギン先生 ペンギン先生
オブジェクトの分類の一つだよ。DDDのエンティティは、たとえばユーザーIDで同じ人かを判断する。値オブジェクトでは、座標や金額などの値が等しいかを判断するんだ。普通のオブジェクトがすべてエンティティという意味ではないよ。
ひよこ ひよこ
金額なら、数字が同じだけでよい?
ペンギン先生 ペンギン先生
1000円と1000円は値として等しいけれど、1000円と1000ドルは違うね。金額なら数値と通貨のように、その概念に必要な値をまとめて比較する。メモリ上で別々に作られたかとは分けて考えるんだ。
ひよこ ひよこ
値が同じなら、比較演算子で同じになる?
ペンギン先生 ペンギン先生
言語と実装によるよ。JavaScriptのオブジェクトを===で比較すると、同じ内容でも別の参照ならfalseになる。値を比較するequalsメソッドなどを用意し、使う側もその比較方法を選ぶ必要があるんだ。
ひよこ ひよこ
金額を変えたいときは、どうする?
ペンギン先生 ペンギン先生
変更後の金額を表す新しいオブジェクトを作るのが基本だよ。共有した値をその場で書き換えると、別の場所にも変更が広がることがある。不変にすると、元の値を保ったまま新しい値を扱いやすいね。
ひよこ ひよこ
住所も、必ず値オブジェクトにする?
ペンギン先生 ペンギン先生
目的によるよ。配送先の表記をまとめるなら値として扱えるけれど、地図システムで住所の関係や履歴を追うなら別の設計もある。意味のある型にすると検証をまとめやすいが、現実にその住所が存在するかまで自動で保証するわけではないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「値オブジェクト」って出てきたら「IDではなく中身の値で等しさを判断するオブジェクト」と思えばだいたいOK!
📖 おまけ:英語の意味
「Value Object」 = 値オブジェクト
💬 値の内容によって等しさを判断する設計。DDDでも使うが、ドメインモデル以外でも役立つ考え方だよ。

参考資料

← 用語集にもどる