Возможно, это связано с разделением команд и запросов принципом ?
CQS имеет тенденцию быть популярным на пересечении объектно-ориентированного и функционального стилей программирования, поскольку он создает очевидное различие между объектными методами, которые имеют или не имеют побочных эффектов (т. Е. Изменяют объект). Применение CQS к присвоению переменных идет дальше обычного, но применима та же идея.
Короткая иллюстрация того , почему ОКК полезно: Рассмотрим гипотетический гибридный язык F / OO с List
классом , который имеет методы Sort
, Append
, First
, и Length
. В императивном стиле объектно-ориентированного программирования можно написать такую функцию:
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
изменить список, они должны возвращать тип единицы, таким образом предотвращая нас от создания ошибок, используя вторую форму , когда мы не должны. Таким образом, наличие побочных эффектов также становится неявным в сигнатуре метода.