CQS原則とは
CQS(Command Query Separation:コマンド/クエリ分離)原則とは、
「メソッドはコマンドとクエリに分離して、両者が混在するようなメソッドは作らない」
というルール
コマンドとは何かしら「状態」の変化を伴うメソッドのことで、クエリとは今の「状態」を結果として返すメソッドのこと。
SQLで例えると、INSEETやUPDATEがレコードの状態を変化させるコマンドに相当するメソッドで、SELECTがレコードの状態を返してくれるクエリに相当するメソッドになる。
コマンドとクエリが分離されておらず、状態を変化させるうえに結果を返すようなメソッドが存在すると、意図しないところで状態が変化したり、どの時点で状態が変化したのか特定するのを難しくしたりする。
具体例
例えば何かしらのチェックを行う際、チェックに引っかかったものに対して特定の処理を行いたいとする。
このような場合、CQS原則に違反して、チェック(クエリ)と処理(コマンド)ひとつのメソッドで済ませてしまいたくなる。
時間帯に適切なあいさつをするプログラムをCQS原則に従って記述すると次のようになる。
import datetime
# あいさつを返すメソッド(コマンド)
def greeting(時刻):
if 朝
print('おはよう')
elif 昼
print('こんにちは')
elif 夜
print('こんばんわ')
# 時間を問い合わせるメソッド(クエリ)
def now_time():
return 現在の時刻
if __name__ == '__main__':
greeting(now_time())
# 実行結果(今が朝であれば)
# => おはよう
このように実装すると、greetingがコマンドで、now_timeがクエリになっていることがわかる。
CQS原則の性質
上の例のように簡単な処理の場合CQS原則に従うメリットは少ないが、後々処理が複雑になってきた際に、どこで状態が変化しているのか特定するのが容易になる。