Только один оператор возврата на метод, даже в этом сценарии? - PullRequest
12 голосов
/ 25 ноября 2008

Мне нравится идея иметь только один оператор return на метод.

Что вы делаете в этой ситуации?

public static string ChopText(string Text)
{
   if (String.IsNullOrEmpty(Text))
   {
      // return here ?????
   }
}

Единственная альтернатива, которую я могу придумать, это установить флаг, а затем проверить его.

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

Ответы [ 13 ]

36 голосов
/ 25 ноября 2008
25 голосов
/ 25 ноября 2008

Честно говоря, в подобных ситуациях чересчур жесткие правила плохие.

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

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

8 голосов
/ 25 ноября 2008

Код, который пытается иметь только один возврат на функцию, гораздо сложнее. Обычно это крысиное гнездо «если-то» и заданий. Я призываю вас взглянуть на такой код и узнать, что правильное значение всегда возвращается из этих разных путей. Ни за что.

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

7 голосов
/ 25 ноября 2008

Лично я думаю

public static string ChopText(string Text))
{
   if(String.IsNullOrEmpty(Text)
      return Text;

   ...
}

совершенно нормально, если вам это не нравится И если оно становится большим.

4 голосов
/ 25 ноября 2008

"Мне нравится идея иметь только 1 инструкцию возврата на метод." Объяснить

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

Bad:

if (Valid) { do lots of stuff}
else {return};

Clean:

if (invalid) { return; }
if (invalid2) {return; }

Другой подход:

if (invalid) {
     throws IllegalArgumentException();
4 голосов
/ 25 ноября 2008

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

2 голосов
/ 25 ноября 2008

Ваши методы в общих чертах не должны превышать «одного экрана». Если они это сделают, вы должны (в общем снова) попытаться разделить их на несколько методов. Возможно, это гораздо важнее, чем иметь «только одно возвращаемое выражение» ...

В конце концов, мы ищем удобочитаемость.

2 голосов
/ 25 ноября 2008

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

Не стесняйтесь выходить из функции в любое время, если она вам подходит!

2 голосов
/ 25 ноября 2008

Вы действительно должны взвесить затраты и выгоды, связанные с этим. Перевесят ли преимущества наличия только одного выражения return недостаток необходимости искажать метод, который должен быть довольно простым для записи?

Я бы пошел с нет для этого дела.

1 голос
/ 07 апреля 2011

<code>
public static string ChopText(string Text)
{
   string returnString = "";
   if(String.IsNullOrEmpty(Text))
   {
      returnString = "return string text";
   }
   return returnString;
}
...