かとじゅんの技術日誌

技術の話をするところ

CQRSはモデルだけでなくモジュールも分割する

掲題についての議論です。

僕の結論はこちら。"モジュール分割せずにモデルを分割するだけ"はCQRSと呼んでいけないのでは?まず原義からちゃんと把握しようというお話。

sipadan2003.blogspot.com

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とは何かを説明するなら以下となる。

たぶん、C/Qをモジュールとして隔離しなくてもモデルだけ分ければいい派はいるでしょう。いてもいいですが、僕はそれを原義に照らしてCQRSと言ったらダメでしょう派です。GregさんがSegregationという強い言葉をわざわざ選んだ理由を考えるべき。

原義をこのように理解しているが、このままで終わると原理主義と言われるので、次の記事で背理法的にモジュール分割せずにモデルだけ分ける立場でそれが、なぜ良い設計にならないか書いてみよう。