# コマンドクエリ分離原則
CQS (Command Query Separation)
関数をコマンドとクエリに分ける
関数は副作用を持つものと持たないものに分けましょう。副作用とはその関数の外の状態を変化させることです。インスタンス変数の上書きや、ファイルI/Oなどがあります。
- コマンド: 副作用を持ち、値を返さない
- クエリ: 副作用を持たず、値を返す
コマンドは注意して扱う必要があります。副作用を持つということは、実行した順番によって結果が変わるからです。一方、クエリは状態を変えないので、いつ実行しても良く、順番を変えることもできます。コマンドとクエリを明確に分けることで、関数が使いやすくなります。
# 注意
配列の pop
や、Fluent setters
パターンのように、副作用を持ちながら値を返すケースがあります。これらは原則を満たしていませんが、副作用の範囲が限定的であることや、すでに多くの開発者の共通認識になっていることから、例外と言えます。基本的には原則を満たすようにしましょう。
なお、そもそも現代では、副作用を持つ関数自体を減らしたほうが良いとされています。これは 不変性 とも関連します。
← 4.9. 純粋関数 5.1. 単一責任原則 →