Méthodes sans paramètre et vide-paren dans Scala

10

J'apprends Scala en ce moment via la programmation Scala d'Odersky (2e). J'en suis au chapitre 10 où il commence à introduire des méthodes sans paramètres et paren vide. Je n'arrive pas à comprendre.

Jusqu'à présent, tout ce que je comprends, c'est que je devrais utiliser des parenthèses vides si une méthode a des effets secondaires et des méthodes sans paramètres sinon.

Je ne peux pas comprendre quel est l'avantage de cette convention. J'ai lu les articles sur Stack Exchange, mais pour être honnête, lorsque les articles commencent à discuter de ce sujet en profondeur, j'étais perdu.

Je cherche une explication simple de quels sont les cas d'utilisation typiques pour cette fonctionnalité de langue et quels sont les avantages pour m'aider à mieux la comprendre.


la source

Réponses:

14

J'ai pris votre question comme pourquoi ne pas concevoir la langue pour éviter la nécessité d'une convention en premier lieu? En d'autres termes, pourquoi Scala ne force-t-il pas tout le temps l'utilisation de parenthèses, au lieu de permettre aux programmeurs de les omettre parfois?

La réponse se trouve dans la transparence référentielle . Essentiellement, si une fonction n'a pas d'effets secondaires, un appel de fonction peut être remplacé par son résultat, sans changer le comportement du programme.

Cela signifie qu'une fonction sans paramètres ni effets secondaires est sémantiquement équivalente à un valmaintien de la valeur de retour de cette fonction. En raison de cette propriété, à mesure qu'une classe évolue, le programmeur peut basculer entre l'utilisation d'une valou l'utilisation d'une fonction, selon la commodité ou l'efficacité.

Puisque vous pouvez omettre les parenthèses, cela signifie que le code appelant quelque chose comme queue.sizen'a pas besoin de savoir ni de se soucier s'il sizes'agit d'une fonction ou d'un val. L'implémenteur de la Queueclasse est donc libre de basculer entre les deux sans avoir à changer le code appelant (bien que je pense qu'il faudra recompiler). Il stabilise l'interface publique de la classe. Par exemple, vous pouvez commencer un queue.sizeen appelant sizeun sous List- jacent , ce qui est potentiellement O(n), puis passer sizeà un valpour des raisons d'efficacité.

La convention suggère les parenthèses lorsqu'il y a des effets secondaires pour indiquer clairement que ce membre de classe est définitivement un appel de fonction, et donc potentiellement pas référentiellement transparent. Il est important que le code d'appel sache si des effets secondaires se produisent, afin qu'ils puissent éviter de l'appeler à plusieurs reprises. Si vous ne vous souciez pas de savoir si c'est une fonction ou non, vous pouvez aussi bien la traiter comme si elle ne l'était pas.

Karl Bielefeldt
la source
6

C'est une convention qui ne fait pas partie de la conception du langage. Il est utilisé comme panneau pour aider les gens qui doivent lire le code après l'avoir écrit à mieux le comprendre.

Extrait du Scala's Style Guide on Method Invocation:

Scala permet l'omission de parenthèses sur les méthodes d'arity-0 (aucun argument):

reply() 

// is the same as 

reply

Cependant, cette syntaxe ne doit être utilisée que lorsque la méthode en question n'a pas d'effets secondaires (purement fonctionnels). En d'autres termes, il serait acceptable d'omettre les parenthèses lors de l'appel queue.size, mais pas lors de l'appel println().

L'observation religieuse de cette convention améliorera considérablement la lisibilité du code et facilitera la compréhension en un coup d'œil du fonctionnement le plus élémentaire d'une méthode donnée. Résistez à l'envie d'omettre les parenthèses simplement pour enregistrer deux caractères!

Dans .NET, la convention consiste à utiliser des méthodes lorsque le code peut prendre un certain temps à s'exécuter (disons, plus de 50 ms), et des propriétés (essentiellement des méthodes de paren vide) quand ce n'est pas le cas (c'est-à-dire qu'il s'agit d'une simple recherche).

Robert Harvey
la source