Подтвердить что ты не робот

Является ли хорошей идеей использовать коммутатор с провалом для обработки аргументов по умолчанию в Javascript?

Недавно я узнал, что вы можете использовать опрятный оператор 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";
}

Мое внутреннее, хотя, увидев версию с помощью коммутатора, я подумал, что я должен использовать ее по умолчанию в версии ||.

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

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Причина этого предложения заключается в том, что многие люди пропускают эти функции и создают проблемы в своем коде. Ошибки иногда трудно обнаружить, и другим может быть сложно понять, что делает ваш код (особенно те, которые незнакомы с 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'})

Ответ 2

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