エンティティとは
「エンティティ」とはなにか、ということについて調べると、「連続性と同一性によって識別されるもの」という定義がされていることがあるのですが、個人的にどういう意味かよくわからなかったので、現時点での筆者の考えを記します。
区別する必要があるかを考える
ユーザー、在庫、住所など、システムがあつかうオブジェクトをエンティティにするか値オブジェクトにするかよくわからなくなったとき、個人的にはまずそのオブジェクトを複数集めたとき、それらはシステムとして区別する必要があるかないか、に着目します。
ユーザーをAさん、Bさんと複数用意すれば、この人たちはおそらく区別し、AさんとBさんが異なる人として扱う必要があるでしょう。
一方、住所(東京都新宿区~)とか、価格(〇〇円、××ドル)といったオブジェクトは、それらを区別する必要はないでしょう。
属性"じゃないもの"で区別されるもの
どうやら区別する必要がありそうだぞ、とおもわれるオブジェクトについては次に、あるオブジェクトについて、そのオブジェクトをそのオブジェクトたらしめるものが属性でないことを確認します。
どういうことかというと、たとえばユーザー(人間)には、名前とか所属とかいろいろな属性があるわけですが、あるユーザーをそのユーザーたらしめるものは(おそらく多くのシステムでは)それら属性ではないはずです。
名前で区別することもおおむね可能ですが、システム内でユーザーが名前を変更する場合もあるはずです。そのとき、名前変更前後で別のユーザーとして認識するわけにはいきません。
ということは、一見名前で区別できそうであっても、あるユーザーをそのユーザーたらしめるものは名前ではないはずです。
現実世界でも、人間は名前を変えることもあるでしょうし、顔を変えることもあります。それでも、名前も顔もかわったまるで別人を、ソーシャルセキュリティナンバーなどなくても同一人物と認識する必要が人間社会にはあるでしょうし、我々自身改名や整形をした友達を他人扱いしたりはしないはずですね。
それどころか、我々の意識の上では、昨日という日と今日という日は睡眠のタイミングによって分断されているにもかかわらず、昨日の私と今日の私が同一人物だと信じて疑いません。
これはたぶん記憶の連続性によって同一だと識別しているのだとおもいますから、このようによくわからないけどなんらかの連続性によって識別されるものが世の中にはあるのだとおもいます。
エンティティの定義ってむずかしい
エンティティを定義せよ、といわれると、「連続性と同一性によって識別されるもの」というむずかしい回答になってしまうので、「属性で識別されないもの」と考えると、ユーザーとか部門、商品など、属性が変わっても連続性が維持されるべきものには、システムはIDを割り振るなどして識別する仕組みをつくる必要があることがわかります。