Какова наилучшая практика для завершения инструкции 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, если мы не хотим включать какие-либо сообщения об ошибках или какие-либо еще условия?
Заранее спасибо.
нет инструкции if...else
.
существует оператор if
который может быть дополнен операторами else
и elseif
.
Таким образом, наилучшей практикой в if
statement without else
является условие if
without else
condition:
if (condition) { //some code }
Честно говоря, нет best practice
. Лучшая практика – это только одна, которая следует за логикой программы.
Это все
Не пишите пустые else
. Это просто загромождает код, и совершенно очевидно, что вы имели в виду.
Во многих случаях вы можете использовать оператор switch :
switch ($_POST['direction') { case 'up': // code ... break; case 'down': // code ... break; default: // else throw new Exception('Invalid direction value'); }
Это не то, что может дать определенный ответ. Вот мое занятие, было бы интересно посмотреть, какие существуют другие мнения.
Сценарий 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
; в противном случае – switch
. В любом случае, я не буду писать ничего, else if
в этом сценарии.
Добавление else
в качестве пустого блока catch-errors
Это напрямую связано со сценарием № 2 выше. Если возможные состояния не являются конечными и известны во время компиляции, вы не можете сказать, что «в любом другом случае» означает, что произошла ошибка. Видя, как в сценарии №2, switch
будет более естественным, я чувствую, что использование else
этом случае имеет плохой запах кода.
Вместо этого используйте switch
с ветвью по default
. Он будет более четко понимать ваше намерение:
switch($direction) { case 'up': break; case 'down': break; default: // put error handling here if you want }
Это может быть немного более подробным, но читателю ясно, как ожидается, что код будет функционировать. На мой взгляд, пустой блок будет выглядеть неестественным и озадачивающим здесь.
Я думаю, что если нечего делать дальше, тогда нет необходимости в том, чтобы блок существовал в коде. Если блок else
включен, это означает, что он имеет цель быть там, поэтому код еще не завершен, если он пуст.
Иногда я делаю это так. Я не беспокоюсь, что "left"
интерпретируется как "down"
потому что я всегда проверяю свой ввод, в этом случае с preg_match('{^up|down$}', $direction)
. Несомненно, switch
более подходит … но мне не нравится подробный синтаксис.
if ($direction == "up") { // code goes here... } else //if ($direction == "down") { // code goes here... }
Я стараюсь больше не писать. Когда-либо. По моему опыту, использование 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
.
И как уже сказал Ваш здравый смысл, нет лучшей практики, но есть хорошие практики, и я думаю, что это одно.