Переключение оператора с возвратами - правильность кода - PullRequest
76 голосов
/ 18 июня 2010

Допустим, у меня есть код на C с примерно такой структурой:

switch (something)
{
    case 0:
      return "blah";
      break;

    case 1:
    case 4:
      return "foo";
      break;

    case 2:
    case 3:
      return "bar";
      break;

    default:
      return "foobar";
      break;
}

Теперь очевидно, что "break" не нужны для правильной работы кода, но это выглядит как плохая практикаесли я не положу их туда мне.

Что ты думаешь?Это нормально, чтобы удалить их?Или вы бы сохранили их для большей «правильности»?

Ответы [ 17 ]

114 голосов
/ 18 июня 2010

Удалить операторы break.Они не нужны, и, возможно, некоторые компиляторы будут выдавать «Недоступный код» предупреждения.

27 голосов
/ 18 июня 2010

Я бы взял совершенно другую тактику.Не ВОЗВРАЩАЙТЕСЬ в середине метода / функции.Вместо этого просто поместите возвращаемое значение в локальную переменную и отправьте его в конце.

Лично я считаю следующее более читабельным:

String result = "";

switch (something) {
case 0:
  result = "blah";
  break;
case 1:
  result = "foo";
  break;
}

return result;
8 голосов
/ 18 июня 2010

Лично я бы убрал возвраты и сохранил перерывы.Я бы использовал оператор switch, чтобы присвоить значение переменной.Затем верните эту переменную после оператора switch.

Хотя это спорный вопрос, я всегда чувствовал, что хороший дизайн и инкапсуляция означают один вход и один выход.Гораздо проще гарантировать логику, и вы случайно не пропустите код очистки, основанный на цикломатической сложности вашей функции.

Одно исключение: возвращение рано - хорошо, если в началефункция - до получения каких-либо ресурсов.

5 голосов
/ 18 июня 2010

Я бы их убрал.В моей книге такой мертвый код следует считать ошибкой, потому что он заставляет вас сделать двойной анализ и спросить себя: «Как бы я выполнил эту строку?»

5 голосов
/ 18 июня 2010

Удалить их. Возвращаться из операторов case идиоматично, а в противном случае это «недостижимый код».

5 голосов
/ 18 июня 2010

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

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

4 голосов
/ 18 июня 2010

Я бы обычно писал код без них. ИМО, мертвый код имеет тенденцию указывать неряшливость и / или непонимание.

Конечно, я бы также рассмотрел что-то вроде:

char const *rets[] = {"blah", "foo", "bar"};

return rets[something];

Редактировать: даже с отредактированным сообщением, эта общая идея может работать нормально:

char const *rets[] = { "blah", "foo", "bar", "bar", "foo"};

if ((unsigned)something < 5)
    return rets[something]
return "foobar";

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

2 голосов
/ 18 июня 2010

Что ты думаешь? Это нормально, чтобы удалить их? Или вы бы сохранили их для большей «правильности»?

Это нормально, чтобы удалить их. Использование return означает точно сценарий, в котором break не должен использоваться.

2 голосов
/ 18 июня 2010

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

2 голосов
/ 18 июня 2010

Я бы сказал, удалите их и определите default: branch.

...