Быстрый вопрос о возврате из вложенного оператора - PullRequest
1 голос
/ 04 декабря 2008

Если у меня есть что-то вроде цикла или набора операторов if / else и я хочу вернуть значение из гнезда (см. Ниже), это лучший способ сделать это, чтобы присвоить значение полю или собственность и вернуть что?

См. Ниже:

bool b;

public bool ifelse(int i)
{
if(i == 5)
{
b = true;
}

else
{
b = false;
}
return b;
}

Ответы [ 6 ]

7 голосов
/ 04 декабря 2008

а как же

return i == 5;
6 голосов
/ 04 декабря 2008

Есть несколько просмотров по этому вопросу. Я думаю, что большинство людей (включая меня), как правило, предпочитают возвращаться, как только у вас есть ответ, и больше нет работы. Некоторые люди утверждают, что вам следует возвращаться только при последнем утверждении метода. Однако в некоторых ситуациях это может усложнить ситуацию.

Исходя из того, что я предложил, ваш пример будет короче и проще:

public bool ifelse(int i)
{
if(i == 5)
{
return true
}
return false
}
5 голосов
/ 04 декабря 2008

Если b используется только для вычисления возвращаемого значения для вашего метода, вы должны сделать его локальной переменной (определенной в методе).

public bool ifelse(int i)
{
  bool b;
  /*
  Some code to calculate b
  */
  return b;
}

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

0 голосов
/ 04 декабря 2008

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

Основная проблема, которую я знаю о множественных возвратах, состоит в том, что вы можете быстро забыть выполнить некоторую очистку или подобное в новой точке возврата. ИМХО, это такая же проблема с единственной формой возврата, потому что путь перехода должен помнить, чтобы включить этот код, а не другой код. Одним из решений этой проблемы, доступным на некоторых языках, таких как c #, является блок finally, или он точнее, из оператора scope , как показано здесь . (Хорошо, я возьму свою мыльницу сейчас)

0 голосов
/ 04 декабря 2008

Да, это хороший стиль.

Альтернативой (которая будет плохой ) будет сделать это:


public bool ifelse(int i) 
{ 
    if(i == 5) 
    { 
        return true; 
    }
    else 
    { 
        return false; 
    }
}

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

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

0 голосов
/ 04 декабря 2008

Я бы сказал, если вы, как правило, должны возвращаться из метода только в двух местах - около начала (как в условиях охраны) и около конца; Если метод имеет какую-либо длину, вам следует использовать временную переменную, как вы упоминали, в противном случае людям, читающим код, может быть труднее следовать за ним.

...