Być może wynika to z zasady separacji poleceń i zapytań ?
CQS wydaje się być popularny na przecięciu OO i funkcjonalnych stylów programowania, ponieważ tworzy oczywiste rozróżnienie między metodami obiektowymi, które mają lub nie mają skutków ubocznych (tj. Zmieniają obiekt). Zastosowanie CQS do przypisań zmiennych prowadzi dalej niż zwykle, ale ta sama idea ma zastosowanie.
Krótki ilustracją dlaczego CQS jest przydatna: Rozważmy hipotetyczny język hybrydowy F / oo z List
klasy, która posiada metody Sort
, Append
, First
, i Length
. W imperatywnym stylu OO można by napisać taką funkcję:
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()
Podczas gdy w bardziej funkcjonalnym stylu bardziej prawdopodobne jest napisanie czegoś takiego:
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()
Wydaje się, że próbują zrobić to samo, ale oczywiście jedna z nich jest niepoprawna i nie wiedząc więcej o zachowaniu metod, nie możemy powiedzieć, która z nich.
Używając CQS, chcielibyśmy jednak nalegać, aby jeśli Append
i zmienili Sort
listę, musieli zwrócić typ jednostki, zapobiegając w ten sposób tworzeniu błędów przez użycie drugiej formy, gdy nie powinniśmy. W związku z tym obecność skutków ubocznych staje się również domniemana w sygnaturze metody.