Лучшая практика по окончанию 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
.
И как уже сказал Ваш здравый смысл, нет лучшей практики, но есть хорошие практики, и я думаю, что это одно.