この記事は彼のブログ投稿への返信です。
彼とのtwitter上でのreplyの応酬スレッドが見返すと引くほど長くなっていたので僕の観点からの要約を纏める。予め断っておくとこれは本当に自転車置き場の議論以外の何物でもなく、技術的な学びはどこにもない不毛なやりとりであって、苦労して理解する価値がなかったなどの苦情は受け付けない。
kumagi: 値オブジェクトはIDによらない等価比較をするオブジェクトの事であって、ドメイン固有の値オブジェクトもそうでない値オブジェクトもある。
かとじゅん: それはおかしい。全ての値オブジェクトは何らかのドメインオブジェクトの一部であって、Integerすらも整数ドメインの問題を解決するために設計されたドメインオブジェクトと言える。Evansも肯定しているはずだ。
kumagi: なるほど、その整理の中で逆にドメインオブジェクトでないオブジェクトというのは世の中に存在しうるのか?
かとじゅん: 全てのオブジェクトはいずれかのドメインに属するのでドメインオブジェクトであり、ドメインオブジェクトでないオブジェクトは存在しない
僕はいずれかのドメインには所属しているのではと思ってます。
— かとじゅん (@j5ik2o) 2022年5月19日
kumagi: であればドメインオブジェクトなんて言葉を使わずに単純にオブジェクトと呼んだら良いのでは。
既に指摘されてますが、オブジェクトが常に「ドメインオブジェクト」と呼ばれる条件を満たすことになり、オブジェクト = ドメインオブジェクト になってしまうので。
— philomagi (@Philomagi) 2022年5月19日
ryoaita: DDDは自分の対象のドメイン知識を実装に活かしましょうという方法論なので、他人が他人のドメインの為に用意した型の事を「ドメイン固有の型」と呼ばなくない?
97 Thingsのドメイン固有の型やDDDのドメインオブジェクトは、自分が開発対象とするドメイン固有の知識を型やオブジェクトの実装に活かすための方法論なので、自分のドメインのスコープの外で別のドメインに属していても、それをドメイン固有の型とは呼べないのではないでしょうか?
— コダック (@ryoaita) 2022年5月19日
かとじゅん: 自ドメインなのか他ドメインなのかという話であってどちらもドメインオブジェクトとは言える。Evansもそう言ってるはず。だから全ての値オブジェクトはドメインオブジェクトと言える。
確かに固有型という言い方は誤解を招いたかもしれません。言いたいことはドメインオブジェクトの型であるという意図でした。他人のドメインはドメインの定義に含まれるのかが論点ですね。Evansは汎用的なドメインのライブラリを作っていたので肯定派だと思ってます。正確なところがわかればいいですが
— かとじゅん (@j5ik2o) 2022年5月19日
ryoaita: Evansの本にはそもそもドメインオブジェクトの定義がないからわからない
ドメインオブジェクトという用語でさえ明瞭な定義がされてない。
— コダック (@ryoaita) 2022年5月19日
なにがドメインオブジェクトか定まらないのだから、バリューオブジェクトがドメインオブジェクトなのかについて議論しても答え合わせができない。
— コダック (@ryoaita) 2022年5月19日
kumagi: かとじゅんさんのドメインオブジェクトの定義が「何らかの解決すべきドメイン(e.g.整数)を持つオブジェクト」かつ「そうでないオブジェクトは存在しない」なら「オブジェクト」から情報量が全く増えてないのでやっぱりそれらのドメインオブジェクトをひっくるめて「オブジェクト」と呼んだら良いのでは?
Domain Specific Language (DSL) の定義も大概曖昧だけど、General Purpose Language は DSL ではないという定義が主流だな。
— phenan (@phenan) 2022年5月20日
(もしそうならそれは単なるLanguageになってしまうので)
Domain Object もそう定義すれば良いんじゃないかと思うが、不都合があるんだろうか
かとじゅん: Evansは他人のドメインを肯定しているので「ドメインオブジェクト」という呼称を使うべきだ
雑感
いかがだっただろうか。
僕の考えとしては何らかのアプリ開発やDDDの文脈において「ドメイン」という言葉を断り無く使う場合は常に暗に自ドメインの事を指すと思っているし、他人には他人のドメインはもちろんあるが少なくとも自ドメインの目的と合致していない限りそれらを自プロジェクト内で「ドメインオブジェクト」と呼ぶのは混乱を招くと思う。自他を適切に区別して別の名称を与える事がまともな議論の第一歩である。
アプリケーションを作るための設計方法論について議論している筈なのに、議論の対象範囲として、そういった共通性の高い範囲についても含まれている等と言い出すのは不誠実なスタンスですよ。
— 太一 (@ryushi) 2022年5月19日
EvansのDDD本の中の記述にはこのように書かれている
つまり「ドメインの記述的な側面を表現」と「概念的な同一性を持たない(おそらくIDによって識別しないという)」の両方が満たされて初めて「値オブジェクト」という呼称をしていい、と言っている。DDD本であるから、この文におけるドメインとは何らかの対象領域を指しており、敢えて何も指さずに世の中の全てを対象としているならば「ドメインにおける」はまるごと意味を持たない事になる。もしくは「あるオブジェクトが、何らかの目的ドメインにおける記述的な側面を表現し」と補完したらこの文は常に真となり意味を持たなくなる。
ここからは僕の補完だが、ここを「自ドメインにおける」と解釈すれば「あるオブジェクト」は「自ドメインで定義する任意のオブジェクト」の事を意味するし「あなたがオブジェクトを定義するならば値オブジェクトなのかエンティティなのか比較不能なのかを意識しなさい」というアイデアとして意味が通る。しかし、かとじゅんさんとの解釈とは一致しなかったようだ。
この文章で、世の中すべてのオブジェクトを論じていないと解釈されたのですね。僕はそう解釈せず様々なドメインがあると考えました。14章のコンテキストマップもですが、15章にあるようなコアドメインと支援ドメインと汎用ドメインの中にもドメインオブジェクトがありえるという解釈ですね。
— かとじゅん (@j5ik2o) 2022年5月19日
彼の解釈では「様々なドメイン」に世の中すべてが入りうるので「Evansは世の中すべてのオブジェクトの事を視点次第でドメインオブジェクトと呼ぶ」と解釈したらしい。
僕の解釈ではドメイン駆動の文脈においてわざわざドメインという言葉を使う場合、それは基本的に自分のコアドメインの事を指していると考えるのが自然であって、自ドメインで無いもの全てを常にドメインと呼び続けたら混乱すると思っている。
しかし「全てのオブジェクトは常に解決する課題があるのだから常にドメインオブジェクトと呼ばないと違和感しかない」という思想に基づいて既存のオブジェクトの定義にまでオーバーライドした上で値オブジェクトの定義を上書きしたいという思想を持つなとまでは僕は言わない。ただ情報発信やコミュニケーションをする際には独自定義した言葉を使うと相互に混乱を招くので、今後はせめて自分かEvansの独自定義用語であることを都度明示するか、Wikipediaあたりの公開された場所に定義を提示しておくべきだと思うがどうだろうか。
値オブジェクトの定義
おそらく一般的な値オブジェクトと、Evans独自定義の値オブジェクトとの差分は
等価判定以外に責務を持ち役に立つ振る舞いを提供すると認識しています。Evans本の値オブジェクトの例だとItineraryですね。この種の値オブジェクトは自ドメインにある場合もあるし他のドメインにありうると思います。https://t.co/IMtWHIyiX0
— かとじゅん (@j5ik2o) 2022年5月19日
に集約されており
値オブジェクト: IDによらない等価判定をするオブジェクト
Evansの値オブジェクト: IDによらない等価判定をするし、更に責務を持ち役に立つ振る舞いをする(ただしIntegerもstd::set<int>も何らかの責務を持つのでこちらの条件は常に真)オブジェクト
のように整理するのが順当に見えるし後者の定義が何の役に立つのかわからない*1。
およそあらゆるオブジェクトは何らかの関心(ドメイン)に基づいて定義・実装されるはずなのはその通り。ただ、それを以て「ドメインオブジェクト」と呼ぶと、およそあらゆるオブジェクトは「ドメインオブジェクト」と同義になり、すると「ドメイン」という修飾子には何か意味あるんだっけ、と。
— philomagi (@Philomagi) 2022年5月19日
まとめ
僕は前回のブログで
値オブジェクトはIDによらない等価比較をするオブジェクトの事であって、ドメイン固有の値オブジェクトもそうでない値オブジェクトもある。
という情報発信をしたが、かとじゅんさんは
値オブジェクトはIDによらない等価比較をするドメインオブジェクトの事であって、自ドメイン固有の値オブジェクトもそうでない値オブジェクトもある。
であると訂正した。それは世の中の全ては何らかのドメインに属し、他者のドメインを肯定するのがEvansの思想であるからであるとの根拠であった。
僕の意見としては、ドメインオブジェクト=オブジェクト と常に見做せるようなガバガバの定義の「ドメインオブジェクト」ならばそんなprefixを付けずに単に「オブジェクト」と呼んだら良いし、世の中の全てに何らかのドメインがあることは自明であるからして文章中でわざわざ「ドメイン」という言葉を使うならば自ドメインに限定する意図であることが明らかなので、赤字部分は不要と思っている。もしくは、赤字部分を付けてもその定義では意味が特に変わらないので訂正する行為自体が無意味だと思っている。
どうしても「値オブジェクト」の定義に常にこれらの修飾を付けて既存のマーチン・ファウラーの定義と別物としたいというのであれば、そちらにこそ「Evansの値オブジェクト」などとprefixを付けて区別すべきではなかろうか。本当にEvansがそう思っているか僕には知る由はないが…。
『エリック・エヴァンスのドメイン駆動設計』に関連する日本語の書籍は多くなってきましたが、そのどれも値オブジェクトはドメインオブジェクトの一種として解説されていると思います。kumagiさんが考えられている値オブジェクトとは違うでしょう。
— かとじゅん (@j5ik2o) 2022年5月19日
Wikipediaの定義を正とするならば『エリック・エヴァンスの値オブジェクト』というふうに呼んだほうがいいかもしれませんね。
— かとじゅん (@j5ik2o) 2022年5月19日
トップ画像はFlickrでThomas HawkさんのEverything is OkをCC BY-NC 2.0に基づいて利用しています。
*1:Evansは本当にそんな事を言ったのだろうか?