Ответ 1
Я всегда использую первый метод. Легче читать и меньше углублений. Что касается скорости выполнения, это будет зависеть от реализации, но я ожидаю, что они оба будут идентичными.
Я работаю над проектом, который требует довольно сложной обработки JavaScript. Это включает много вложенных if
- else
в довольно нескольких местах. Я вообще позаботился о том, чтобы как можно больше оптимизировать код JavaScript, читая другие советы по переполнению Stack Overflow, но мне интересно, будут ли следующие две конструкции иметь какое-либо значение только с точки зрения скорости:
if(some_condition) {
// process
return ;
}
// Continue the else condition here
против
if(some_condition) {
// Process
}
else {
// The 'else' condition...
}
Я всегда использую первый метод. Легче читать и меньше углублений. Что касается скорости выполнения, это будет зависеть от реализации, но я ожидаю, что они оба будут идентичными.
"Профиль, не спекулируйте!"
вы должны стимулировать усилия по оптимизации с помощью измерений, что означает
На многих языках распространена практика инвертировать if
для уменьшения вложенности или использовать предпосылки.
И с меньшим количеством гнезд в вашем коде улучшает читаемость кода и удобство обслуживания.
Не будет никакой разницы в производительности. Я бы порекомендовал второй пример ремонтопригодности. В общем, хорошей практикой является наличие одной и единственной возможной точки выхода для рутины. Это помогает отлаживать и понимать.
Я использую первый подход при исключении неверных ситуаций.
Eg. используйте первый подход при выполнении некоторых проверок и возвращайтесь, если какая-либо проверка не выполняется. Нет никакого смысла идти дальше, если какое-либо из предварительных условий терпит неудачу. То же самое упоминается Мартин Фаулер в своей Refactoring книге. Он называет это "Замена условий предложениями Guard". И это действительно может сделать код понятным.
Вот пример 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
}
}
VS
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 calls.
В качестве побочного примечания я считаю, что это ненужная микро-оптимизация, и вам, вероятно, следует искать в других местах улучшения производительности, то есть профилировать script через инструменты разработчика 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 и еще одно и то же для вышеуказанного случая, но в целом if-else
и if()return;
очень разные. Вы можете использовать оператор возврата, когда хотите перейти от текущей области к родительской области, а в случае if-else
вы можете проверить дальнейшее if-else в той же области.