代码之家  ›  专栏  ›  技术社区  ›  Thomas Jung

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

  •  5
  • Thomas Jung  · 技术社区  · 14 年前

    具有命名参数,如

    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 回复  |  直到 14 年前
        1
  •  13
  •   Jon Skeet    14 年前

    是的,参数名实际上是公共接口的一部分。对于任何具有命名参数的语言来说,这是一个“问题”——或者确实生成了 消耗 支持命名参数的语言。有时候这还不太明白。

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

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

    你应该 用参数重写方法时要非常小心-使用与原始方法相同的参数名称,否则可能会导致一些非常微妙的问题。(尤其是,切换参数的名称是非常邪恶的…)

        2
  •  1
  •   huynhjl bhericher    14 年前

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