あるソースコードを読んでいて、機能をcommand
とquery
というディレクトリに分けているのを見つけた
どういうわけ方なのかピンとこなかったので調べてみた
ちょっと調べただけで「あーそっちか」となったのだが、いわゆるコマンドクエリ分離原則(CQS)の話だった
query
と聞いてURLのQuery stringを勝手に想像し、command
と聞いてなぜかCLI(Command Line Interface)を想像してしまっていた、、
コマンドクエリ分離原則(CQS)
コマンドクエリ分離原則(Command-Query Separation:CQS)はBertrand Meyer氏が考案した副作用を最小限に抑える設計思想
以下の違いがある
- クエリ:システムの状態を変更しないで結果を返す(副作用がない)
- コマンド:システムの状態を変更し、値を返さない(副作用がある)
例えば、SQLはCQSに則っていて、SELECTの中でUPDATEも行うといったことはできないようになっている
この考え方を参考に、command
とquery
というディレクトリに分けたり、XxxxQueryや
YyyyCommand`のようにクラスも分けておくと検索だけなのか更新するのかがわかるので良さそう
コマンドクエリ責務分離(CQRS)
CQSは設計思想だが、アーキテクチャに落としこんだCQRS(Command Query Responsibility Segregation)というのもある
使ったことはないが、コマンドとクエリで扱うデータモデルをわけるなど、さらに厳密に分離させることができるアーキテクチャ
これはJJUG CCC 2017 FALLに参加した時の@bufferings さんのスライドがわかりやすかった