Поток управления через Возврат по сравнению с, Если/Еще [закрыто]

AFAIK там не является никаким путем. Необходимо стараться избегать этой ситуации, всегда устанавливая указатели в NULL после освобождения памяти.

17
задан Bill the Lizard 20 July 2012 в 23:12
поделиться

11 ответов

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

27
ответ дан 30 November 2019 в 10:36
поделиться

Мне лично нравится подход if / else . Во-первых, ваш оператор if является положительным, а не отрицательным, что упрощает чтение. Во-вторых, вы заключили условия в фигурные скобки, и я поклонник этого стиля.

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

10
ответ дан 30 November 2019 в 10:36
поделиться

Я предпочитаю второй подход ради удобства чтения и поддержки. Удобочитаемость, потому что он просто читается «чище» для меня, чем первый подход, и ремонтопригодность, потому что мне не нужно беспокоиться о добавлении фигурных скобок, если мне нужно изменить предложения if или else. Кроме того, при первом подходе всего на 7 символов меньше, чем при втором подходе, если вы не включаете новые строки, что вряд ли может служить оправданием выбора первого вместо второго.

Тем не менее, я предпочитаю это:

public ActionResult Edit(MyClass class)
{
    ActionResult rv = null;
    if (class.Editable)
    {
        class.Update();
        rv = View();
    }
    return rv;
}

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

6
ответ дан 30 November 2019 в 10:36
поделиться

Оба этих оператора управляют потоком с помощью оператора if . Это просто вопрос того, как вы справляетесь с условием.

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

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

3
ответ дан 30 November 2019 в 10:36
поделиться

Я бы предпочел тот, который я определяю как тот, который ВЫПОЛНЯЕТ меньше кода.
Если для class.Editable чаще встречается значение false, я бы выбрал A.

Но этот пример не дает большого преимущества ни в том, ни в другом случае.

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

РЕДАКТИРОВАТЬ:
Для пояснения:
Под меньшим количеством выполняемого кода я на самом деле подразумеваю наиболее эффективный ...

2
ответ дан 30 November 2019 в 10:36
поделиться

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

На самом деле это довольно известная школа мысли среди толпы Code Contracts.

2
ответ дан 30 November 2019 в 10:36
поделиться

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

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

1
ответ дан 30 November 2019 в 10:36
поделиться

Оба варианта допустимы, и один не обязательно лучше другого. Какой из них вы выберете, - это, в конечном счете, личное предпочтение. Да, вариант A приводит к немного меньшему количеству кода, но в целом они почти равны.

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

Является ли ActionResult перечислением или базовым классом? Если это перечисление, почему вы возвращаете null , когда Edit возвращает то, что кажется перечислением? Разве не было бы чище просто вернуть значение ActionResult , которое указывает, что никаких действий не было предпринято, потому что объект не был в редактируемом состоянии?

1
ответ дан 30 November 2019 в 10:36
поделиться

Я предпочитаю первый вариант при условии, что проверяемый вами случай является защитным / предварительным условием, которое должно быть выполнено для того, чтобы вызов метода был действительным. Хотя вы можете поспорить, должны ли вы возвращать null или генерировать исключение (аргумент). Если класс недоступен для редактирования, должен ли он действительно быть параметром для этого метода?

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

0
ответ дан 30 November 2019 в 10:36
поделиться

Я тоже предпочитаю if / else . Для меня разборчивость, удобочитаемость и ремонтопригодность превыше всего.

0
ответ дан 30 November 2019 в 10:36
поделиться

Я тоже предпочитаю вариант 1. Для меня он лучше читается как книга. Также меня всегда огорчает отсутствие возврата в конце варианта 2.

-1
ответ дан 30 November 2019 в 10:36
поделиться
Другие вопросы по тегам:

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