Parameterlose & Leere-Paren-Methoden in Scala

10

Ich lerne gerade Scala über Oderskys Programmier-Scala (2.). Ich bin bis zu Kapitel 10, wo er beginnt, parameterlose und leere Paren-Methoden einzuführen. Ich kann es einfach nicht verstehen.

Bisher verstehe ich nur, dass ich leere Parens verwenden sollte, wenn eine Methode Nebenwirkungen hat, und ansonsten parameterlose Methoden.

Ich kann nicht herausfinden, was der Vorteil dieser Konvention ist. Ich habe die Beiträge auf Stack Exchange gelesen, aber um ehrlich zu sein, war ich verloren, als die Beiträge anfingen, dieses Thema ausführlich zu diskutieren.

Ich suche nach einer einfachen Erklärung der typischen Anwendungsfälle für diese Sprachfunktion und der Vorteile, die mir helfen, sie besser zu verstehen.


quelle

Antworten:

14

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 valHalten des Rückgabewerts dieser Funktion. Aufgrund dieser Eigenschaft kann der Programmierer im Verlauf der Entwicklung einer Klasse zwischen der Verwendung einer valoder 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.sizenicht wissen oder sich darum kümmern muss, ob sizees sich um eine Funktion oder eine handelt val. Dem Implementierer der QueueKlasse 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.sizeindem Sie sizeeinen Basiswert aufrufen List, der möglicherweise ist O(n), und dann aus Effizienzgründen sizezu 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.

Karl Bielefeldt
quelle
6

Das ist eine Konvention, die nicht Teil des Sprachdesigns ist. Es wird als Wegweiser verwendet, um den Leuten zu helfen, die den Code nach dem Schreiben lesen müssen, um ihn besser zu verstehen.

Aus Scalas Style Guide zum Methodenaufruf:

Scala erlaubt das Weglassen von Klammern bei Methoden von arity-0 (keine Argumente):

reply() 

// is the same as 

reply

Diese Syntax sollte jedoch nur verwendet werden, wenn die betreffende Methode keine Nebenwirkungen hat (rein funktional). Mit anderen Worten, es wäre akzeptabel, beim Aufrufen Klammern wegzulassen, beim Aufrufen queue.sizejedoch nicht println().

Die religiöse Einhaltung dieser Konvention verbessert die Lesbarkeit des Codes erheblich und erleichtert das Verständnis der grundlegendsten Funktionsweise einer bestimmten Methode auf einen Blick. Widerstehen Sie dem Drang, Klammern wegzulassen, nur um zwei Zeichen zu speichern!

In .NET werden Konventionen verwendet , wenn die Ausführung des Codes eine Weile dauern kann (z. B. länger als 50 ms ), und Eigenschaften (im Wesentlichen Methoden mit leeren Paren), wenn dies nicht der Fall ist (dh es handelt sich um eine einfache Suche).

Robert Harvey
quelle