Это хорошая идея, чтобы использовать переключатель с Fallthrough для обработки аргументов по умолчанию в Javascript? - PullRequest
28 голосов
/ 05 января 2012

Недавно я узнал, что вы можете использовать аккуратный оператор switch с указателем, чтобы установить значения аргументов по умолчанию в Javascript:

function myFunc(arg1, arg2, arg3) {
    //replace unpassed arguments with their defaults:
    switch (arguments.length) {
        case 0 : arg1 = "default1";
        case 1 : arg2 = "default2";
        case 2 : arg3 = "default3";
    }
}

Мне очень понравилось, так как он не только очень короткий, но и работает на основе фактически переданных параметров, не полагаясь на наличие специального класса значений (нуль, ложь и т. Д.), Которые служат заполнителями, как в более традиционные версии:

function myFunc(arg1, arg2, arg3){
    //replace falsy arguments with their defaults:
    arg1 = arg1 || "default1";
    arg2 = arg2 || "default2";
    arg3 = arg3 || "default3";
}

Однако, после просмотра версии с использованием коммутатора, я должен был рассмотреть вопрос об использовании его «по умолчанию» в версии ||.

Падение коммутатора делает его ненамного длиннее, и его преимущество в том, что он гораздо более "надежен", поскольку ему не нужны типы параметров. В общем случае это звучит как хорошая идея - не беспокоиться о том, что произойдет со всеми ложными значениями ('', 0, null, false ...) всякий раз, когда мне нужно создать функцию с параметрами по умолчанию.

Я бы тогда зарезервировал arg = arg || x для реальных случаев, когда я хочу проверить на достоверность, вместо того, чтобы использовать его в качестве общего правила для параметров по умолчанию.

Однако, я нашел очень мало примеров этого паттерна, когда я сделал поиск кода для него, поэтому мне пришлось надеть скептическую шляпу. Почему я не нашел больше примеров этой идиомы?

  • Это сейчас очень хорошо известно?
  • Разве я не достаточно хорошо искал? Меня смутило большое количество ложных срабатываний?
  • Есть ли что-то, что делает его хуже альтернатив?

Некоторые причины, по которым я (и некоторые комментарии) мог придумать, чтобы избежать switch(arguments.length):

  • Использование именованных параметров, передаваемых через литерал объекта, очень гибко и расширяемо. Возможно, места, где больше аргументов могут быть необязательными, используют это вместо этого?

  • Возможно, большую часть времени мы делаем хотим проверить на правдивость? Использование категории значений в качестве держателей полей также позволяет параметрам по умолчанию отображаться в середине, а не только в конце: myFunc('arg1', null, 'arg3')

  • Возможно, большинство людей просто предпочитают очень короткие arg = arg || "default", и большую часть времени нам просто наплевать на ложные значения?

  • Возможно, доступ к arguements является злом / бесполезным?

  • Возможно, у этого типа коммутатора есть плохая часть, о которой я не думал?

Достаточно ли этих минусов, чтобы избежать использования switch(arguments.length) в качестве основного шаблона аргумента по умолчанию или это изящный прием, который я должен сохранить и использовать в своем коде?

Ответы [ 2 ]

6 голосов
/ 06 января 2012

Так как вопрос был обновлен, это действительно вопрос мнения. Есть много особенностей javascript, которые многие люди рекомендуют избегать, такие как switch и ternary. Вот почему не так много информации о некоторых из этих функций.

Причина, по которой это предложение, заключается в том, что многие люди не используют эти функции и создают проблемы в своем коде. Иногда ошибки трудно обнаружить, и другим может быть сложно понять, что делает ваш код (особенно те, кто не знаком с javascript или новыми программистами).

Так что, если вам нравится делать это таким образом, и вы не беспокоитесь о мнениях (или уровне навыков) тех, кто работает над вашим кодом. Во что бы то ни стало, ваш подход будет работать. Я сам иногда использовал оператор switch, и хотя я не думаю, что он действительно «хороший» или «плохой», трудно найти ситуацию, которая требует .

Вы спросили, как я могу это сделать без цепочки if-else:

function myFunc(args) {
    var allArgs = {
        arg1:"default1",
        arg2:"default2",
        arg3:"default3"
    };
    for (var key in args) {
        allArgs[key] = args[key];        
    }
}
myFunc({arg1:null, arg3:'test'})
6 голосов
/ 05 января 2012

Просто предположение, но Даг Крокфорд не рекомендует использовать операторы switch в «JavaScript: хорошие части».Его логика заключается в том, что операторы switch являются распространенным источником ошибок, потому что их трудно найти при использовании логики «провала».Легко увидеть, когда запускается случай, но зачастую трудно определить, был ли охвачен каждый случай в наборе результатов, особенно если это не ваш код.

...