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

関連

出典