Названные параметры приводят к проблемам с обслуживанием и плохой читаемости? - PullRequest
5 голосов
/ 18 мая 2010

С именованными параметрами, такими как

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
    }

Если это реальная проблема? Есть ли синтаксис, чтобы поддержать это напрямую? Кто другие языки обрабатывают это?

Небольшая иллюстрация проблем, с которыми вы можете столкнуться, если вы поменяете имена параметров, как предложил Джон.

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 ]

13 голосов
/ 18 мая 2010

Да, имя параметра фактически является частью открытого интерфейса. Это «проблема» для любого языка, который имеет именованные аргументы - или действительно создает код, который потребляется языками, поддерживающими именованные аргументы. Иногда это не совсем понятно.

Например, C # 3 не поддерживает именованные аргументы - но VB поддерживает. Так что если вы создаете библиотеку в C # 3, кто-то строит против нее в VB, то изменение имен параметров считается критическим изменением.

В конечном счете, часть этого будет решаться с помощью инструментов рефакторинга, но все сводится к той же осторожности, что и к любому другому аспекту публичного API ... вы должны быть очень осторожны.

Вы должны также быть очень осторожными при переопределении метода с параметрами - используйте те же имена параметров, что и у исходного метода, или вы можете вызвать некоторые очень тонкие проблемы. (В частности, переключение имен параметров было бы очень злым ...)

1 голос
/ 18 мая 2010

Я не знаю о части "плохой читабельности" вашего заголовка. Несколько раз я использовал именованные параметры, чтобы обеспечить значения по умолчанию, такие как increment:Int = 100000, maxCount:Int = 1000000. Я думаю, что это помогает читабельность, когда вы должны изменить значение, где вы вызываете функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...