LoginSignup
0
0

はじめに

DDDを学習する中で、Entitiyと値オブジェクトというワードが出てきます。
ユーザや事業所はEntitiyで、お金などは値オブジェクトと表現される例が書かれています。
なぜ?何が違うの?どうして分けるの?と疑問をもっており、わからないながらに回答をだしたので、メモ程度に記述します。

Entitiyと値オブジェクトの違い

①識別子の有無
②ライフサイクルの管理

エンティティ (Entity)

識別子を持つ: エンティティは一意に識別される識別子(ID)を持ちます。識別子によって同じエンティティを再認識することができます。例えば、ユーザーや注文、商品などがエンティティです。
ライフサイクルの管理: エンティティはライフサイクルを持ち、その状態が時間とともに変わります。エンティティの属性が変更されても、識別子が同じであれば同一のエンティティとして扱われます。

Entityの例
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);
  }
}

まとめ

エンティティは一意の識別子を持ち、状態が変化する可能性のあるオブジェクト。識別子が同じならば、同じエンティティとみなされます。
値オブジェクトは属性の集合体で、識別子を持たず、不変であることが多い。値が同じならオブジェクトも同じとみなされます。
(うーん、わかったようなわからないような💦💦💦)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0