Как лучше всего использовать условие завершения ... см. Объяснение :)

Дело выглядит следующим образом: У вас есть логическое свойство FullScreenEnabled. Вы вводите какой-либо метод, и код в этом методе выполняется, если FullScreenEnabled имеет значение true. Какой из двух подходов ниже вы используете в повседневном программировании:

    private bool FullScreenEnabled { get; set; }
    // Check if FullScreenEnabled is false and return;
    private void Case1()
    {
        if (FullScreenEnabled == false)
        {
            return;
        }

        // code to be executed goes here!
    }

    // Surround the code by an if statement.
    private void Case2()
    {
        if (FullScreenEnabled)
        {
            // code to be executed goes here!
        }
    }

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

Oskar 28.09.2008 14:33
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
226
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ни один из подходов не был опубликован. Вы должны прочитать помощь при редактировании, чтобы убедиться, что код действительно появляется.

Ответ принят как подходящий

private void MyMethod(bool arg){
   if (arg)
       return;
   //do stuff
};

(для голосования)

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

Oskar 28.09.2008 14:32

private void MyMethod(bool arg){
    if (!arg){
        //do stuff
    }
}

(для голосования)

Я обычно предпочитаю первую версию (выгрузка в начале метода). Это приводит к меньшей вложенности, что немного увеличивает читаемость. Если вы решите, что вам не нужно проверять условие в будущем, также проще удалить условие if в первой версии, особенно если у вас есть несколько таких проверок. Кроме того, это можно легко записать в одну строку: if (! FullScreenEnabled) return;

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

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

Обратите внимание, однако, что в вашем примере это сравнение с false. Вместо этого вы должны написать! FullScreenEnabled. Делает код более читабельным.

if (!FullScreenEnabled)
    throw new InvalidOperationException("Must be in fullscreen mode to do foo.");

Мои два цента, сколько это стоит.

В любом случае работает одинаково.

Однако, если вы запустите показатели покрытия кода для своих модульных тестов, if (!FullScreenEnabled) return; будет считаться отдельным блоком, и вам придется создать модульный тест, чтобы охватить его, чтобы достичь 100%.

Конечно, даже с другим подходом вы можете захотеть иметь модульный тест, который проверяет, что вы не выполняете свой код, когда FullScreenEnabled имеет значение false. Но если схитрить и не написать, все равно получишь 100%. :-)

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

Есть очень хорошая статья, которая более подробно объясняет это ниже:

Coding Horror: код сглаживания стрелки

Я бы выбрал первый подход, я считаю его более читаемым, чем второй. в основном я думаю, что:

  1. if (FullScreenEnabled == false) более читабелен, чем if (FullScreenEnabled).
  2. если вы продолжите ставить проверки «вменяемости» в начало метода, метод получит красивую структуру, которую очень легко понять.

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

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