開発者は領域に入れません。　あるいは、消えたヴィクトリア朝ドメインの常識の謎（上）

【Dojo 夏休み企画】挫折しないドメイン駆動設計（DDD）
という発表が有ったそうです。
https://ibm-developer.connpass.com/event/221512/
https://qiita.com/e99h2121/items/63e902a0d1c74bd0a0fd
- - -

DDDを解説するだけでなく、ドメインモデルの作り方にも触れた素晴らしい入門資料です。

- - -

惜しむらくは

根本的に間違っています。

引用します。

- - -
![badddd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/959439f6-c718-53b5-f829-c4fe51b30462.png)

- - -
![badddd2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/fcd72fea-273e-d1c4-7ffd-6d857cd5b71b.png)

- - -
そもそもドメインとは何か？

- - -
良く有る誤解
![間違い１.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/9423605b-d1a4-1e20-d12f-91b9fa971904.png)
関心領域はプログラマの関心ではない。

- - -
ユーザの関心なら正しいか？
![間違い２.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/b7aed145-e186-054a-7c46-c45b9ceff99c.png)
ユーザが関心を向ける領域でもない。

- - -
正しい関心領域
![actionandinterest.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/b49997cc-cb8a-d4bd-e6d1-bce6e3d838b2.png)

- - -
俺の知ってる関心領域と違う！って？
こんな図は見たことも無いって？

- - -
これは常識。

- - -
なので一々言う必要はないはずでした。

- - -
ただしこれは「神学の常識」

- - -
天に 主 Dominus がいるとします。
![shu1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/735507cc-42c8-96bc-d53d-6b649b9b25f6.png)

- - -
主の祝福は主を中心に発せられます。
![shu2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/46940ecd-1664-4645-bc7f-8a116728ece9.png)

- - -
主は食事を楽しむことを好まれますので楽しい食事は主の祝福に含まれます。
![shu3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/58c208a8-d3e6-8533-4ba7-28dfbc07dcef.png)


- - -
主は暴食を好まれませんので暴食は主の祝福の中に含まれません。
![shu4.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/02b013a9-7ed9-84a9-f605-be96eab0245a.png)


- - -
この「主が好み祝福するものたち」が
「主の領域」です。
![shu5.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/8da3f07a-a984-2143-94f4-81cc50bafc5b.png)

- - -
Domainは「領域」と訳されますが、正確には「主（Dominus）が主権を及ばす範囲」という意味です。
論理的な「領域」は「主」を中心とした「円」もしくは「球」になります。

- - -
少なくとも19世紀ヴィクトリア朝までは神学校があり常識でした。

デカルトなら多分知ってたはず。

- - -
だから関心（some activity and interest）領域は「主（ユーザなど）の関心の及ぶ範囲」という意味になります。

- - -
余談ですがプログラマの「関心の分離」は「separation of concerns」なので書籍上では concern と使い分けられています。

- - -
皆さん「領域」とは何なのか分かって使ってますか？
業務を「領域」とか「Domain」と呼んで何かを成し遂げた気分になってませんか？

- - -
まあそれは置いておいて。

- - -
DDD の提唱者は Dominus なんて触れてないって？

- - -
Dominus はラテン語なので避けたのでしょう。
ですが英語でほぼ同義の言葉を使ってるじゃないですか。

- - -
Core です。

- - -
論理的な Domain は球体（Sphere）を形成し、その中心は核（Core）です。

- - -
核（Core）を「大事」とか「重要」と解釈してる人はいませんか？

- - -
それは順序が逆です。

- - -
Core = Dominus は周りを規定する。

- - -
周りを規定するから重要なのであって単に重要なのを Core と呼んでるわけではない。

- - -
まぁ Dominus は人であるのに対して Core は領域の中心部なのでちょっと違うと言えば違いますが中心にあって周りを規定してるという意味では同じ。

- - -
という訳で、Domain Driven というのは

- - -
中心 Dominus を把握し、関心を半径として Sphere を作り、関心の対象を領域に入れたり関心の薄い対象は入れるのを諦めたりすること。

- - -
そんなこと聞いたことないって？

- - -
Referenceに書いてありますよ。

- - -
(＊1)domain
A sphere of knowledge, influence, or activity.
The subject area to which the user applies a program is the domain of the software.

- - -
Sphere はもちろんこれのこと。
![actionandinterest.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/b0406a1f-c5d0-b550-d72f-803e31679dab.png)

- - -
Domain = Sphere には必ず中心と半径が有る事を誰も気にも留めていないだけ。
というか当たり前すぎて言い忘れてた気がする。

- - -
ところでこの「 Domain とは何か」について日本の書籍は何と言ってるでしょうか？

- - -
一般に評判のいい本の試し読みを見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/7a4be79b-89fb-3590-ecc6-103baad7e58a.png)
ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本

- - -
DDD1.2

ドメインは「領域」の意味を持った言葉です。ソフトウェア開発におけるドメインは、「プログラムを適用する対象となる領域」を指します。重要なのはドメインが何かではなく、ドメインに含まれるものが何かです。

- - -
ドメインが何かは重要ではなく、中心の話もしないし関心の話もしない。
けどドメインに含まれるものが何かは重要らしい。

- - -
これは

ある図形 X と点P があるとして、X が P を含むかを答えよ。ただし図形の形状と位置と大きさは不明であるとする。

と言ってるのと同じ。

- - -
これで含まれるものがわかるのかすげーな天才か

- - -
私は

中心 O(0,0,0) 任意の半径 L の球体 S と点 P(x,y,z) があるとして、S が p を含む条件を答えよ。

と具体的に言って貰わないと分からない。

- - -
更に言うと
「プログラムを適用する対象となる領域」
も意味不明だ。

- - -
日本語としてそのまま解釈するとこういう事？
![applyprogram.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/bc29b140-1fbe-22f6-040d-822b1d8fd7e3.png)


- - -
元になった英語は恐らくこれ。
The subject area to which the user applies a program is the domain of the software.

- - -

正しい図はこう
![softwaredomain.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/9df4e700-67ec-5edb-365c-ce56c3a2b183.png)


- - -

area は「区切られた範囲」で domain は「広げた範囲」だから the domain of the software を広げて area to which the user applies を広げるべき。

- - -
業務をドメインにするとコアだかコアでないか良く分からない個々の業務が散在する。
![gyomus.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/487eb16d-3760-8a46-430f-a0f5964e8e71.png)

- - -
コアドメインが何故か複数あることも稀に良く有る。
原子核が複数ある原子ってなんだよ。

- - -
業務全部にプログラムを適用しないと変な区切りの業務が出てくる。
![gyomusprograms.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/1fae8180-bd2b-88f3-c2af-f78c2b13a464.png)

- - -
まず小さくコアドメインだけ領域にしてそれを広げていくべき。
![softwaredomain.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/e18987cd-e9c9-1358-2278-42af25f678a9.png)

- - -

ただこれらはDDD論者の全員がずっと前から
「プログラムを適用する対象となる領域」
と何を言ってるのか分からない言い方をしていたので誰が悪いわけでもない。

- - -

誰が悪いわけでもないけど誰も
「具体的な」ドメインの話をしてない。
コアドメインの話をしていない。
だからドメインに関わる話はフワッとしてる。

- - -

フワッとしてて中心が無い。
ドメインじゃなくて
ドーナツだなこれは🍩HAHAHA!

- - -
その点、このIBMの資料は
具体的なドメインモデルを作ろうとするだけ
偉い。

- - -
具体的なドメインモデルを作ろうとしてるからこそ間違いが分かる。

- - -
実のところ、良いモデルとは問題を解決するモデルではない。
モデルはモデルを対象にして研究や議論をするためのもの。
だから良いモデルは問題を明確にするモデルだ。

- - -
卒論書くときに指導されなかった？
全ての研究で問題の解決とか無理。
明確なモデル・明確な論文を書けと。

- - -
問題が解決しなくても明確なら
修論とか後輩とかがモデルを洗練できるから。

- - -
それはさておき、実際にモデルを作るところも検討してみよう。

- - -
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/a9d21609-d3c2-d274-bb1a-7f5271ddcfeb.png)

- - -
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/ef37490f-8c8d-77a2-97f4-dae882d75c1e.png)

- - -

いやそれ間違ってるから。
というか「注意深く聞く」ってなんだよ。
具体的にどうするんだよ。

- - -
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151783/bf66540b-b9cf-d087-25d0-09dd2e9e6e40.png)

- - -

繰り返しになるが業務はドメインではない。
ドメインである根拠がない。
コアドメインかコアではないかの判断基準が無い。

- - -

何故なら明瞭であるものが何一つないから。

- - -

ドメインエキスパートはドメインに詳しい誰か
だが明瞭であるとは限らないし
全てを知っているわけではないし
過不足なく話してくれるわけでもない。
そんなに都合よくない。

- - -

何よりもドメインを「決定づける」 Dominus を知っているとは限らない。

- - -

不明瞭な業務を分析して
明瞭なドメインに入れなければならない。

- - -

DDD論者は
「ドメインに何が含まれるかが大事」
とも言いがちだが間違っている。
というか解るかそんなもん。
ドメインは中から広げるものであって外から見てわかるものではない。

- - -

ドメインを語るなら
「ドメインにそれを含むか」
「それを含むようにドメインを広げるか」
の話をしなければいけない。

- - -

実のところ「関心の範囲」も明瞭ではない。
関心は強かったり弱かったり近かったり遠かったりする。
なので「関心の対象をドメインに含めるべきか」は明瞭ではない。

- - -

明瞭なのは何か？

- - -

もちろん「主」のみが明瞭だ。

- - -

中心 O(0,0,0) 任意の半径 L の球体 S と点 P(x,y,z) があるとして、S が p を含む条件を答えよ。

- - -

関心の範囲はLによって変わるし、関心の強さはPとの距離によって変わる。

- - -

だが中心 O(0,0,0) は変わらない。

- - -

だから「ドメイン」を明瞭に語るには
「主」もしくは「Core」について語るしかない。

- - -

お前らはそろそろ業務をドメイン呼ばわりして騙るのをやめるべき

- - -
Dominus、Core
の具体的な話はどうすればいいか？

- - -
それはまた次回に。