Использование «по умолчанию» в выражении switch - хорошая привычка? - PullRequest
10 голосов
/ 06 марта 2011

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

Мои вопросы:

  • Неверно ли использовать регистр по умолчанию?
  • Как это работает внутри?

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

Ответы [ 7 ]

17 голосов
/ 06 марта 2011

Я бы посчитал плохой привычкой не использовать его.

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

Edit:

Это Паскаль, просто чтобы доказать, что ваш учитель не прав

 case place of
   1: writeln('Champion');
   2: writeln('First runner-up');
   3: writeln('Second runner-up'); 
   else writeln('Work hard next time!'); 
 end;
5 голосов
/ 06 марта 2011

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

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

2 голосов
/ 06 марта 2011

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

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

Итак, во что бы то ни стало, исключите исключения из ваших операторов по умолчанию для переключателя.Я уверен, что существует много возможных реализаций, но логически случай по умолчанию - это просто последнее предложение else в длинной цепочке if..then..if..then..else's.

1 голос
/ 06 марта 2011

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

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

1 голос
/ 06 марта 2011

Боюсь, ваш учитель не прав.Рекомендуется иметь дело по умолчанию.

0 голосов
/ 22 января 2019

Еще один взгляд на проблему:

Другие ответы в основном утверждают, в основном, «когда вы переключаете / регистр на X, а тип X позволяет X быть 1, 2, 3 и т. Д. (Целое число), или красным, синим, Fucsia и т. Д. (Перечисление) , обязательно обработайте и т. Д. !! ". Очевидно, не так ли?

С другой стороны, когда вы полагаете, что X как переменная из-за выполнения программы никогда не примет значения "и т. Д." ... подумайте иначе, потому что в конечном итоге это произойдет. Это общий совет.

Отклонение от Java / Pascal, чтобы представить это в перспективе: что, если тип X не допускает "etc"? (скажем, «очень строгое» перечисление или диапазон (для целых чисел)). То есть компилятор гарантирует, что возможные значения никогда не будут "и т.д.". И это отмечает необработанные случаи как ошибки. Было бы здорово. :-) Функциональные языки имеют сопоставление с образцом и алгебраические типы, что-то вроде этого, но у меня нет соответствующего опыта там. (

Возвращаясь к Java (и подобным языкам), поскольку вы можете реализовывать типы (классы), вы можете осуществлять строгую проверку, например, делая "case" как вызов метода, принимая объекты lambdas / functions / function ...

0 голосов
/ 06 марта 2011

Это действительно зависит.Если по умолчанию нет, он вам не нужен.

...