2010-05-18 6 views
5

Con los parámetros con nombre comoLos parámetros con nombre conducen a problemas de mantenimiento y legibilidad inferior?

def f(x : Int = 1, y : Int = 2) = x * y 

sus nombres de parámetros se convierten en parte de la interfaz

f(x=3) 

Ahora bien, si desea cambiar los nombres de los parámetros a nivel local, que se ven obligados a perserve el nombre público del parámetro :

def f(x : Int = 1, y : Int = 2) = { 
     val (a,b) = (x,y) 
     a * b 
    } 

Si esto es un problema real? ¿Hay una sintaxis para apoyar esto directamente? ¿A quiénes se dirigen otros idiomas?

Un pequeño ejemplo de los problemas que se pueden ejecutar en si cambia los nombres de parámetros, como se sugiere por Jon.

trait X{ def f(x : Int, y : Int) } 
class A extends X{ 
    override def f(y : Int, x : Int) = println("" + y + x) 
} 
val a = new A 
scala> a.f(x = 1, y = 2) 
21 
scala> (a : X).f(x = 1, y = 2) 
12 

Respuesta

13

Sí, el nombre del parámetro es efectivamente parte de la interfaz pública. Este es un "problema" para cualquier lenguaje que tenga argumentos nombrados, o incluso produce código que es consumido por idiomas que admiten argumentos con nombre. A veces esto no se entiende bien.

Por ejemplo, C# 3 no admite argumentos con nombre, pero VB sí. Entonces, si creas una biblioteca en C# 3, alguien construye contra ella en VB, entonces cambiar los nombres de los parámetros cuenta como un cambio de ruptura.

En última instancia, parte de esto será manejado por herramientas de refactorización, pero se reduce a la misma clase de precaución que con cualquier otro aspecto de una API pública ... debe ser muy cauteloso.

Debe también tenga mucho cuidado al anular un método con parámetros - use los mismos nombres de parámetros que el método original, o podría causar algunos problemas muy sutiles. (En particular, el cambio en torno a los nombres de parámetros sería muy mal ...)

+0

Buen punto, ni siquiera estaba pensando en términos de público frente a API no pública. – R0MANARMY

+0

He agregado un código de muestra para el problema de cambio de nombre que sugeriste. –

1

No sé acerca de la parte "legibilidad inferior" de su título. Las pocas veces que utilicé parámetros con nombre, fue para proporcionar valores predeterminados como increment:Int = 100000, maxCount:Int = 1000000. Creo que ayuda a la lectura cuando tienes que cambiar el valor donde llamas a la función.

+0

El punto es que no puede cambiar el nombre del parámetro en una interfaz pública. Esto conduce a una peor legibilidad en el método ya que termina con un nombre de parámetro engañoso o una definición de alias. –

+0

No puede cambiar el nombre del método, sin una refacturación completa de todos los códigos del cliente. –

+0

@Randall - Pero a menos que llame de manera recursiva, no se referirá al nombre del método en la implementación. Los nombres de los parámetros se usan en el método y tienen un mayor impacto en la legibilidad. –

Cuestiones relacionadas