質問: 設計の指針で迷いがあるので、教えてください。 下記の要件を含むTODO管理ツールを作っているとします。 1. ユーザは、作成したタスク(Taskと命名)に色(TaskColorと命名)を付けることができる。 2. TaskColorは、TaskColorマスタに登録されたものから選んで、Taskに設定する。 3. TaskColorマスタは、ユーザが自分で内容を変更できる。 TaskColorは、下記の情報を持ちます。 * 色コード:RGBとか * 意味:ユーザが任意で設定できる文字列、メモのようなもの 私の認識では、エンティティか値オブジェクトかの判断を下すには、もう少し要件が必要です。 (1)TaskColorマスタの「意味」や「色コード」を変えると、全ての作成済みTaskに付けられたTaskColorにも変更が反映される場合 各Taskに設定されたTaskColorの同一性を追跡できる必要があるため、エンティティではないかと考えています。 また、TaskColorには識別子(TaskColorId)を付け、TaskにはTaskColorIdだけを持たせることになりそうです。 (2)TaskColorマスタを変更しても、作成済みTaskに反映しなくて良い場合 単純にこれだけなら、Taskの永続化の際に、TaskColorの属性値も一緒に埋め込んでしまえるので、TaskColorは値オブジェクトで良さそうに思えます。 しかし、Taskに埋め込まれるまでは、TaskColorマスタ上でそれぞれのTaskColorの同一性が確保されているような気がして、少しもやもやしています。 とはいえ、ここで私が感じている同一性は、TaskColorの用途において同一性の確保が必要とされたものではなく、結果的に同一性があるっぽく見えているだけの幻、とも思えます。 他にもケースはあるとは思いますが、まず上記(1)と(2)について、それぞれどのように考えるのが、ドメインモデルとして正解なのでしょうか?
回答: Junya さんの回答に賛成です。 識別子を備え属性を持っている TaskColor はエンティティとしか言いようがないですね。その属性である「色」と「意味」は値です。TaskColor の属性値が Task にコピーされるからといって、TaskColorが値になるわけではありません。 商品の属性値である「価格」が注文書にコピーされたからといって、商品がエンティティでなくなるわけではないですよね。同じことと思います。