Должен я использовать возвратиться/продолжить оператор вместо если еще?

// WPF

// Defined Color
button1.Background = Brushes.Green;

// Color from RGB
button2.Background = new SolidColorBrush(Color.FromArgb(255, 0, 255, 0));
28
задан sharptooth 8 June 2009 в 11:51
поделиться

12 ответов

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

Следовательно, вопрос в том, насколько похожи «// делай что-то» и «делай что-нибудь». Если они концептуально похожи, используйте if / else. Если они концептуально отличаются, используйте continue / return.

13
ответ дан 28 November 2019 в 02:24
поделиться

Мой личный подход к выбору одного из них заключается в том, что если тело части if очень короткое (максимум 3 или 4 строки), имеет смысл использовать ] вариант возврата / продолжения . Если тело длинное, сложнее отслеживать поток управления, поэтому я выбираю версию else .

В результате обычно этот подход ограничивает использование return / continue , чтобы пропустить некоторые данные и избежать дальнейшей обработки , а не обработать их одним из следующих методов (который лучше подходит для if / else ).

31
ответ дан 28 November 2019 в 02:24
поделиться

Это немного зависит от длины ветвей. Использование return / continue, которое вы описываете, хорошо, если начальная проверка if короткая, а тело длинное. Если обе части if и else длинные, я бы выделил их в отдельные функции.

Я рекомендую прочитать Code Complete, там много говорится о подобных вещах.

12
ответ дан 28 November 2019 в 02:24
поделиться

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

 if (termination condn) 
      return;
 // code 
 // code

до

if (success condn)
{
  // code
  // code
}
else
 return;

Это упрощает чтение и понимание кода.

11
ответ дан 28 November 2019 в 02:24
поделиться

Броский ответ состоит в том, что все зависит от.

В целом я считаю, что если условие является редким, защитным (например, проверка на ноль) или ошибочным состоянием, тогда Я предпочитаю использовать return или continue

Если это ожидаемый случай, я предпочитаю использовать ваш первый подход.

Обратите внимание, однако, что я сказал «склоняться». Граница между этими условиями нечеткая и может меняться в зависимости от проекта и того, с кем я работаю.

6
ответ дан 28 November 2019 в 02:24
поделиться

Не жертвуйте удобочитаемостью ради преждевременной оптимизации.

Например:

void function() {
    if( condition ) {
        //do some stuff
    } else {
        //do other stuff
    }
}

в большинстве случаев двоично эквивалентен

void function() {
    if( condition ) {
        //do some stuff
        return;
    }
    //do other stuff
}

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

4
ответ дан 28 November 2019 в 02:24
поделиться

1) Проверка состояния входа или объекта . Следующий код:

void function() {
    if( condition ) {
        //do some stuff
        return;
    }
    //do other stuff
}

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

2) Многоступенчатая обработка . While / continue хорош, когда цикл извлекает элементы из некоторой коллекции и обрабатывает их многоступенчатым образом:

while(foo = bar.getNext()) {
   if(foo.empty())
       continue;
   if(foo.alreadyProcessed())
       continue;
   // Can we take a shortcut?
   if(foo.tryProcessThingsYourself())
       continue;
   int baz = foo.getBaz();
   if(baz < 0) {
       int qux = foo.getQux();
       if(qux < 0) {
         // Error - go to next element
         continue;
       }
   }
   // Finally -- do the actual processing
   baz = baz * 2;
   foo.setBaz(baz);
}

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

Примечание: постамент опубликовал реальный пример, который следует тому, что сказано в 2).

3) Общее правило . Я использую continue и return , когда это соответствует факту, что что-то было прервано. Я использую else , когда else является частью фактической обработки.

3
ответ дан 28 November 2019 в 02:24
поделиться

как говорили другие, используйте return / continue, только если что-то короткое.

Лично я использую continue только в том случае, если можно написать в одной строке, например:

while( loopCondition ) {
    if( innerCondition ) continue;

    //do other stuff
}

Если это не так. можно написать это так, чтобы код не стал уродливым, тогда if / else.

2
ответ дан 28 November 2019 в 02:24
поделиться

Обычно я использую метод if-return при выходе из метода или цикла, потому что ничего не нужно делать.

Если тело длиннее, потому что выполняется значительная работа, я Предлагаем использовать if-else и, возможно, использовать #region , чтобы дать блокам разумное имя и сделать их легко сворачиваемыми, чтобы люди могли изучить поток управления. То или делайте отдельные методы :)

1
ответ дан 28 November 2019 в 02:24
поделиться

Чтобы найти ухмылки, я поискал в кодовой базе моей компании слово «продолжить»; просто чтобы понять, где он используется. Мы используем if 695 раз в 59 проектах в одном решении, примерно 1500 исходных файлов.

Я вижу, что они используются в основном в качестве быстрого фильтра:

foreach (Frobozz bar in foo) {
    if (QuickFilterExclude(bar))
        continue;
    // extensive processing
}

Восстановление после ожидаемого исключения:

foreach (Frobozz bar in foo) {
    Baz result = new Baz(kDefaultConfiguration);
    try {
        Baz remoteResult = boo.GetConfiguration();
    }
    catch (RemoteConnectionException) {
        continue;
    }
    result.Merge(remoteResult);
    ReportResult(result);
}

И, наконец, в государственный аппарат.

2
ответ дан 28 November 2019 в 02:24
поделиться

Я обычно предпочитаю

while( loopCondition ) {
    if( innerCondition ) {
        DoStuff();
    } else {
        DoOtherStuff(); 
    }
}

continue может быть трудно отслеживать, если длина DoStuff превышает порог 1-2 строки (и довольно легко пропустить намерение). Это кажется хорошей возможностью реорганизовать логику в несколько более мелких методов.

4
ответ дан 28 November 2019 в 02:24
поделиться

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

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

2
ответ дан 28 November 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: