Подтвердить что ты не робот

Когда использовать инструкции if-else if-else over switch и наоборот

Почему вы хотели бы использовать блок switch над серией операторов if?

Операторы

switch, похоже, делают то же самое, но требуют больше времени для ввода.

4b9b3361

Ответ 1

Как и в большинстве случаев, вы должны выбрать, что использовать на основе контекста и концептуально правильный путь. Коммутатор действительно говорит "выберите один из них на основе этого значения переменных", но оператор if - это всего лишь последовательность логических проверок.

В качестве примера, если вы делали:

int value = // some value
if (value == 1) {
    doThis();
} else if (value == 2) {
    doThat();
} else {
    doTheOther();
}

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

Кроме того, если вы обнаружите, что пишете ключи и if-elses и используете язык OO, вам следует подумать о том, чтобы избавиться от них и использовать полиморфизм для достижения того же результата, если это возможно.

Наконец, в отношении переключения, занимающего больше времени, я не могу вспомнить, кто это сказал, но однажды я прочитал, что кто-то спросил: "Ваша скорость ввода действительно влияет на то, как быстро вы код?" (Перефразировать)

Ответ 2

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

В противном случае, придерживайтесь нескольких операторов if-else.

Ответ 3

относительно читаемости:

Я обычно предпочитаю, если /else конструирует над операторами switch, особенно на языках, которые разрешают случаи падения. То, что я нашел, часто, так как возраст проектов, и несколько разработчиков вовлечены, у вас возникнут проблемы со строительством оператора switch.

Если они (заявления) становятся чем-то большим, чем просто, многие программисты становятся ленивыми и вместо того, чтобы читать все выражение, чтобы понять это, они просто появятся в случае, чтобы охватить все случаи, которые они добавляют в оператор.

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

Теоретически, та же проблема может существовать с конструкциями if/else, но на практике это просто не происходит так часто. Может быть, (просто догадка) программисты вынуждены читать немного более тщательно, потому что вам нужно понять, как часто, более сложные условия проверяются внутри конструкции if/else? Если вы пишете что-то простое, что вы знаете, что другие, вероятно, никогда не коснутся, и вы можете построить его хорошо, тогда я предполагаю, что он подбрасывает. В этом случае все, что более читаемо и лучше для вас, вероятно, является правильным ответом, потому что вы, вероятно, будете поддерживать этот код.

относительно скорости:

Операторы Switch часто выполняют быстрее, чем if-else (но не всегда). Так как возможные значения оператора switch изложены заранее, компиляторы могут оптимизировать производительность, построив таблицы перехода. Каждое условие не нужно тестировать, как в конструкции if/else (ну, пока вы не найдете правильный вариант).

Однако это не всегда так. Если у вас есть простой переключатель, скажем, с возможными значениями от 1 до 10, это будет так. Чем больше значений, которые вы добавляете, тем больше таблиц переходов, и коммутатор становится менее эффективным (не более, чем if/else, но менее эффективен, чем сравнительно простой оператор switch). Кроме того, если значения сильно отличаются (т.е. вместо 1 до 10, у вас есть 10 возможных значений, например, 1, 1000, 10000, 100000 и т.д. До 100000000000), коммутатор менее эффективен, чем в более простом случае.

Надеюсь, что это поможет.

Ответ 4

Я лично предпочитаю видеть инструкции switch над слишком большим количеством вложенных if-elses, потому что их можно гораздо легче читать. Переключатели также лучше в условиях удобочитаемости для отображения состояния.

См. также комментарий в этом сообщении относительно pacman ifs.

Ответ 5

Тенденция избегать вещей, потому что это занимает больше времени, это плохая вещь, попытайтесь ее искоренить. Тем не менее, чрезмерно многословные вещи также трудно читать, поэтому очень мала и проста, но важна читаемость, а не возможность записи. Краткие однострочные линии часто могут быть более трудными для чтения, чем простые хорошо выложенные 3 или 4 строки.

Используйте ту конструкцию, которая лучше всего описывает логику операции.

Ответ 6

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

Другие ситуации (множественные переменные или сложные, если предложения вы должны Ifs, но не существует правила, где их использовать.

Ответ 7

Это сильно зависит от конкретного случая. Предпочтительно, я думаю, следует использовать switch над if-else, если есть много вложенных if-elses.

Вопрос в том, сколько много?

Вчера я задавал себе тот же вопрос:

public enum ProgramType {
    NEW, OLD
}

if (progType == OLD) {
    // ...
} else if (progType == NEW) {
    // ...
}

if (progType == OLD) {
    // ...
} else {
    // ...
}

switch (progType) {
case OLD:
    // ...
    break;
case NEW:
    // ...
    break;
default:
    break;
}

В этом случае первый if имеет ненужное второе испытание. Второй чувствует себя немного плохо, потому что он скрывает NEW.

В итоге я выбрал switch, потому что он просто читается лучше.

Ответ 8

Предположим, вы решили использовать переключатель, поскольку работаете только с одной переменной, которая может иметь разные значения. Если это приведет к небольшому оператору switch (2-3 случая), я бы сказал, что все в порядке. Если вам кажется, что вы получите больше, я бы рекомендовал вместо этого использовать полиморфизм. Шаблон AbstractFactory можно использовать здесь для создания объекта, который будет выполнять любое действие, которое вы пытались сделать в коммутаторах. Уродливый оператор switch будет абстрагирован, и вы получите более чистый код.

Ответ 9

Я часто думал, что использование elseif и удаление экземпляров case (где разрешен язык) являются запахами кода, если не пахнет.

Для себя я обычно обнаружил, что вложенные (если/then/else) s обычно отражают вещи лучше, чем elseifs, и что для взаимоисключающих случаев (часто, когда одна комбинация атрибутов имеет приоритет над другой), случай или что-то подобное яснее читать два года спустя.

Я думаю, что оператор select, используемый Rexx, является особенно хорошим примером того, как хорошо делать "Case" (без пропусков) (глупый пример):

Select
    When (Vehicle ¬= "Car") Then
        Name = "Red Bus"
    When (Colour == "Red") Then
        Name = "Ferrari"
    Otherwise
        Name = "Plain old other car"
    End

О, и если оптимизация не до него, получите новый компилятор или язык...

Ответ 10

Операторы Switch гораздо легче читать и поддерживать, руки вниз. И, как правило, быстрее и меньше подвержены ошибкам.