この記事は ZOZO #4 Advent Calendar 2021 15日目の記事になります。
実践ドメイン駆動設計(以下、IDDD本)を読んでいて、一つ気がついたことを今回は共有します。
値型を作るのは簡単だとはいえ、あまりDDDの経験がない人は、そのインスタンスをエンティティとすべきなのか値とすべきなのかの判断に迷うことがある。実際のところ、経験豊富な人でさえも、ときどき迷うことがあるものだ。
ヴァーン・ヴァーノン. 実践ドメイン駆動設計 (Japanese Edition) (Kindle の位置No.5579-5581). Kindle 版.
この1節を読んで、なぜ迷う?と一瞬思ってしまいました。
それは自分のなかでのエンティティの解釈を誤解していたからです。
識別子があればエンティティということではない
もちろん、識別子があって、各オブジェクトが識別されることはエンティティの大きな特徴の一つです。
エンティティの役割ではあるのですが、、、これバリューオブジェクト側から見れば識別子があればバリューオブジェクトではないと言っているわけではないということです。
もうほんと言葉ゲームみたいなのすが、識別子があってもバリューオブジェクトになり得るということです。
ではどれがエンティティでどれがバリューオブジェクトなのか・・・と判断は難しい。。。ということで冒頭のIDDD本の言葉に戻るわけですね。
とりあえず、集約のルートであれば紛れもなくエンティティでしょう。
その他はケースバイケース。ただ、バリューオブジェクトで問題なければバリューオブジェクトにしてしまったほうが楽でしょう。
バリューオブジェクトで問題なければバリューオブジェクトにしてしまう
理由としては、管理がしやすいからですね。
不変ですし、バリューオブジェクトとしての仕事しかしませんし、バリューオブジェクトでいいかと判断できるならバリューオブジェクトにしてしまうというのがベストプラクティスでしょう。
例えば、こちらの集約で生成されるものではないものとか、コンテキスト内では集合で扱う必要がないもの(識別する必要がないもの)とか、集約のライフサイクル内で変更されるものではないものとか。。。そういったものはバリューオブジェクトにしてしまいましょう。
というコラムでした。
明日も自分ですね。「CQRS/コマンドのレスポンスについて考える」というタイトルでお届けします。