TL;DR
「データを返すコード(クエリ)は、データを更新するコード(コマンド)と混在させるべきではない」という設計思想。Command-query separation を略して CQS と呼ぶ。CQRS の元になった。
仕組み
質問をしたとき(クエリ)に、その答えを変える(コマンド)べきではない、という考え方である。
この考え方はデータベースにも当てはめられる。読み取りはデータベースの状態を変えずに、有用なデータを返す。読み取り以外の操作は、データベースの状態を変えるだけで、データを返さない。
関数型プログラミングに当てはめると、次のように表せる。
- データを返す関数は、副作用(状態の更新)を持つべきではない
- 副作用を持つ関数は、データを返すべきではない(ユニット型を返す)
例
F# で、データストアへの操作を型で表すと次のようになる。読み取り以外の操作は Unit を返す。
type CreateData = Data -> Unit
type ReadData = Query -> Data
type UpdateData = Data -> Unit
type DeleteData = Key -> Unit