Forse ciò è dovuto al principio di separazione tra query e comandi ?
CQS tende ad essere popolare all'intersezione di OO e stili di programmazione funzionale, poiché crea un'ovvia distinzione tra metodi oggetto che hanno o non hanno effetti collaterali (cioè che alterano l'oggetto). L'applicazione di CQS alle assegnazioni di variabili sta andando oltre il solito, ma vale la stessa idea.
Una breve illustrazione del perché CQS è utile: si consideri un linguaggio F / OO ipotetico ibrido con una List
classe che ha metodi Sort
, Append
, First
, e Length
. In imperativo stile OO, si potrebbe voler scrivere una funzione come questa:
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()
Considerando che in uno stile più funzionale, è più probabile scrivere qualcosa del genere:
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()
Questi sembrano tentare di fare la stessa cosa, ma ovviamente uno dei due non è corretto e, senza saperne di più sul comportamento dei metodi, non possiamo dire quale.
Usando CQS, tuttavia, insisteremmo sul fatto che se Append
e Sort
alteriamo l'elenco, devono restituire il tipo di unità, impedendoci così di creare bug usando la seconda forma quando non dovremmo. La presenza di effetti collaterali diventa quindi implicita anche nella firma del metodo.