Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 命名参数会导致维护问题和较差的可读性吗?_Scala - Fatal编程技术网

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

Scala 命名参数会导致维护问题和较差的可读性吗?,scala,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所建议的,切换参数名称时可能遇到的问题的一个小例

使用命名参数,如

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

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

例如,C#3不支持命名参数,但VB支持。因此,如果您在C#3中创建一个库,有人在VB中针对它进行构建,那么更改参数名称将被视为破坏性更改

最终,重构工具将处理其中的一些问题,但归根结底,这与公共API的任何其他方面一样需要谨慎。。。你需要非常小心


在使用参数重写方法时也应该非常小心-使用与原始方法相同的参数名称,否则可能会导致一些非常微妙的问题。(特别是,切换参数名称将非常有害…

我不知道标题中的“可读性较差”部分。我使用命名参数的几次是为了提供默认值,比如
increment:Int=100000,maxCount:Int=1000000
。我认为当您必须更改调用函数的值时,它有助于可读性。

好的一点,我们甚至没有考虑公共API和非公共API。我为您建议的名称切换问题添加了一些示例代码。重点是您无法更改公共接口中的参数名称。这会导致方法的可读性变差,因为最终会产生误导性的参数名或别名定义。如果不完全重构所有客户端代码,也无法更改方法名。@Randall-但除非递归调用,否则在实现中不会引用方法名。方法中使用了参数名,对可读性有较大影响。