おそらくこれは、コマンドとクエリの分離によるものです原則によるものですか?
CQSは、副作用のあるオブジェクトメソッドとないオブジェクトメソッド(つまり、オブジェクトを変更するメソッド)を明確に区別するため、OOと関数型プログラミングスタイルの共通部分で人気があります。変数の割り当てにCQSを適用すると、通常よりもさらに進んでいますが、同じ考え方が当てはまります。
短いCQSが有用である理由の説明図:を有する仮想的ハイブリッドF /オブジェクト指向言語を検討List
メソッドを有するクラスはSort
、Append
、First
、およびLength
。命令型OOスタイルでは、次のような関数を記述したい場合があります。
func foo(x):
var list = new List(4, -2, 3, 1)
list.Append(x)
list.Sort()
# list now holds a sorted, five-element list
var smallest = list.First()
return smallest + list.Length()
一方、より機能的なスタイルでは、次のように書く可能性が高くなります。
func bar(x):
var list = new List(4, -2, 3, 1)
var smallest = list.Append(x).Sort().First()
# list still holds an unsorted, four-element list
return smallest + list.Length()
これらは試みているようです同じことをしてが、明らかに2つのうちの一方が正しくなく、メソッドの動作について詳しく知らなければ、どちらかを判断することはできません。
ただし、CQSを使用するAppend
とSort
、リストを変更する場合はユニットタイプを返す必要があるため、必要のないときに2番目のフォームを使用してバグを作成することはできません。したがって、副作用の存在もメソッドシグネチャに暗黙的に含まれます。