перерыв в случае с возвратом .. и по умолчанию - PullRequest
38 голосов
/ 05 июня 2009

Мой 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:» мне действительно не нужен перерыв, но стоит ли в любом случае иметь его там? Для «по умолчанию:». Это чисто ОКР или есть какая-то реальная причина, чтобы сделать перерыв здесь?

Ответы [ 13 ]

35 голосов
/ 05 июня 2009

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

25 голосов
/ 05 июня 2009

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

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

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

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

8 голосов
/ 05 июня 2009

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

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

2 голосов
/ 05 июня 2009

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

2 голосов
/ 05 июня 2009

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

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

1 голос
/ 06 июня 2009

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

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

1 голос
/ 06 июня 2009

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

1 голос
/ 05 июня 2009

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

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

    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, так как он может убедить вас в том, что вы знаете, что делаете, и служит напоминанием о том, что вы выходите из функции раньше. Причины, по которым размещение перерыва после возврата уменьшит количество ошибок, если возврат будет удален, кажутся мне ошибочными. Вы по-прежнему будете вести себя фиктивно, независимо от того, перейдете ли вы к следующему случаю или выйдете из коммутатора и продолжите, как и раньше.

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

1 голос
/ 05 июня 2009

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

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

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

0 голосов
/ 06 июня 2009

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

...