属性ではなく、「同一性」で区別されるオブジェクトを、エンティティと呼ぶ。

例) ある人の趣味(プロパティ)が変わっても同一人物である

エンティティの特徴

可変である

  • ユーザーが名前を変えたいときの例で考えると…
    • 値オブジェクトは「代入」で値を変更する
    • エンティティは「ふるまい」で値を変更する
      • ただのセッターではなく、どういう決まりごとがあるかが語られる

同じ属性であっても区別される

  • 同姓同名の2人は、属性は同じでも異なる人物
    • システムでは同一性を表現するために、「Identity」が用いられる

同一性をもつ

  • ユーザ名を変更する前と変更した後で、同一のユーザーと判定される
    • 属性ではなく「Identity」でのみ判断される
class User
{
  private readonly UserId id; // 識別子
}

エンティティ or 値オブジェクトの判断基準

  • ライフサイクルを持つか?
    • 作成されてから削除されるまで、変化するものはエンティティ
    • それ以外はとりあえず値オブジェクトで作ると良い