掲題についての議論です。
僕の結論はこちら。"モジュール分割せずにモデルを分割するだけ"はCQRSと呼んでいけないのでは?まず原義からちゃんと把握しようというお話。
CQRSするにはC/Qは独立しないとダメなので、それをどう連携させるかすごい難しい課題。ESなしでは独立させて統合するのはほぼ難しいと思います https://t.co/Ta0CYujHJx
— かとじゅん (@j5ik2o) 2020年9月17日
Gregさんの原義によると
Origins
起源
Command and Query Responsibility Segregation uses the same definition of Commands and Queries that Meyer used and maintains the viewpoint that they should be pure. The fundamental difference is that in CQRS objects are split into two objects, one containing the Commands one containing the Queries.
コマンドとクエリの責任の分離は、Meyer氏が使用していたものと同じ定義を使用しており、純粋なものであるべきという視点を維持しています。根本的な違いは、CQRSではオブジェクトが2つのオブジェクトに分割され、1つはコマンドを含むオブジェクト、もう1つはクエリを含むオブジェクトに分割されます。
ここだけ読むと「そうかオブジェクトを分ければいいだけか」となりますが、
The Query Side
クエリ側
After CQRS has been applied there is a natural boundary. Separate paths have been made explicit. It makes a lot of sense now to not use the domain to project DTOs. Instead it is possible to introduce a new way of projecting DTOs
CQRSを適用した後には、自然な境界があります。別々のパスが明示されています。DTOを投影するためにドメインを使用しないことは、今では非常に理にかなっています。その代わりに、DTOを投影する新しい方法を導入することができます。
ドメインを利用するコマンド側とDTOを利用するクエリ側には境界があるとされている。原義のPDFでも大半の部分でこの隔離法を説いている。以下は抜粋。
In the “Stereotypical Architecture” the domain was handling both Commands and Queries, this caused many issues within the domain itself.
ステレオタイプのアーキテクチャでは、ドメインはコマンドとクエリの両方を処理していたため、ドメイン自体に多くの問題が発生しました。
Once the read layer has been separated the domain will only focus on the processing of Commands. These issues also suddenly go away. Domain objects suddenly no longer have a need to expose internal state, repositories have very few if any query methods aside from GetById, and a more behavioral focus can be had on Aggregate boundaries.
読み取り層が分離されると、ドメインはCommandsの処理のみに集中するようになります。 これらの問題も突然なくなります。 ドメインオブジェクトは突然内部状態を公開する必要がなくなり、リポジトリにはGetById以外のクエリメソッドがある場合はほとんどありません。
まとめると、モジュールレベルでCとQが分かれているということです。簡単にCQRSとは何かを説明するなら以下となる。
CQRSはCモジュールとQモジュールを完全に分離というより隔離。お互いに実装レベルでも知識レベルでも依存してはいけない。その上で中継役としての第3のモジュールで統合する。これに該当しないものはCQRSにあらず。モデルだけ分けるがCQRSじゃない
— かとじゅん (@j5ik2o) 2020年9月17日
たぶん、C/Qをモジュールとして隔離しなくてもモデルだけ分ければいい派はいるでしょう。いてもいいですが、僕はそれを原義に照らしてCQRSと言ったらダメでしょう派です。GregさんがSegregationという強い言葉をわざわざ選んだ理由を考えるべき。
モデルを分ける・メソッドを分ける部分だけを初歩のCQRSと理解している派いそうですがSeparation(分離)じゃなくSegregation(隔離)ですよ。モデルを分ける程度ならこんな強い言葉使う必要ない。CQSでいい。原義の大部分でもこの隔離法を説いている。モジュール分割レベルで理解することが妥当だと思う
— かとじゅん (@j5ik2o) 2020年9月17日
原義をこのように理解しているが、このままで終わると原理主義と言われるので、次の記事で背理法的にモジュール分割せずにモデルだけ分ける立場でそれが、なぜ良い設計にならないか書いてみよう。