Лучшая практика по окончанию if... else statement без дополнительного условия

Какова наилучшая практика для завершения инструкции 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 without else condition. Но что, если есть условие elseif? В таких случаях, какова наилучшая практика, если мы хотим поддерживать строгий if... else, если мы не хотим включать какие-либо сообщения об ошибках или какие-либо условия?

Спасибо заранее.

Ответ 1

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

Таким образом, наилучшей практикой для оператора if без условия else является оператор if без условия else:

if (condition) {
  //some code
}

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

Ответ 2

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

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

switch ($_POST['direction') {
case 'up':
     // code ...
     break;
case 'down':
     // code ...
     break;
default: // else
     throw new Exception('Invalid direction value');
}

Ответ 3

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

Сценарий 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.

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

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

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

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

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

Добавление else в качестве пустого блока catch-errors

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

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

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

Чтобы назначить var либо 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.

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