Если у меня есть что-то вроде цикла или набора операторов if / else, и я хочу вернуть значение из гнезда (см. Ниже), лучший способ сделать это - присвоить значение полю или свойству и вернуть что?
См. ниже:
bool b;
public bool ifelse(int i)
{
if (i == 5)
{
b = true;
}
else
{
b = false;
}
return b;
}
возможный дубликат Должна ли функция иметь только один оператор возврата?





что о
return i == 5;
Я думаю, что это не проиллюстрировало бы вопрос о «стиле программирования», который он пытался поднять, но +1 для наиболее оптимизированного ответа.
наиболее оптимизированным ответом было бы «вернуть истину»; потому что OP использовал классический "if (i = 5)" vs. "if (i == 5)" (исправлено)
Я заметил это :) Я подумал, что, поскольку язык не был указан, я бы не стал зацикливаться на нем!
Поэтому я не комментировал, а просто исправил.
Есть несколько мнений по этому поводу. Я думаю, что большинство людей (включая меня), как правило, предпочитают возвращаться, как только у вас будет ответ и больше не будет над чем работать. Некоторые люди будут утверждать, что вы должны всегда возвращаться только при последнем операторе метода. Однако в некоторых ситуациях это может усложнить задачу.
Следуя тому, что я предложил, ваш пример был бы короче и проще:
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;
}
Как предлагали другие, если ваш метод прост, я бы вообще не использовал временную переменную и возвращал результат, как только он стал известен. Общее правило - использовать тот метод, который упрощает чтение кода.
Да, это хороший стиль.
Альтернативой (которая будет Плохо) было бы сделать это:
public bool ifelse(int i)
{
if (i == 5)
{
return true;
}
else
{
return false;
}
}
Причина, по которой множественные точки возврата считаются плохим стилем, заключается в том, что особенно для более крупных методов может быть трудно отслеживать поток программы внутри метода, поскольку он может завершиться в точке Любые. Это может быть кошмаром для отладки. Однако, если у вас есть возвращаемая переменная, которую вы назначаете, вы можете наблюдать за этой переменной и точно знать, когда она будет возвращена (из одного места).
Это не всегда, так как в каждой стилистической точке программирования есть хорошие стороны и плохие стороны.
В любом случае использование длинных методов считается плохим стилем. Обычно методы не должны содержать больше одной страницы. Если больше, их нужно отредактировать, чтобы сделать их короче. Иногда это невозможно, но почти никогда.
Согласен, но это очень короткий способ. Где бы вы провели черту? 3-я, 4-я или 5-я точка возврата? Может даже 16-й? Это субъективная вещь (стиль всегда таков), и она также зависит от обстоятельств. Я думаю, что в правильной ситуации можно использовать 2 точки возврата, но большее количество становится недостижимым.
Любое числовое ограничение на возврат выше 1 приведет к неприятному коду раннего выхода «if (this || that || theother) return false;» вместо трех отдельных коротких строк раннего выхода для трех вещей, которые могут вызвать ранний выход . Я бы предпочел сохранить второе, чем первое.
Хотя несколько возвратов действительно приводят к случайным хлопотам при отладке. Например, необходимо установить несколько точек останова, по одной при каждом возврате. Или необходимость переименовать всю функцию и обернуть ее новой версией старого имени, чтобы зарегистрировать возвращаемое значение. Насколько я знаю, ничего, с чем ты не сможешь справиться.
Как уже указывалось, наличие более одного оператора return имеет обратную сторону - их трудно найти. OTOH в некоторых случаях дополнительная логика, необходимая для перехода к этому оператору return, хуже проблемы, которую решает стиль.
Основная проблема, которую я знаю о многократных возвратах, заключается в том, что вы можете быстро забыть выполнить некоторую очистку или что-то подобное в новой точке возврата. ИМХО, это такая же проблема с единственной формой возврата, потому что путь выхода должен помнить о включении этого кода, а не другого кода. Одно из решений этого, доступное на некоторых языках, таких как C#, - это блок finally или более аккуратная форма заявление о сфере действия, как продемонстрировано здесь. (Хорошо, я сейчас заберу свою мыльницу)
Ничего себе ужасный код для начинающих :) Я давно не видел что-то, связанное с чем-то таким простым