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 val
maintien 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 val
ou 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.size
n'a pas besoin de savoir ni de se soucier s'il size
s'agit d'une fonction ou d'un val
. L'implémenteur de la Queue
classe 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.size
en appelant size
un sous List
- jacent , ce qui est potentiellement O(n)
, puis passer size
à un val
pour 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