Является ли хорошей идеей использовать коммутатор с провалом для обработки аргументов по умолчанию в 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)
в качестве шаблона аргумента по умолчанию для штапеля или это отличный прием, который я должен сохранить и использовать в своем коде?
Ответы
Ответ 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 являются общими источниками ошибок, поскольку трудно использовать их при использовании логики "проваливаться". Легко видеть, когда дело срабатывает, но часто бывает сложно определить, охвачен ли каждый случай в наборе результатов, особенно если это не ваш код.