読者です 読者をやめる 読者になる 読者になる

DDDにおいて、なぜUser#saveがいけてないのか考えてみるテスト

数週間前にDDD勉強会(羊)に参加したのですが(なんとじゅんいち☆かとうさんがしゃべってくれました!)、なにも成果をまとめていなかったので、その後、思ったこと考えたことを、今までの読書範囲で自分なりにまとめたいと思います。

 

で、テーマは一点のみで、

掲題の通り、なんでUser#saveがいけてないのかです。

ドメインを永続化する場合には、Repository に対してドメインを格納するというアプローチを取り、

ドメインに自分自身を永続化する責務を割り当てないというのがDDDです。

勉強会では、「User#saveはユビキタス言語じゃないからだめ」ということでした。

ユビキタス言語として定義されていないものをドメインの責務に割り当てるのはおかしいというわけです。

 

でも、よくよく考えてみると、「ユーザを登録する」という文章は成立します。

ユーザを登録するという機能自体あるわけで、違和感はそんなになし、ユーザとその言葉を使用して会話をしていても不自然じゃないわけです。

オブジェクト指向的に考えても、ユーザドメインに対して、自分自身を永続化する責務を割り当てるのは、間違っているとは言えなさそうです。

でも逆に、モデル(ユーザとコミュニケーションをとるための)に「登録する」
という操作を記述するかというとやっぱりしないわけです。

相当な違和感があります。
ためしに、手元にあった「実践UML」をざーっとみてみましたが、register とか save なんていう
メソッドは見当たりませんでした。
当然な話です。ある概念をDBに永続化するということを記述する動機があるわけないですから。
# 逆に、AからBをcreate(またはmake)するというパターンは有ります。
# 何の情報を基にしてこれを作ればいいのかということと、ライフサイクル自体には興味はあるわけです。

考えてみれば、

ユーザとモデルを通じてコミュニケーションする際に、
「○○ドメインには、自分自身を永続化する責務を割り当てます」
なんてことを言ってしまったら馬鹿だと思われます。
なんか、ずれてます。

 

ドメインに責務を割り当てるということは、
ドメインの知識としてみんなと共有したいという意図があることを意味します。

そう考えた場合、User#save はちょっとずれてるわけですね。

 

みんなが知っても意味のないことはモデルには記述しないし、
ドメインにも責務として割り当てない。

みんなが知りたいことを書きましょうってことでしょうかね。

 

 一応、こちらで補足しました。