【ちオブジェクト】

値オブジェクト とは?

💡 名前よりも中身で語る、不変の価値の塊
📌 このページのポイント
エンティティ vs 値オブジェクト エンティティ IDで同一性を判断 User ID:1 name: 田中 User ID:2 name: 田中 同名でもIDが違えば 別人(≠) 値オブジェクト 値で同一性を判断 Money amount: 1000 Money amount: 1000 値が同じなら 同じもの(=) = =
エンティティはIDで、値オブジェクトは値の内容で同一性を判断する
ひよこ ひよこ

オブジェクトって普通のオブジェクトと何が違うの?

ペンギン先生 ペンギン先生

一番の違いは「何で同一性を判断するか」だよ。普通のオブジェクトエンティティ)はIDで区別するけど、値オブジェクトは値の内容で区別するんだ

ひよこ ひよこ

どういうこと?例えてほしいの!

ペンギン先生 ペンギン先生

たとえば「1000円」という金額を考えてみて。2枚の千円札は別々の紙幣だけど、金額としては同じだよね?金額クラスを値オブジェクトにすると、値が同じなら「同じもの」として扱えるんだよ

ひよこ ひよこ

なるほど!じゃあエンティティは?

ペンギン先生 ペンギン先生

エンティティはIDで区別するよ。たとえば「ユーザー」は同名でも別人なので、IDが違えば別エンティティ。値オブジェクトエンティティを使い分けるのがDDDの重要なポイントなんだ

ひよこ ひよこ

オブジェクトは変更できないって聞いたけど、なぜなの?

ペンギン先生 ペンギン先生

オブジェクトを変更できてしまうと、どこかで「1000円」を「2000円」に書き換えたとき、その金額を使っている別の場所にも影響が出てバグの原因になるんだよ。変更するときは新しいオブジェクトを作るのが正しいやり方だね

ひよこ ひよこ

住所も値オブジェクトになりそうだね!

ペンギン先生 ペンギン先生

まさに!住所は「都道府県+市区町村+番地」をまとめた値オブジェクトにすると、単なる文字列より意味が明確になるし、「有効な住所かどうか」のバリデーションも中に閉じ込められるんだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「値オブジェクト」って出てきたら「IDじゃなく中身で一致を判定する不変オブジェクト」と思えればだいたいOK!
📖 おまけ:英語の意味
「Value Object」 = 値オブジェクト
💬 DDDのエリック・エヴァンスが提唱した設計パターンで、「値(Value)」に着目してオブジェクトを分類するアイデアから来ているんだよ
← 用語集にもどる