命名参数会导致维护问题和可读性差吗?

时间:2010-05-18 12:29:52

标签: scala

使用像

这样的命名参数
def f(x : Int = 1, y : Int = 2) = x * y

您的参数名称将成为界面的一部分

f(x=3)

现在,如果要在本地更改参数名称,则必须坚持参数的公共名称:

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

如果这是一个真正的问题?是否有语法直接支持这个?谁能用其他语言处理这个?

如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

2 个答案:

答案 0 :(得分:13)

是的,参数名称实际上是公共接口的一部分。对于任何具有命名参数的语言来说,这是一个“问题” - 或者确实产生了支持命名参数的语言消费的代码。有时这还不太清楚。

例如,C#3不支持命名参数 - 但VB支持。因此,如果你在C#3中创建一个库,有人在VB中构建它,那么更改参数名称就算是一个重大变化。

最终,其中一些将由重构工具处理,但它可以归结为与公共API的任何其他方面一样的谨慎......你需要非常谨慎。

在使用参数覆盖方法时,要非常谨慎 - 使用与原始方法相同的参数名称,否则可能会导致一些非常微妙的问题。 (特别是,切换参数的名称将非常邪恶......)

答案 1 :(得分:1)

我不知道你的头衔的“低劣可读性”部分。我使用命名参数的几次,就是提供像increment:Int = 100000, maxCount:Int = 1000000这样的默认值。我认为当您调用函数时必须更改值时,它有助于提高可读性。