Возможно, это связано с разделением команд и запросов принципом ?
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изменить список, они должны возвращать тип единицы, таким образом предотвращая нас от создания ошибок, используя вторую форму , когда мы не должны. Таким образом, наличие побочных эффектов также становится неявным в сигнатуре метода.