2009-06-05 3 views
36

My OCD заставляет меня добавлять «break» при написании операторов case, даже если они не будут выполнены. Рассмотрим следующий пример кода:перерыв в случае с возвратом .. и по умолчанию

switch(option) { 
    case 1: 
     a = 1; 
     b = 7; 
     break; 
    case 2: 
     a = 2; 
     b = 4; 
     return (-1); 
     break; 
    default: 
     a = -1; 
     break; 
} 

Мои два вопроса:
Для «Случай 2:» Я на самом деле не нужен перерыв, но это хорошая идея, чтобы иметь его в любом случае? Для "default:". Это чисто OCD, или есть какая-то настоящая причина для разрыва здесь?

+27

Является ли это OCD, который заставляет вас поместить лишние значения возвратов круглых чисел? – 2009-06-05 17:20:36

+6

Всегда помещайте перерывы по умолчанию. Это может быть не последний случай. – Pod

+1

@Neil Butterworth Да, я не знаю, где я выбрал это. –

ответ

34

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

+5

Хороший компилятор не будет генерировать код после возврата или asm-goto. Так что никакого вреда не было ... – 0x6adb015

+0

Не навредил, но они не должны вписываться в стиль программирования программиста таким образом. – toto

+2

. Компилятор автоматически не переписывает источник автора, чтобы удалить перерыв или что-то еще. – dss539

0

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

8

Перерыв после вашего случая по умолчанию - это только вопрос личных предпочтений.

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

1

Ни один из них ничего не делает для вас, но и не наносит вреда.

Лично я обычно оставляю их, если у меня есть возврат, но я также стараюсь избегать наличия нескольких точек возврата в функции, если это возможно.

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

24

Я согласен с перерывом в последнем случае по умолчанию и не согласен с перерывами после возврата. (Коллега делает это, и это болит мои глаза.)

Я также отступаю, чтобы уменьшить распространение уровней отступа. :) а именно:

switch(option) { 
case 1: 
    a = 1; 
    b = 7; 
    break; 
case 2: 
    a = 2; 
    b = 4; 
    return -1; 
default: 
    a = -1; 
    break; 
} 

(. Я также считаю, что, так как оператор возврата не функция, она не подходит для обеспечения лишнего стиля, что делает его похожим на один)

+1

Я видел отступы, как вы уже недавно, и некоторое время стоял на заборе о вашем примере против моего. Я думаю, что я собираюсь переключиться (не каламбур) на ваш путь вперёд. Благодаря! –

+0

Да, хороший стиль там. Мне нравятся мои скобки на одной строке. – toto

+0

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

0

Я бы поставьте перерыв, чтобы показать, что вы не собираетесь проваливаться в следующий случай.

2

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

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

-1

Прошу извинить мои ограниченные знания, но что такое OCD?
Помимо этого, Брайан Керниган предоставляет good explanation, когда вы должны (не) использовать break в заявлении switch.

+1

Обсессивно-компульсивное расстройство. Как в ней душевно надоедает ему не видеть перерыва; после возвращения; –

+2

Хорошо, теперь я чувствую себя немой. Не скажешь больше. – pugmarx

1

Как указывали другие, размещение перерыва после возвращения или в случае по умолчанию в основном связано с личным стилем.

Когда я не должен следовать каким-либо конкретные правилам стиля, я предпочитаю что-то вроде этого:

 
    switch(foo){ 
     case 0: 
      baz = 1; 
      break; 
     case 1: 
      bar %= 2; 
      return -1; 
      /* NOTREACHED */ 
     case 2: 
      bar = -1; 
      return -2; 
      /* NOTREACHED */ 
      break; 
     default: 
      break; 
    } 

Между случаев 1 и 2, я, как правило, предпочитаю 2. Даже если комментарий говорит NOTREACHED, комментарии может лежать (непреднамеренно, конечно), когда код изменяется. Мне нравится комментарий NOTREACHED, так как он может удовлетворить, что вы знаете, что делаете, и служит напоминанием о том, что вы выходите из функции раньше. Причиной того, что размещение прерывания после возвращения будет уменьшать ошибки, если возврат удаляется, кажется мне неправильным. Вы по-прежнему будете получать фиктивное поведение, независимо от того, попадете ли вы в следующий случай или вы выйдете из коммутатора и продолжаете работу по-прежнему.

Конечно, если я могу избежать этого, я не вернусь от функции в теле коммутатора.

2

Я предпочитаю всегда иметь перерыв в каждом случае включая умолчанию и не делать возврат на все внутри переключателя «с. Для коротких переключателей всего 2-3 случая (включая по умолчанию) возврат в порядке, но только если все дело s сделайте это так же. «бессмысленный» перерыв я вижу как бессмысленный и только делаю, что это больше кода для чтения. То же самое касается пустых значений по умолчанию, которые просто ломаются, совершенно бессмысленно. Легкость чтения кода, на мой взгляд, важнее того, что происходит, если кто-то меняет то или это.

0

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

1

Мне сказали, что в C, C++, java и C#, если вы не поместите эти «перерывы», поток программных кодов попадет в другие «случаи» и выполнит инструкции внутри них, не важно если переменная не имеет значений, назначенных «случаям».

+1

На самом деле, в C# вы не используете перерывы в инструкции switch. Если вы хотите провалиться, вам действительно нужно использовать оператор goto, чтобы перейти к случаю, к которому вы хотите пройти (например, goto case 2;). Я был очень удивлен, когда узнал об этом, учитывая, что аналогичный синтаксис находится между C# и C/C++. Я предполагаю, что это имеет смысл, потому что это заставляет вас делать что-то явное, чтобы реализовать провал. (И на самом деле он «проваливается» гораздо более гибким, хотя и со всеми оговорками, которые идут вместе с использованием goto's в других ситуациях.) – RobH

1

Относительно комментария, сделанного другими, что они оставляют перерыв в случае по умолчанию в случае, если кто-то приходит позже, и добавляет к нему случай: где я работаю, стандарт кодирования говорит всегда ставит по умолчанию как последний случай; поэтому в нашей ситуации разрыв в этом случае просто лишний. (Это один из случаев, когда я полностью согласен с стандартом кодирования компании, потому что, когда случай по умолчанию всегда был последним, вы всегда знаете, где его найти, даже в длинном операторе switch-statement.)

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