Software Transactional Memo

STM関係のことをメモっていこうと思います。

Re: Re: Re: ドメイン固有型(値オブジェクト含む)を再考する

blog.j5ik2o.me

この記事は彼のブログ投稿への返信です。

彼とのtwitter上でのreplyの応酬スレッドが見返すと引くほど長くなっていたので僕の観点からの要約を纏める。予め断っておくとこれは本当に自転車置き場の議論以外の何物でもなく、技術的な学びはどこにもない不毛なやりとりであって、苦労して理解する価値がなかったなどの苦情は受け付けない。

kumagi: 値オブジェクトはIDによらない等価比較をするオブジェクトの事であって、ドメイン固有の値オブジェクトもそうでない値オブジェクトもある。

かとじゅん: それはおかしい。全ての値オブジェクトは何らかのドメインオブジェクトの一部であって、Integerすらも整数ドメインの問題を解決するために設計されたドメインオブジェクトと言える。Evansも肯定しているはずだ。

kumagi: なるほど、その整理の中で逆にドメインオブジェクトでないオブジェクトというのは世の中に存在しうるのか?

かとじゅん: 全てのオブジェクトはいずれかのドメインに属するのでドメインオブジェクトであり、ドメインオブジェクトでないオブジェクトは存在しない

kumagi: であればドメインオブジェクトなんて言葉を使わずに単純にオブジェクトと呼んだら良いのでは。

ryoaita: DDDは自分の対象のドメイン知識を実装に活かしましょうという方法論なので、他人が他人のドメインの為に用意した型の事を「ドメイン固有の型」と呼ばなくない?

かとじゅん: 自ドメインなのか他ドメインなのかという話であってどちらもドメインオブジェクトとは言える。Evansもそう言ってるはず。だから全ての値オブジェクトはドメインオブジェクトと言える。

ryoaita: Evansの本にはそもそもドメインオブジェクトの定義がないからわからない

kumagi: かとじゅんさんのドメインオブジェクトの定義が「何らかの解決すべきドメイン(e.g.整数)を持つオブジェクト」かつ「そうでないオブジェクトは存在しない」なら「オブジェクト」から情報量が全く増えてないのでやっぱりそれらのドメインオブジェクトをひっくるめて「オブジェクト」と呼んだら良いのでは?

かとじゅん: Evansは他人のドメインを肯定しているので「ドメインオブジェクト」という呼称を使うべきだ

雑感

いかがだっただろうか。

僕の考えとしては何らかのアプリ開発やDDDの文脈において「ドメイン」という言葉を断り無く使う場合は常に暗に自ドメインの事を指すと思っているし、他人には他人のドメインはもちろんあるが少なくとも自ドメインの目的と合致していない限りそれらを自プロジェクト内で「ドメインオブジェクト」と呼ぶのは混乱を招くと思う。自他を適切に区別して別の名称を与える事がまともな議論の第一歩である。

EvansのDDD本の中の記述にはこのように書かれている

つまり「ドメインの記述的な側面を表現」と「概念的な同一性を持たない(おそらくIDによって識別しないという)」の両方が満たされて初めて「値オブジェクト」という呼称をしていい、と言っている。DDD本であるから、この文におけるドメインとは何らかの対象領域を指しており、敢えて何も指さずに世の中の全てを対象としているならば「ドメインにおける」はまるごと意味を持たない事になる。もしくは「あるオブジェクトが、何らかの目的ドメインにおける記述的な側面を表現し」と補完したらこの文は常に真となり意味を持たなくなる。

ここからは僕の補完だが、ここを「ドメインにおける」と解釈すれば「あるオブジェクト」は「自ドメインで定義する任意のオブジェクト」の事を意味するし「あなたがオブジェクトを定義するならば値オブジェクトなのかエンティティなのか比較不能なのかを意識しなさい」というアイデアとして意味が通る。しかし、かとじゅんさんとの解釈とは一致しなかったようだ。

彼の解釈では「様々なドメイン」に世の中すべてが入りうるので「Evansは世の中すべてのオブジェクトの事を視点次第でドメインオブジェクトと呼ぶ」と解釈したらしい。

僕の解釈ではドメイン駆動の文脈においてわざわざドメインという言葉を使う場合、それは基本的に自分のコアドメインの事を指していると考えるのが自然であって、自ドメインで無いもの全てを常にドメインと呼び続けたら混乱すると思っている。
しかし「全てのオブジェクトは常に解決する課題があるのだから常にドメインオブジェクトと呼ばないと違和感しかない」という思想に基づいて既存のオブジェクトの定義にまでオーバーライドした上で値オブジェクトの定義を上書きしたいという思想を持つなとまでは僕は言わない。ただ情報発信やコミュニケーションをする際には独自定義した言葉を使うと相互に混乱を招くので、今後はせめて自分かEvansの独自定義用語であることを都度明示するか、Wikipediaあたりの公開された場所に定義を提示しておくべきだと思うがどうだろうか。

値オブジェクトの定義

おそらく一般的な値オブジェクトと、Evans独自定義の値オブジェクトとの差分は

に集約されており

値オブジェクト: IDによらない等価判定をするオブジェクト

Evansの値オブジェクト: IDによらない等価判定をするし、更に責務を持ち役に立つ振る舞いをする(ただしIntegerもstd::set<int>も何らかの責務を持つのでこちらの条件は常に真)オブジェクト

のように整理するのが順当に見えるし後者の定義が何の役に立つのかわからない*1

まとめ

僕は前回のブログ

値オブジェクトはIDによらない等価比較をするオブジェクトの事であって、ドメイン固有の値オブジェクトもそうでない値オブジェクトもある。

という情報発信をしたが、かとじゅんさんは

値オブジェクトはIDによらない等価比較をするドメインオブジェクトの事であって、ドメイン固有の値オブジェクトもそうでない値オブジェクトもある。

であると訂正した。それは世の中の全ては何らかのドメインに属し、他者のドメインを肯定するのがEvansの思想であるからであるとの根拠であった。
僕の意見としては、ドメインオブジェクト=オブジェクト と常に見做せるようなガバガバの定義の「ドメインオブジェクト」ならばそんなprefixを付けずに単に「オブジェクト」と呼んだら良いし、世の中の全てに何らかのドメインがあることは自明であるからして文章中でわざわざ「ドメイン」という言葉を使うならば自ドメインに限定する意図であることが明らかなので、赤字部分は不要と思っている。もしくは、赤字部分を付けてもその定義では意味が特に変わらないので訂正する行為自体が無意味だと思っている。
どうしても「値オブジェクト」の定義に常にこれらの修飾を付けて既存のマーチン・ファウラーの定義と別物としたいというのであれば、そちらにこそ「Evansの値オブジェクト」などとprefixを付けて区別すべきではなかろうか。本当にEvansがそう思っているか僕には知る由はないが…。

トップ画像はFlickrThomas HawkさんのEverything is OkCC BY-NC 2.0に基づいて利用しています。

*1:Evansは本当にそんな事を言ったのだろうか?