Быстрый вопрос о возврате из вложенного оператора
Если у меня есть что-то вроде цикла или набора операторов if/else, и я хочу вернуть значение из гнезда (см. Ниже), это лучший способ сделать это, чтобы присвоить значение полю или свойству и вернуть тот?
Увидеть ниже:
bool b;
public bool ifelse(int i)
{
if(i == 5)
{
b = true;
}
else
{
b = false;
}
return b;
}
6 ответов
Да, это хороший стиль.
Альтернативой (что было бы плохо) было бы сделать это:
public bool ifelse(int i)
{
if(i == 5)
{
return true;
}
else
{
return false;
}
}
Причиной того, что множественные точки возврата считаются плохим стилем, является то, что особенно для более крупных методов может быть трудно отслеживать ход программы внутри метода, поскольку он может завершиться в любой точке. Это может быть кошмаром для отладки. Однако если у вас есть возвращаемая переменная, которую вы назначаете, вы можете наблюдать за этой переменной и точно знать, когда она будет возвращена (из одного места).
Это не всегда так, так как в каждом стилистическом аспекте программирования есть свои плюсы и минусы.
Есть несколько мнений по этому вопросу. Я думаю, что большинство людей (включая меня), как правило, предпочитают возвращаться, как только у вас есть ответ, и больше нет работы. Некоторые люди утверждают, что вам следует возвращаться только при последнем утверждении метода. Однако в некоторых ситуациях это может усложнить ситуацию.
Исходя из того, что я предложил, ваш пример будет короче и проще:
public bool ifelse(int i)
{
if(i == 5)
{
return true
}
return false
}
Если b используется только для вычисления возвращаемого значения для вашего метода, тогда вы должны сделать его локальной переменной (определенной в методе).
public bool ifelse(int i)
{
bool b;
/*
Some code to calculate b
*/
return b;
}
Как предлагали другие, если ваш метод прост, я бы вообще не использовал временную переменную и возвращал результат, как только он стал известен. Общим правилом будет использование любого метода, который делает код более простым для чтения.
Как уже отмечалось, наличие более чем одного оператора return имеет обратную сторону: их трудно найти. OTOH в некоторых случаях добавленная логика, необходимая для выхода из этого оператора return, хуже, чем проблема, которую решает стиль.
Основная проблема, которую я знаю о множественных возвратах, состоит в том, что вы можете быстро забыть выполнить некоторую очистку или подобное в новой точке возврата. ИМХО, это такая же проблема с единственной формой возврата, потому что путь перехода должен помнить, чтобы включить этот код, а не другой код. Одним из решений этой проблемы, доступным на некоторых языках, таких как C#, является блок finally, или он более точен в форме оператора видимости, как показано здесь. (Хорошо, я возьму свою мыльницу сейчас)
Я бы сказал, если вы, как правило, должны возвращаться из метода только в двух местах - около начала (как в условиях охраны) и около конца; Если метод имеет какую-либо длину, вы должны использовать временную переменную, как вы упомянули, иначе людям, читающим код, может быть труднее следовать за ним.