Entity
多くのオブジェクトは、本質的に、その属性によってではなく、連続性と同一性(identity)によって定義される
エリックエヴァンスのドメイン駆動設計 翔泳社 2011 より
ObjectとしてのEntity
DDDのEntity概念は非常に優れた抽象である。その要諦は「同一性」である。
「同一性」の認識が必要なモノがEntity(Object)である。
これにより、Objectが実体(モノ)から解放される。
「顧客を登録する」という機能を考えると、顧客は同一性の認識の必要があるためEntityであるし、「顧客を登録する」という実行自体も同一性の認識の必要(ログ保存など)があればEntity(Object)となる。
idが付与されただけのObject。とてもシンプル。※extends Objectは暗黙だから不要
class Entity extends Object {
public final int id;
public Entity(int id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
// omit
}
@Override
public int hashCode() {
// omit
}
}
連続性
連続性というのは、永続化の必要を指す。DBその他のストレージへの保管の要請である。
これも重要。オブジェクトを設計したのちに永続化(DB)するのである。永続化(DB)はオブジェクトに従うのである。
DDDは何が保存されるべきか、何を呼び出すべきかといったデータ指向設計とは相いれない。
同一性からみた集約
DDDの集約は、いわばEntityの主従(包含)関係の構築である。境界の設定といっても同義である。
自動車でいうと、自動車はEntityとなり、タイヤはある自動車の内側においてEntityである。別の自動車から見て、また、修理業者から見て自動車を通してのEntityである。
ここに、タイヤは自動車に集約される。(外から見て、タイヤ自体の識別は不要。)
ただし、販売される前のタイヤは単独のEntityである。ここに設計の妙があるし、ユビキタス言語の利用を促す動機がある。