Это не то, что может дать определенный ответ.Вот мое мнение, было бы интересно посмотреть, какие существуют другие мнения.
Сценарий 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
выглядел бы здесь неестественно и озадачивающе.