はじめに
DDDを学習する中で、Entitiyと値オブジェクトというワードが出てきます。
ユーザや事業所はEntitiyで、お金などは値オブジェクトと表現される例が書かれています。
なぜ?何が違うの?どうして分けるの?と疑問をもっており、わからないながらに回答をだしたので、メモ程度に記述します。
Entitiyと値オブジェクトの違い
①識別子の有無
②ライフサイクルの管理
エンティティ (Entity)
識別子を持つ: エンティティは一意に識別される識別子(ID)を持ちます。識別子によって同じエンティティを再認識することができます。例えば、ユーザーや注文、商品などがエンティティです。
ライフサイクルの管理: エンティティはライフサイクルを持ち、その状態が時間とともに変わります。エンティティの属性が変更されても、識別子が同じであれば同一のエンティティとして扱われます。
class User {
constructor(private id: string, private name: string, private email: string) {}
changeName(newName: string) {
this.name = newName;
}
get userInfo() {
return {
id: this.id,
name: this.name,
email: this.email,
};
}
}
値オブジェクト (Value Object)
①識別子を持たない: 値オブジェクトは固有の識別子を持たず、その属性によってのみ識別されます。例えば、住所や金額、日時などが値オブジェクトです。同じ属性を持つ値オブジェクトは同一とみなされます。
②不変性: 通常、値オブジェクトは不変(immutable)であり、一度作成されたらその状態を変更しません。もし変更が必要な場合は、新しいインスタンスを作成します。
class Money {
constructor(private amount: number, private currency: string) {}
get value() {
return `${this.amount} ${this.currency}`;
}
// 通常は変更不可なので新しいインスタンスを作成する
add(other: Money): Money {
if (this.currency !== other.currency) {
throw new Error('Different currencies');
}
return new Money(this.amount + other.amount, this.currency);
}
}
まとめ
エンティティは一意の識別子を持ち、状態が変化する可能性のあるオブジェクト。識別子が同じならば、同じエンティティとみなされます。
値オブジェクトは属性の集合体で、識別子を持たず、不変であることが多い。値が同じならオブジェクトも同じとみなされます。
(うーん、わかったようなわからないような💦💦💦)