Peut-être cela est dû à la commande de requête de séparation de principe?
CQS a tendance à être populaire à l'intersection de l'OO et fonctionnelle styles de programmation, car elle crée une distinction évidente entre les méthodes de l'objet qui ne sont ou n'ont pas d'effets secondaires (c'est à dire, qui modifient l'objet). L'application de CQS à des assignations de variables est aller plus loin que d'habitude, mais la même idée s'applique.
Une brève illustration de pourquoi CQS est utile: Envisager une hypothétique hybride F/OO de la langue avec un List
de la classe qui possède des méthodes Sort
, Append
, First
, et Length
. En impératif OO style, on peut avoir envie d'écrire une fonction comme ceci:
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()
Alors que dans la plus fonctionnelle de style, on serait plus à même d'écrire quelque chose comme ceci:
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()
Ceux-ci semblent être d'essayer de faire la même chose, mais à l'évidence l'un des deux est incorrect, et sans en savoir plus sur le comportement des méthodes, on ne peut pas dire lequel.
À l'aide de CQS, cependant, nous voudrions insister que si Append
et Sort
modifier la liste, il doit retourner le type d'unité, ce qui nous empêche de créer des bugs en utilisant la deuxième forme lorsque nous ne devrions pas. La présence d'effets secondaires, par conséquent, devient également implicite dans la signature de la méthode.