Зачем использовать переключение устава вместо того, если еще отметки? - PullRequest
9 голосов
/ 02 февраля 2010

Переключатели кажутся настолько бесполезными, что их можно заменить на операторы if-else, которые могут сделать гораздо больше, чем просто совпадение с char / int / enum и т. Д. Я могу думать только об одном хорошем использовании переключателя, и это будетдля интерпретации аргументов командной строки.

Какое реалистичное использование для оператора switch?

Ответы [ 18 ]

2 голосов
/ 02 февраля 2010

Устройство Даффа . Его полезность в наше время спорна, а удивительность - нет.

2 голосов
/ 02 февраля 2010

Пара баллов:

  1. Некоторые языки позволяют вам включать другие типы значений, такие как строка (в данном случае Coldfusion)
  2. Оператор switch может быть намного проще для чтения кода, чем большой блок операторов if / elseif / else
  3. В операторах switch вы можете прервать выполнение в конце дела или позволить коду продолжить обработку дальнейших обращений в заявлении. Эта функциональность позволяет вам легко смоделировать некоторые правила, которые, если бы операторы / elseif / else не позволили бы вам сделать это так легко.
  4. Как уже упоминали другие, имейте в виду, что компиляторы и движки имеют оптимизаторы, а операторы switch оптимизируются по-разному.
2 голосов
/ 02 февраля 2010

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

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

2 голосов
/ 02 февраля 2010

хорошо, вы можете удалить разрывы из оператора switch. Таким образом, вы можете иметь это:

CASE_A:
...
BASE_B
...

так что вы можете сделать так, чтобы case_a объединял все остальные дела под ним до тех пор, пока он не достигнет перерыва. Не так приятно делать это с помощью ifs.

1 голос
/ 02 февраля 2010

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

0 голосов
/ 03 февраля 2010

Не задавайте этот вопрос программисту на python, поскольку в языке нет оператора switch, и вместо этого рекомендуется использовать словари.

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

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

0 голосов
/ 02 февраля 2010

В большинстве случаев я предпочитаю использовать карту для переключения.

if (actionMap.contains(choice)) {
  Action a = actionMap.get(choice);
  a.execute();
} else {
  //do something else
}

Но в тех случаях, когда выбор слишком сложен, чтобы превратить его в карту, или когда может быть предпринято несколько действий, переключение лучше.,Переключатель полезен в тех случаях, когда упрощенная версия вложена, если / else constrcts.

0 голосов
/ 02 февраля 2010

Это может быть проще для компилятора превратить оператор switch в таблицу диспетчеризации, чем для того, чтобы превратить эквивалентный if / else soup в таблицу диспетчеризации. Если (и только если) это правда, вы должны затем отправить O (1) соответствующему коду вместо O (log n) (или O (n), если суп if / else плохо написан).

В некоторых (хотя и не во всех) случаях также может быть проще проверить, что вы прошли необходимые тесты с использованием switch, чем в случае if / else.

...