Ich habe Ihre Frage dahingehend beantwortet, warum Sie die Sprache nicht so gestalten, dass überhaupt keine Konvention erforderlich ist. Mit anderen Worten, warum erzwingt Scala nicht immer die Verwendung von Klammern, anstatt Programmierern zu erlauben, sie manchmal wegzulassen?
Die Antwort liegt in der referenziellen Transparenz . Wenn eine Funktion keine Nebenwirkungen hat, kann ein Funktionsaufruf im Wesentlichen durch das Ergebnis ersetzt werden, ohne das Verhalten des Programms zu ändern.
Das heißt, eine Funktion ohne Parameter oder Nebenwirkungen entspricht semantisch dem val
Halten des Rückgabewerts dieser Funktion. Aufgrund dieser Eigenschaft kann der Programmierer im Verlauf der Entwicklung einer Klasse zwischen der Verwendung einer val
oder einer Funktion wechseln , je nach Zweckmäßigkeit oder Effizienz.
Da Sie die Klammern weglassen können, bedeutet dies, dass Code, der so etwas aufruft, queue.size
nicht wissen oder sich darum kümmern muss, ob size
es sich um eine Funktion oder eine handelt val
. Dem Implementierer der Queue
Klasse steht es daher frei, zwischen den beiden zu wechseln, ohne den aufrufenden Code ändern zu müssen (obwohl ich glaube, dass er neu kompiliert werden muss). Es stabilisiert die öffentliche Schnittstelle der Klasse. Zum Beispiel könnten Sie a beginnen, queue.size
indem Sie size
einen Basiswert aufrufen List
, der möglicherweise ist O(n)
, und dann aus Effizienzgründen size
zu a wechseln val
.
Die Konvention schlägt die Klammern vor, wenn Nebenwirkungen auftreten, um zu verdeutlichen, dass dieses Klassenmitglied definitiv ein Funktionsaufruf ist und daher möglicherweise nicht referenziell transparent ist. Für das Aufrufen von Code ist es wichtig zu wissen, ob Nebenwirkungen auftreten, damit sie nicht wiederholt aufgerufen werden. Wenn es Ihnen egal ist, ob es sich um eine Funktion handelt oder nicht, können Sie sie genauso gut behandeln, als ob dies nicht der Fall wäre.