エンティティ
定義
エンティティ(Entity)とは、その属性ではなく**同一性(Identity)**によって識別されるドメインオブジェクト。同じ属性を持つ別々のオブジェクトがあったとしても、IDが異なれば別のエンティティである。
// 値オブジェクトとの違い
Money(1000, "JPY) == Money(1000, "JPY") // 属性が同じ = 同じもの(値オブジェクト)
User(id=1, name="田中") != User(id=2, name="田中") // IDが違う = 別人(エンティティ)
エンティティは時間とともに状態が変化する(ライフサイクルを持つ)。ユーザーはメールアドレスを変更しても、同じユーザーとして識別される。
なぜ重要か
エンティティと値オブジェクトを混同すると:
- 同一性の比較ロジックが散在し、バグの温床になる
- 変更履歴の追跡が困難になる
- 「どの状態が最新か」の管理が曖昧になる
エンティティを明示的に設計することで、識別・追跡・変更が一貫したロジックで管理できる。
適用場面
- ライフサイクルを持つ概念(注文、ユーザー、商品、タスク)
- 属性が変わっても「同じもの」と識別する必要があるもの
- 変更履歴・監査ログを保持する必要があるもの
値オブジェクトとの選択基準
| エンティティ | 値オブジェクト | |
|---|---|---|
| 識別 | IDで識別 | 属性の等価性で識別 |
| 変更 | 状態が変化する | 不変(変更=新しいインスタンス) |
| 共有 | 同じIDを複数箇所から参照 | コピーして渡す |
| 例 | ユーザー、注文、商品 | 金額、住所、日付範囲 |
関連概念
- → 値オブジェクト
- → 集約
- → ドメインオブジェクト設計
出典
実践ドメイン駆動設計(Vaughn Vernon)第5章