Быстрый вопрос о возврате из вложенного оператора

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

См. ниже:

bool b;

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

else
{
b = false;
}
return b;
}

Ничего себе ужасный код для начинающих :) Я давно не видел что-то, связанное с чем-то таким простым

Robert Gould 04.12.2008 04:51

возможный дубликат Должна ли функция иметь только один оператор возврата?

Georg Fritzsche 07.08.2010 20:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
233
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

что о

return i == 5;

Я думаю, что это не проиллюстрировало бы вопрос о «стиле программирования», который он пытался поднять, но +1 для наиболее оптимизированного ответа.

Doctor Jones 04.12.2008 03:42

наиболее оптимизированным ответом было бы «вернуть истину»; потому что OP использовал классический "if (i = 5)" vs. "if (i == 5)" (исправлено)

BCS 04.12.2008 03:55

Я заметил это :) Я подумал, что, поскольку язык не был указан, я бы не стал зацикливаться на нем!

DaEagle 04.12.2008 03:56

Поэтому я не комментировал, а просто исправил.

BCS 04.12.2008 05:13

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

Следуя тому, что я предложил, ваш пример был бы короче и проще:

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; 
    }
}

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

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

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

DaEagle 04.12.2008 03:54

Согласен, но это очень короткий способ. Где бы вы провели черту? 3-я, 4-я или 5-я точка возврата? Может даже 16-й? Это субъективная вещь (стиль всегда таков), и она также зависит от обстоятельств. Я думаю, что в правильной ситуации можно использовать 2 точки возврата, но большее количество становится недостижимым.

Doctor Jones 04.12.2008 04:53

Любое числовое ограничение на возврат выше 1 приведет к неприятному коду раннего выхода «if (this || that || theother) return false;» вместо трех отдельных коротких строк раннего выхода для трех вещей, которые могут вызвать ранний выход . Я бы предпочел сохранить второе, чем первое.

Steve Jessop 04.12.2008 05:18

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

Steve Jessop 04.12.2008 05:21

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

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

Другие вопросы по теме