Лучшая практика по окончанию оператора if ... else без условия else - PullRequest
9 голосов
/ 15 марта 2011

Как лучше всего завершать оператор if ... else без условия else? Рассмотрим следующий код:

$direction = $_POST['direction']; //Up or down

if ($direction == "up") {
  code goes here...
}

elseif ($direction == "down") {
  code goes here...
}

else {
  //do nothing?
}

Как видите, есть только 2 условия; либо вверх, либо вниз, и оператор else на самом деле не имеет цели, если вы не хотите, чтобы он отображал сообщение об ошибке.

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

else {
      //error messages goes here...
}

или просто предположите, что если оно не «вверх», то все остальное должно быть «вниз», так как есть только 2 условия. Если пользователь вводит «влево» или «вправо», он все равно будет рассматриваться как «вниз». Я думаю, что это несколько неуместно.

if ($direction == 'up') {
  code goes here...
}

else {
  code goes here...
}

Я знаю, что PHP по-прежнему будет работать, если мы установим его без каких-либо других условий. Но что, если есть другое условие? В подобных случаях, какова лучшая практика, если мы хотим поддерживать строгое выражение if ... else, если мы не хотим включать какие-либо сообщения об ошибках или есть какие-либо другие условия?

Заранее спасибо.

Ответы [ 6 ]

20 голосов
/ 15 марта 2011

нет оператора if...else.
есть оператор if, который может быть расширен с помощью операторов else и elseif.

Итак, лучшая практика для оператора if без условия else - это оператор if без условия else:

if (condition) {
  //some code
}

Честно говоря, best practice нет.Лучшая практика - это та, которая следует логике программы.
Вот и все

7 голосов
/ 15 марта 2011

Не пишите пустыми else с. Это просто загромождает код, и совершенно очевидно, что вы имели в виду.

Во многих случаях вы действительно можете использовать оператор switch :

switch ($_POST['direction') {
case 'up':
     // code ...
     break;
case 'down':
     // code ...
     break;
default: // else
     throw new Exception('Invalid direction value');
}
1 голос
/ 15 марта 2011

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

Сценарий 1: Тестирование логического условия

Это простейший случай:

if (condition) {}
else {}

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

Сценарий 2: Тестирование для подмножества бесконечных состояний

Здесь мы заинтересованы в тестировании условий Aи B (и так далее), и мы можем или не можем быть заинтересованы в том, что произойдет, если ни один из них не выполняется:

if (conditionA) {}
else if (conditionB) {}
else {} // this might be missing

Важным моментом здесь является то, что не существует конечного числа взаимноисключительные состояния, например: conditionA может быть $num % 2 == 0 и conditionB может быть $num % 3 == 0.

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

Сценарий 3: Тестирование для подмножества конечных состояний

Это золотая середина между первыми двумя случаями: число состояний конечно, но больше двух.Тестирование на значения типа enum-типа является архетипическим примером:

if ($var == CONSTANT_FOO) {}
else if ($var == CONSTANT_BAR) {} // either this,
else {} // or this might be missing

В таких случаях использование switch, вероятно, лучше, потому что оно сразу сообщает читателю, что число состояний конечно идает сильный намек на то, где можно найти список всех возможных состояний (в этом примере константы, начинающиеся с CONSTANT_).Моими личными критериями является количество состояний, по которым я проверяю: если это только одно (нет else if), я буду использовать if;в противном случае switch.В любом случае я не буду писать else if в этом сценарии.

Добавление else в качестве пустого блока перехвата ошибок

Это напрямую связанок сценарию № 2 выше.Если возможные состояния не являются конечными и известны во время компиляции, вы не можете сказать, что «в любом другом случае» означает, что произошла ошибка.Поскольку в сценарии № 2 switch выглядит более естественным, я чувствую, что использование else таким образом имеет неприятный запах кода.

Вместо этого используйте switch с веткой default.Он будет гораздо яснее сообщать о ваших намерениях:

switch($direction) {
    case 'up': break;
    case 'down': break;
    default: // put error handling here if you want
}

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

0 голосов
/ 22 июля 2016

Я стараюсь не писать else. Когда-либо. По моему опыту, использование else приводит к менее читаемой логике, особенно если вложены / elses.

Для присвоения переменной либо true, либо false (или любому другому простому значению того или другого), я всегда использую:

$varx = false;
if ($my_codition_here === true) {
   $varx = true; 
}

Когда у меня есть большая часть логики, которую вы могли бы считать «принадлежащей» в if / else, я стараюсь структурировать свой код так, чтобы при выполнении условия функция завершалась, обычно возвращая:

if ($my_codition_here === true) {
    // A reasonable amount of logic goes here
    return $the_result_up_untill_here;
}

// All logic that would have been "else" goes here.
return $the_result_up_untill_here;

Как уже упоминалось, Фихаг; используйте выражение switch, если считаете elseif.

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

0 голосов
/ 15 марта 2011

Я иногда так делаю. Я не беспокоюсь, что "left" интерпретируется как "down", потому что я всегда проверяю свой ввод, в данном случае с preg_match('{^up|down$}', $direction). Несомненно, switch более уместно ... но мне не нравится подробный синтаксис.

if ($direction == "up")
    {
    // code goes here...
    }
else //if ($direction == "down")
    {
    // code goes here...
    }
0 голосов
/ 15 марта 2011

Я думаю, что если ничего не делать с else, то нет необходимости в существовании блока else в коде.Если блок else включен, это означает, что у него есть цель быть там, поэтому код еще не завершен, если он пустой.

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