Использование return вместо else в JavaScript
-
10-07-2019 - |
Вопрос
Я работаю над проектом, который требует довольно сложной обработки JavaScript.Это включает в себя множество вложенных if
-else
это во многих местах.Обычно я старался максимально оптимизировать код JavaScript, читая другие советы по переполнению стека, но мне интересно, будут ли следующие две конструкции иметь какое-либо значение только с точки зрения скорости:
if(some_condition) {
// process
return ;
}
// Continue the else condition here
против
if(some_condition) {
// Process
}
else {
// The 'else' condition...
}
Решение
Я всегда использую первый метод.Читается легче, отступов меньше.Что касается скорости выполнения, это будет зависеть от реализации, но я ожидаю, что они оба будут идентичны.
Другие советы
Во многих языках общепринятой практикой является инвертировать if
операторы для уменьшения вложенности или используйте предпосылки.
А меньшее количество вложений в коде повышает читаемость и удобство обслуживания кода.
«Профиль, не спекулируй!»
- вы ставите телегу впереди лошади (ремонтопригодность человека превосходит скорость машины)
вам следует активизировать усилия по оптимизации, измерения, что значит
- вы должны рассчитать время казни самостоятельно;очевидно, что в разных браузерах и версиях он будет отличаться
- вам следует оптимизировать только скорость горячие точки вашего заявления (см. пункт 1)
Никакой разницы в производительности не будет. Я бы порекомендовал второй пример из соображений удобства обслуживания.В общем, хорошей практикой является наличие одной и только одной возможной точки выхода для процедуры.Это помогает отладке и пониманию.
Я буду использовать первый подход при исключении недопустимых ситуаций.
Например.используйте первый подход при выполнении некоторых проверок и возвращайтесь, если какая-либо проверка не удалась.Нет смысла идти дальше, если какое-либо из предварительных условий не выполнено.То же самое упоминает Мартин Фаулер в своей книге. Рефакторинг книга.Он называет это «заменой условий оговорками охраны».И это действительно может сделать код более простым для понимания.
Вот пример Java.
public void debitAccount(Account account, BigDecimal amount) {
if(account.user == getCurrentUser()) {
if(account.balance > amount) {
account.balance = account.balance - amount
} else {
//return or throw exception
}
} else {
//return or throw exception
}
}
ПРОТИВ
public void debitAccount(Account account, BigDecimal amount) {
if(account.user != getCurrentUser()) return //or error
if(account.balance < amount) return //or error
account.balance = account.balance - amount
}
Может быть, немного, но я не думаю, что это будет измеримо, если остальная часть функции не будет включать в себя «тяжелые» (и в противном случае избыточные, поскольку я предполагаю, что возврат даст тот же результат) вызовы js.
В качестве примечания: я думаю, что это ненужная микрооптимизация, и вам, вероятно, следует искать где-то еще для улучшения производительности, т.е. профилировать скрипт с помощью инструментов разработчика Chrome или Firebug для Firefox (или подобных инструментов) и искать медленно/долго выполняющиеся вызовы/функции. .
Хотя это зависит от реализации JavaScript в работающем браузере, между ними не должно быть заметной разницы (с точки зрения скорости).
Вторая форма предпочтительнее, поскольку нарушение потока не является хорошей привычкой программирования.Также подумайте о том, что в ассемблере инструкция перехода (микрооперация) всегда оценивается независимо от оценки.
Проверьте это сами.Если этот JavaScript запускается в браузере, он почти наверняка будет зависеть от механизма анализа JavaScript браузера.
Насколько я понимаю, это не будет иметь значения, потому что вы выполняете разветвление с условием if.Таким образом, если some_condition истинно, часть else не будет затронута, даже без возврата.
Предположим, return
занимает 1 мс по сравнению с вложенным if
занимает 0,1 мс (или наоборот).
Трудно представить, чтобы кто-то из них был настолько медленным.
Теперь вы делаете это более 100 раз в секунду?
Если так, может быть тебя должно это волновать.
Когда есть только один if..else
производительность почти такая же и это не имеет значения.Используйте то, что лучше всего читается в вашем случае.Но переходя к вложенным операторам, используя return
это самый производительный по сравнению с if...else
и case switch
Исходя из моего опыта, это зависит от условия, которое вы проверяете.
if .. return
это нормально и легко читается, если вы проверите какое-то логическое условие (возможно, настройку), которое вообще сделает ненужным выполнение всего следующего кода.if .. else
гораздо легче читать, если вы ожидаете, что какое-то значение будет одним из двух (или более) возможных значений, и вы хотите выполнить другой код для обоих случаев.Это означает, что два возможных значения представляют собой условия одинакового интерпретируемого значения и поэтому должны быть записаны на одном логическом уровне.
По моему мнению, return и else аналогичны приведенному выше случаю, но в целом if-else
и if()return;
очень разные.Вы можете использовать оператор return, если хотите перейти из текущей области в родительскую, а в случае if-else
вы можете проверить дальнейшее if-else в той же области.