Entity

Entityとは、Idによって同一性を保証するクラスのことです。

なぜEntityが必要なのか?

一般的なアプリケーションでは、データが変化するということが頻繁に起こります。 たとえば、Userクラスであれば、名前を変更できるという仕様があるかもしれません。

名前を変更したとしても、そのuserは同一のuserであるべきです。 SNSで名前を変更したら、過去の投稿が自分のものでなくなってしまったら、不便ですよね。

userの情報が変わっても、同じuserであるということを保証するため、idがあります。 idは、一度割り当てられたら変更されないため、同一性を保証することができます。

Entityの実装例

Dart言語だと、次のようなインターフェースをEntityとして定義できます。

interface Entity {
  String get id;
}

シンプルに、idを返す事ができれば、Entityとして機能します。

型をつけたい場合は、ジェネリクスを利用して、次のような実装が可能です。

interface Entity<T> {
  T get id;
}

Userであれば、以下のようにUserId型をUserのidとして定義することができます。

class User implements Entity<UserId> {
  final UserId id;

  User(this.id);
}

アンチパターン

Entityの生成は、ビジネスロジックでよく行われるため、idをDBの自動採番などに依存してしまうと、取り扱いが難しいです。 UUIDなどの衝突が起きにくい値をidとして定義することが推奨されます。