エンティティに至っては現実を超越した存在である話

#エンティティ

##一見スワンプマンより連続性の無いもの

前回の終わりに、[スワンプマン](https://ja.wikipedia.org/wiki/スワンプマン)は人としてアイデンティティの連続性があるか？という話をしました。
[スワンプマン](https://ja.wikipedia.org/wiki/スワンプマン)はその物理的存在以外が連続している存在です。知識とか意識とかは連続しているという事ですね。そして、このような存在はおそらく連続した人間と認識されないことのほうが多いでしょう。
ですが、物理的に連続しておらず知識とか意識とかも連続していないのに連続しているとみなされる存在があります。

それは組織です。

##組織はその構成員が入れ替わってもアイデンティティを保ち続ける

例えば、あなたが学校の部活に入っているとします。
部員は全員３年生で、卒業と同時に部活は廃部になる…はずでしたが、推薦入学をキメたあなたの知り合いが入学と同時に入部すると言い出しました。あなたはそれを部活の顧問と生徒会に伝え、無事存続への猶予を勝ち取りました。
さて、この部活は「アイデンティティが連続している」と言えるでしょうか？
部室は引き続き使えるでしょうし、資材も引き継げるでしょう。部費…は学校にもよるでしょうが審査の基準は引き継ぐでしょう。あるいはひょっとしたら部室を割り振りなおしたり、体制一新として資材を捨てることを選択するかもしれません。
ですが、誰もが部活は連続していると思うんじゃないでしょうか？成果を上げたりしたら「今の代の〇〇部は優秀だな」とか言われるんじゃないでしょうか？これってつまり以前から連続しているということです。
また、一度廃部になっても同じ部活が「復活」したらそれは上記と同じような意味合いで以前と同じ部活と思う人が多いんじゃないでしょうか？人は一度死んで別の肉体と精神をもって復活したら多分それは同じ人として扱われないでしょうに。
つまり組織はその構成員が入れ替わってもアイデンティティを保ち続けるということですし、究極的には全ての構成要素が入れ替わってもアイデンティティを保ち続けるという事です。

そして、奇しくもこの「組織」を英語ではEntityともいいます。

##Entityの例文集

Weblioから引用します

- a political [legal] entity　国家 [法人]. - 研究社 新英和中辞典
- a business entity　企業体 - Eゲイト英和辞典
- self-functioning entity (assemblage of people)　多くの人々の集まり - EDR日英対訳辞書
- a public entity of a national or regional government　国家および地方公共団体 - EDR日英対訳辞書
- the finance of a local public entity　地方公共団体の財政 - EDR日英対訳辞書
- to commit a government agency to a private entity　国営企業を民営化する - EDR日英対訳辞書
- exposition held by a local public entity　地方自治体が開催する博覧会 - EDR日英対訳辞書

つまり、現実的存在というよりは社会的存在であり、物体に依存した存在というよりは人々の合意に依存した存在としてEntityは存在するという事です。Organizational Entityという言葉があることからして、組織だったものがOrganization、それが社会的に存在すると合意されることで実体としてEntity、という区分けと考えてよいかと思います。構成員が一人とか時には誰もいないEntityなんてのもありえる、というわけですね。そしてまた、組織を構成するのは人だけではありません。その組織のリソースとか目的とかも組織を構成するものです。これらの集合（Aggregation）がEntityである、ということです。またEntityは合意によるものであり、わざわざOrganizational Entityという言い回しが存在するという事はOrganizationでないEntityも存在する、つまりEntityを構成するのはなんでもいいということです。

#このEntityこそがDDDのEntity

##ここからがこの連載で本当に言いたかったことです。

エリック・エヴァンスのドメイン駆動設計でエンティティの章冒頭でこう書かれています。
「多くのオブジェクトは、本質的に、その属性によってではなく、連続性と同一性（Identity）によって定義される。」
そして今述べているEntityは連続性と同一性（Identity）によってのみ存在しています。これこそまさにEntityではないでしょうか？
このEntityは合意により存在し、その属性どころかあり方にも-物理的に存在してるとか社会的に存在してるとか電子的に存在しているかにもとらわれません。また、途中で一見連続性がなくなっても、同じIdentityを持ち連続しているという合意さえあれば同じと扱われる存在です。

##このEntityも現実とは関係ない

社会的存在は現実的存在か？というのはとても哲学的ですね。でも私は哲学者ではないのでどうでもいいです。重要なのは「それは現実と関係なくても存在として正しいか？です。
私はこの連載の最初から「それが存在するのはそれについて合意したからであり現実は無関係である」と書いてきましたし、幾何学から始めて「それはなぜ正しいと言えるのか」の合意を繋げてきたつもりです。
Entityは合意により存在するので現実に無関係に存在するものとして正しいもの、大げさに言えば現実を超越したものです。

##単なるオブジェクトとの違いは？

前回述べたように単なるオブジェクトはアイデンティティを持ち、状態が変わりますが、連続性を失った時には同じものではなくなります。この連続性は多くの場合は物理的存在、例えば私はスワンプマンになるまで連続性を持ちますーや文脈ー例えば私が「この文章」と書いた場合、「この文章」は「この文章の中でのみ連続性を持つ」ということになりますーに依存した存在です。一方でEntityは合意により連続するので、物理的に入れ替わったり別コンテキストでも連続性を保ちます。
プログラム上のオブジェクトで、プログラム実行中だけアイデンティティを持ち連続性があればいいオブジェクトはEntityではないことになりますね。Entityではないオブジェクトは値オブジェクトならば値で判定したり状態を持つオブジェクトならそのIdentifierとなるメモリアドレスで判別したり、ソースコード内のローカルな識別子で十分なIdentityを持つことになります。

##データベースの話に出てくるエンティティとの違いは？

データベースはデータを永続化、つまり連続性を持たせるものです。よってデータそのものがエンティティである、ということですね。永続化されたデータにIDがあるとか、どういうロジックかはともかくその状態によらず一意であればアイデンティティもあり十分にEntityということができます。
一方、この話でのEntityはそのデータが指しているもの／代表しているものです。

#今日のマサカリ

##Entityのequalsはオーバーライドするべきかeqをオーバーライドするべきか

@yoskhdia氏の[DDDのアドベントカレンダー記事](https://yoskhdia.hatenablog.com/entry/2018/12/05/002626)と、@j5ik2o氏の[それに対する感想](https://qiita.com/j5ik2o/items/0865539e72b16d906516)が有りました。
equalsは同値か同一かという問題ですねわかります。そしてScalaではequalsは同値でありeqは同一なのでeqをオーバーライドすべきというのもわかります。で・す・が！eqの同一はメモリアドレスの話でありEntityの同一性ではありません。eqをオーバーライドするというのはメモリアドレスとEntityのIDを同一視するのと同じです。データとしてのオブジェクトのIdentityとEntityのIdentityをごっちゃにしがちで危険って本にも書いてあったじゃないですか！
equalsは論理的整合性と言いますが、問題は「何の」論理的整合性か、です。プログラムにはプログラムのシステムにはシステムの論理があります。例えばドメインモデルを対象として抽象化したフレームワークみたいなものならばそれはドメインとしての意味が剥奪されていますから値として扱うほうが正しいでしょうが。

##じゃあどうすればいいってのよ

言ってしまえばEntityの同一性をequalsにし、つまりID比較でオーバーライドし、別に同一性＆属性や関連のチェックをするメソッドをはやすのがドメインレベルでは論理的です。Entityの同一性が必要になるのは他のEntityと識別するときだからです。Entityの属性が必要になるのは同じEntityに対して違う状態かを判別するのときだからです。つまりまずは同じEntityであるかを識別しないと話にならないという事で、あるEntityがそのEntityの別の状態と判別するのはそのあとで十分です。
また、あるEntityを外部から見たときはそれが他のEntityと区別できるほうが重要でしょう。
例えばEntityの集合からあるEntityを識別するのは外部-全体の話ですが、あるEntityがどの時点でのそのEntityかを判別するのはそのEntity自身の問題じゃないですか。そのEntity自身の問題を全体の問題より優先するのはどうかと思います。

##次回予告

今までこの連載ではIdentityとは何か、つまり「同じ」とはなにがなぜ「同じ」なのかという話をしてきました。そして、幾何学から「同じである部分」を引き継いで今「Entityとはなにであるか」を不十分ながら説明できたかと思います。
これでもう十分道は切り開けたでしょう。明日からEntityとはなんであるか、どのようなものかに迷いませんね！
といっても説明だけでわかれってのも無理な話で、私はできる限り具体的な話をしたつもりですがさらに具体的な話、具体例を提示しようと思います。DDDのアドベントカレンダーと両方に投稿したら規約違反かな…？まぁそれは執筆までに考えるとして

###次回、最終回！　FEHで学ぶDDD-Entityと境界付けられたコンテキスト-！

この連載読んでる人少なそうですが乞うご期待！