Во время недавнего обзора кода меня попросили поместить default
дела во все файлы, где бы ни использовался switch
блок, даже если нечего делать default
. Это означает, что я должен положить default
дело и ничего не писать в нем.
Это правильная вещь? Какой цели это будет служить?
Ответы:
Кажется, есть три случая, когда
default
утверждение не нужно:никаких других случаев не осталось, потому что есть ограниченный набор значений, которые вводят
switch case
. Но это может измениться со временем (преднамеренно или случайно), и было бы хорошо иметь,default case
если что-то изменится - вы можете войти или предупредить пользователя о неправильном значении.Вы знаете, как и где
switch case
будет использоваться и какие значения будут вводить его. Опять же, это может измениться, и может потребоваться дополнительная обработка.другие случаи не требуют специальной обработки. Если это так, я думаю, что вас попросят добавить
default case
, потому что это принятый стиль кодирования, и он делает ваш код более читабельным.Первые два случая основаны на предположениях. Поэтому (если вы работаете в небольшой команде, поскольку у вас есть регулярные обзоры кода), вы не можете позволить себе делать такие предположения. Вы не знаете, кто будет работать с вашим кодом или делать вызовы функций / вызывать методы в вашем коде. Точно так же вам может понадобиться работать с чужим кодом. Наличие одного и того же стиля кодирования облегчит работу с чьим-либо (включая ваш) кодом.
источник
throw new IllegalStateException("Unrecognised case "+myEnum)
что показывает вам, где и в чем ошибка.else
пункт после каждого,if/else if
даже если вы знаете, что этого не должно быть? Мне не кажется хорошей идеей ...Стандарты кодирования компании нередко требуют использования регистра по умолчанию для всех
switch
операторов. Одна из причин этого заключается в том, что читателям легко найти конецswitch
. Другая, возможно, лучшая причина в том, что она на секунду заставляет задуматься о том, что должен делать ваш код, когда условие не соответствует вашим ожиданиям. Независимо от причины требования, если это стандарт компании, вы должны следовать ему, если нет веской причины не выполнять.Если вы считаете, что вы
switch
включаете дела для каждого возможного условия, то хорошо бы добавитьassert
заявление в дело по умолчанию. Таким образом, когда кто-то изменяет код и непреднамеренно добавляет условие, которое выswitch
не покрываете, он попадает вassert
ловушку и понимает, что ему необходимо обратиться к этой части кода.Если вы
switch
рассматриваете только некоторые из возможных условий, но ничего не нужно делать для других, вы можете оставить случай по умолчанию пустым. Рекомендуется добавить комментарий в этом случае, чтобы указать, что случай по умолчанию намеренно пуст, поскольку выполняемые условия не требуют какой-либо работы.источник
assert
?Если вы «переключаетесь» на чистый тип перечисления, опасно иметь запасной вариант по умолчанию. Когда вы позже добавите значения к типу перечисления, компилятор выделит переключатели с новыми значениями, которые не рассматриваются. Если у вас есть предложение по умолчанию, компилятор будет молчать, и вы можете пропустить его.
источник
Во многих отношениях этот вопрос совпадает с часто задаваемым вопросом: нужен ли мне
else
пункт в концеif
/else if
лестницы, который охватывает все варианты .Синтаксически говоря, ответ - нет, нет. Но есть однако ...
Предложение
default
может быть там по крайней мере по двум причинам:otherwise
из случая. Нет никаких оснований не включать их в исходный код.Моя философия всегда довольно проста - оцените наихудший сценарий из двух вариантов и выберите самый безопасный. В случае пустого
else
илиdefault
предложения, худшие варианты:Overdramatic? Возможно ... но тогда мое программное обеспечение может убить людей, если оно пойдет не так. Я бы предпочел не рисковать.
Кроме того, руководящие принципы MISRA-C {см. Профиль для присоединения} рекомендуют
default
пункт для каждогоswitch
источник
else
послеif
. Но, как вы сказали, нет, это не так.Java не заставляет вас иметь оператор «по умолчанию», но это хорошая практика, чтобы иметь его все время, даже если код никогда не будет достигнут (прямо сейчас). Вот несколько причин:
Имея недостижимое предложение по умолчанию, вы показываете читателю своего кода, что вы рассмотрели значения, и знаете, что вы делаете. Вы также допускаете будущие изменения, скажем, например: добавлено новое значение перечисления, переключатель не должен молча игнорировать новое значение; вместо этого вы можете создать исключение или сделать что-то еще.
Чтобы поймать неожиданное значение (если вы не включаете перечисление), которое передается - например, оно может быть больше или меньше, чем вы ожидали.
Для обработки действий по умолчанию - где переключатели для особого поведения. Например, переменная может быть объявлена вне коммутатора, но не инициализирована, и каждый случай инициализирует ее чем-то другим. Значение по умолчанию в этом случае может инициализировать его значением по умолчанию, поэтому код сразу после переключателя не выдаст ошибку / не сгенерирует исключение.
Даже если вы решите не использовать ничего по умолчанию (без исключений, ведения журнала и т. Д.), Даже комментарий о том, что вы считаете, что факт по умолчанию никогда не произойдет, может помочь читабельности вашего кода; но это сводится к личным предпочтениям.
источник
Я также добавил бы, что это зависит от философии языка, который вы используете. Например, в Erlang, где распространен подход «дать сбой», вы бы не определяли случай по умолчанию, но позволяли своему
case
утверждению выдавать ошибку, если возникает ситуация, которая не была обработана.источник
У вас всегда должен быть дефолт, если вы постоянно и не охватывали все случаи. Это ничего не стоит, и это страховка от неспособности поддерживать ваше заявление о переходе в развивающейся программе.
Если вы действительно уверены, что вас не волнуют другие случаи, по умолчанию: break; // все равно, но значением по умолчанию должно быть что-то вроде default: throw new Error ("непредвиденное значение");
Аналогично, вы никогда не должны «пропустить» нетривиальную конструкцию case без добавления комментария к эффекту, который вы намереваетесь пропустить. Ява ошибалась на этапе проектирования.
источник
Рассмотреть возможность
а также
Я бы сказал, что это лучше, чем случай MALE, случай FEMALE и случай по умолчанию, который вызывает исключение.
Во время фазы тестирования компьютер проверит, является ли g ЖЕЛЕЗНОЙ. Во время производства проверка будет опущена. (Ага микрооптимизация!)
Что еще более важно, вы будете поддерживать свою цель 100% покрытия кода. Если бы вы написали случай по умолчанию, который выдает исключение, как бы вы его протестировали?
источник
Gender . FEMALE . equals ( FEMALE ) ;
оцениватьfalse
? Вы имели в виду,Gender.FEMALE.equals (g)
но так как вы можете зависеть от стабильности ссылок, вы можете просто написатьg == Gender.FEMALE
. 4. (Личное мнение) такой код намного сложнее для чтения и приведет к немного более запутанным ошибкам.