Vielleicht liegt das am Prinzip der Befehl-Abfrage-Trennung ?
CQS ist in der Regel an der Schnittstelle von OO- und funktionalen Programmierstilen beliebt, da es eine offensichtliche Unterscheidung zwischen Objektmethoden schafft, die Nebenwirkungen haben oder nicht (dh das Objekt verändern). Das Anwenden von CQS auf Variablenzuweisungen geht weiter als gewöhnlich, aber die gleiche Idee gilt.
Eine kurze Darstellung von warum CQS ist nützlich: eine hypothetische Hybrid - F / OO - Sprache mit einer Betrachten List
Klasse , die Methoden hat Sort
, Append
, First
, und Length
. Im imperativen OO-Stil möchte man möglicherweise eine Funktion wie die folgende schreiben:
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()
Während man in einem funktionaleren Stil eher so etwas schreiben würde:
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()
Diese scheinen es zu versuchen , dasselbe zu tun, aber offensichtlich ist eine der beiden falsch, und ohne mehr über das Verhalten der Methoden zu wissen, können wir nicht sagen, welche.
Bei Verwendung von CQS würden wir jedoch darauf bestehen, dass wenn Append
und Sort
die Liste ändern, müssen sie den Einheitentyp zurückgeben, damit wir verhindern , dass Fehler zu schaffen , indem die zweite Form zu verwenden , wenn wir nicht sollten. Das Vorhandensein von Nebenwirkungen wird daher auch in der Methodensignatur impliziert.