Лучшая практика: если логический контроль - PullRequest
2 голосов
/ 15 ноября 2010

Что касается стандартов кодирования, скорости и эффективности, что из нижеперечисленного является лучшей практикой программирования для этой ситуации?

function foo() {
  if(bar)   { return 0; }
  if(baz)   { return 0; }
  if(qux)   { return 0; }
}

или

function foo() {
  if(bar || baz || qux) { return 0; }
}

Я бы склонялся к первому, поскольку нужно оценивать только одно условие и, следовательно, было бы быстрее, но наличие нескольких return нехорошо ...?

// EDIT

Языки, к которым я бы применил это, в основном PHP и Javascript, возможно C ++ и Ruby.

Ответы [ 7 ]

5 голосов
/ 15 ноября 2010

Почти каждый отдельный язык программирования сегодня использует оценку короткого замыкания для ||, что означает, что два примера будут эквивалентны с точки зрения потока управления и, следовательно, производительности.

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

function getFriendList() 
{
  if (! has_internet_connection() ) return null;
  if (! is_logged_in() ) return null;

  return server.getFriendList();
}
3 голосов
/ 15 ноября 2010

Что касается вашего второго примера, || - это короткое замыкание на большинстве языков, поэтому будут оцениваться только необходимые условия.Например, если bar имеет значение true, ни baz, ни qux не будут оцениваться.

Зная это, я, вероятно, выберу второй пример.

2 голосов
/ 15 ноября 2010

Последнее, но как:

function foo()
{

   var result = 1;

   if(bar || baz || quz)
   {
       result = 0;
   }

   return result;
}

Выход из вашего кода в произвольном порядке с «возвратом» является плохой практикой и делает отладку кошмаром - особенно, если вы пытаетесь отладить код другого пользователя!Поток управления всегда должен выходить из нижней части функции!

1 голос
/ 15 ноября 2010

В C # вы можете использовать вторую версию, потому что она аналогична производительности, но выглядит лучше.Если bar равно true, другие флаги больше не проверяются.

0 голосов
/ 15 ноября 2010

Последний пример, на мой взгляд, лучше с точки зрения кодирования.В операторе ИЛИ, по крайней мере, одно условие истинно, утверждение истинно.Поэтому, если первое условие истинно, дальнейшие условия рассматриваться не будут.Там нет потери в скорости или эффективности.

0 голосов
/ 15 ноября 2010

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

0 голосов
/ 15 ноября 2010

Это полностью зависит от языка. Многие языки будут закорачивать оценки, так что, если bar истинно, два других не будут оцениваться, и любой полуприличный компилятор оптимизирует их до того же уровня в этом случае. Из четырех упомянутых вами языков (C ++, Ruby, PHP и Javascript) все они выполняют оценку короткого замыкания.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...