UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【Architecture】コマンドとクエリの違い

あるソースコードを読んでいて、機能をcommandqueryというディレクトリに分けているのを見つけた

どういうわけ方なのかピンとこなかったので調べてみた

ちょっと調べただけで「あーそっちか」となったのだが、いわゆるコマンドクエリ分離原則(CQS)の話だった

queryと聞いてURLのQuery stringを勝手に想像し、commandと聞いてなぜかCLI(Command Line Interface)を想像してしまっていた、、

コマンドクエリ分離原則(CQS)

コマンドクエリ分離原則(Command-Query Separation:CQS)はBertrand Meyer氏が考案した副作用を最小限に抑える設計思想

以下の違いがある

  • クエリ:システムの状態を変更しないで結果を返す(副作用がない)
  • コマンド:システムの状態を変更し、値を返さない(副作用がある)

例えば、SQLはCQSに則っていて、SELECTの中でUPDATEも行うといったことはできないようになっている

この考え方を参考に、commandqueryというディレクトリに分けたり、XxxxQueryやYyyyCommand`のようにクラスも分けておくと検索だけなのか更新するのかがわかるので良さそう

コマンドクエリ責務分離(CQRS)

CQSは設計思想だが、アーキテクチャに落としこんだCQRS(Command Query Responsibility Segregation)というのもある

使ったことはないが、コマンドとクエリで扱うデータモデルをわけるなど、さらに厳密に分離させることができるアーキテクチャ

これはJJUG CCC 2017 FALLに参加した時の@bufferings さんのスライドがわかりやすかった

speakerdeck.com

他参考

https://postd.cc/using-cqrs-with-event-sourcing/