Tomé su pregunta como ¿por qué no diseñar el lenguaje para evitar la necesidad de una convención en primer lugar? En otras palabras, ¿por qué Scala no solo fuerza el uso de paréntesis todo el tiempo, en lugar de permitir que los programadores los omitan a veces?
La respuesta se encuentra en la transparencia referencial . Esencialmente, si una función no tiene efectos secundarios, una llamada a función puede ser reemplazada por su resultado, sin cambiar el comportamiento del programa.
Eso significa que una función sin parámetros o efectos secundarios es semánticamente equivalente a val
mantener el valor de retorno de esa función. Debido a esta propiedad, a medida que evoluciona una clase, el programador puede alternar entre usar val
o usar una función, según lo dicte la conveniencia o la eficiencia.
Como puede omitir los paréntesis, eso significa que el código que llama a algo como queue.size
no necesita saber ni importar si size
es una función o un val
. El implementador de la Queue
clase es, por lo tanto, libre de cambiar entre los dos sin tener que cambiar ninguno de los códigos de llamada (aunque creo que será necesario volver a compilar). Estabiliza la interfaz pública de la clase. Por ejemplo, puede comenzar queue.size
llamando size
a un subyacente List
, que es potencialmente O(n)
, y luego cambiar size
a un val
por razones de eficiencia.
La convención sugiere los paréntesis cuando hay efectos secundarios para dejar en claro que este miembro de la clase es definitivamente una llamada a la función y, por lo tanto, potencialmente no es referencialmente transparente. Es importante que el código de llamada sepa si se producen efectos secundarios, para que puedan evitar llamarlo repetidamente. Si no le importa si es una función o no, puede tratarla como si no lo fuera.