エンティティの定義

手法によってエンティティの定義は違ってくるのだろうが、僕の利用している定義は以下のようなものだ。

・ID(識別子)を持つ
・IDが同じであれば同じものとして扱う 
・IDは不変である(IDは変わらない)

IDの不変性についてはよく議論されているが、エンティティであるためには上記の条件を満たすようにしている。システム内でIDの不変性が保障できないのであれば、保障できるような人工的なIDを用意することになる。
これによって、エンティティの取り扱いが非常に簡単になり、システムの複雑さを低減できる大きなメリットがある。もし、IDを不変でない場合、IDが変わったときの対応を利用する側まで考える必要があり、想像するだけでも大変になってしまう。


ちなみに、たまにマスタに登録していないIDを999として特別扱いするシナリオがあるが、この999で示されるデータはエンティティなのか?
上記の定義から言えば「同じIDであれば同じものである」を満たさないことになるのでエンティティではないことになる。ではどう考えるか、エンティティでないのであればValueオブジェクトとして取り扱うように考える。Valueオブジェクトは多くの場合特定のエンティティの内部データとして取り扱われる。したがって、999は参照元のデータの内部データとして取り扱えばよいことになる。(このようなケースには、ロールタイプを導入すると分かりやすい)