Forse questo è dovuto al principio command-query separation?
CQS tende ad essere popolare all'intersezione di OO e degli stili di programmazione funzionale, in quanto crea un'evidente 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 si applica la stessa idea.
Una breve illustrazione del perché CQS è utile: si consideri una lingua ipotetica ibrido F/OO con una classe List
che ha metodi Sort
, Append
, First
e Length
. In stile OO imperativo, 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()
Mentre in stile più funzionale, si farebbe più probabile scrivere qualcosa di simile:
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 essere cercare fare la stessa cosa, ma ovviamente uno dei due è errato, e senza sapere di più sul comportamento dei metodi, non possiamo dire quale.
Utilizzando CQS, tuttavia, ci sarebbe insistere sul fatto che, se Append
e Sort
modificare l'elenco, devono restituire il tipo di unità, impedendo così a noi di creare bug utilizzando la seconda forma quando non dovrebbe. La presenza di effetti collaterali diventa quindi implicita anche nella firma del metodo.
David Pollack ha pubblicato alcune informazioni di prima mano, praticamente approvate dal commento che lo stesso Martin Odersky ha lasciato sulla sua risposta. Penso che si possa tranquillamente recepire la risposta di Pollack. –