Лучшая практика по окончанию 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, если мы не хотим включать какие-либо сообщения об ошибках или какие-либо еще условия?

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

нет инструкции 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 .

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