Можливо, це пов'язано з принципом розділення командного запиту ?
CQS, як правило, популярний на перетині ОО та стилів функціонального програмування, оскільки створює очевидну різницю між об'єктними методами, які мають або не мають побічних ефектів (тобто які змінюють об'єкт). Застосування CQS до призначень змінних робить це далі, ніж зазвичай, але застосовується та сама ідея.
Коротка ілюстрація того , чому ОКК корисно: Розглянемо гіпотетичний гібридний мова F / OO з 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()
Здається, вони намагаються зробити те саме, але, очевидно, один із двох невірний, і, не знаючи більше про поведінку методів, ми не можемо сказати, який саме.
Однак, використовуючи CQS, ми наполягаємо на тому, що якщо Append
і Sort
змінити список, вони повинні повернути тип одиниці, тим самим заважаючи нам створювати помилки, використовуючи другу форму, коли ми не повинні. Отже, наявність побічних ефектів також стає неявною у підписі методу.