Ho preso la tua domanda sul perché non progettare la lingua per evitare in primo luogo la necessità di una convenzione? In altre parole, perché Scala non impone sempre l'uso delle parentesi, invece di consentire ai programmatori di ometterle a volte?
La risposta si trova nella trasparenza referenziale . In sostanza, se una funzione non ha effetti collaterali, una chiamata di funzione può essere sostituita con il suo risultato, senza modificare il comportamento del programma.
Ciò significa che una funzione senza parametri o effetti collaterali è semanticamente equivalente a val
mantenere il valore di ritorno di quella funzione. A causa di questa proprietà, man mano che una classe si evolve, il programmatore potrebbe passare avanti e indietro dall'uso di una val
o dall'uso di una funzione, come richiesto dalla convenienza o dall'efficienza.
Dal momento che puoi omettere le parentesi, ciò significa che il codice che chiama qualcosa del genere queue.size
non ha bisogno di sapere né preoccuparsi se size
è una funzione o un val
. L'implementatore della Queue
classe è quindi libero di cambiare tra i due senza dover modificare il codice chiamante (anche se credo che dovrà essere ricompilato). Stabilizza l'interfaccia pubblica della classe. Ad esempio, è possibile iniziare a queue.size
chiamando size
un sottostante List
, che è potenzialmente O(n)
, quindi passare size
a a val
per motivi di efficienza.
La convenzione suggerisce le parentesi quando ci sono effetti collaterali per chiarire che questo membro della classe è sicuramente una chiamata di funzione e quindi potenzialmente non referenzialmente trasparente. È importante che il codice chiamante sappia se vengono prodotti effetti collaterali, in modo che possano evitare di chiamarlo ripetutamente. Se non ti importa se è una funzione o meno, puoi anche trattarla come se non lo fosse.