Подтвердить что ты не робот

Лучшая практика в отношении заказа IF/ELSE

Что лучше? (Я кодирую в .Net, если это имеет значение)

IF condition = true THEN
   ...true action--even if rare...
ELSE
   ...action
END IF

или

IF condition = [most common condition] THEN
   ...most common action....
ELSE
   ...least common action
END IF
4b9b3361

Ответ 1

По словам Стив Макконнелл, автора кода Complete, вы должны

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

Code Complete, 2nd Edition, pages 356-357.

Ответ 2

Пойдите с наиболее читаемой версией для вашего конкретного случая, и, кстати, не сравнивайте логическое выражение с истинным и ложным. Используйте condition и Not condition (!condition в С#.)

if (condition == true) // bad
if (condition) // better 

Ответ 3

Прежде всего, вы не должны сравнивать с логическими значениями, это, do

if condition then

вместо

if condition = true then

О вашем вопросе, это зависит от имен естественных переменных, IMO.

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

if connected then
    //Proceed
else
    //Throw error
end if

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

if not retrieved then
   //Error
end if

Не выполняйте

if retrieved then
else
    //Error
end if

Ответ 4

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

У меня нет подсказки, если компилятор оставляет ваш заказ if then statement неповрежденным, и этот способ заставляет сборку использовать этот оптимизированный маршрут.

Я прочитал, что visual studio 2008 (когда было объявлено) будет иметь функциональность оптимизации, когда компилятор добавляет измерения в ветки, а затем во время выполнения измеряет, как часто проходит путь certian. Затем в последующих перекомпиляциях предпочтительным является наиболее оптимальный путь кода.

Я не знаю, была ли эта функция когда-либо проходить мимо "проектной/академической фазы"

Ответ 5

Как правило, я всегда ставил истинное предложение первым. Что-то вроде этого, для меня, запутывает смысл:

If not something Then
  'do something 1
Else
  'do something 2
End If

Это приводит к двойному отрицанию, гораздо лучше написать его следующим образом:

If something Then
  'do something 2
Else
  'do something 1
End If

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

http://www.cc2e.com/

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

Ответ 6

Вы получили довольно неплохие ответы. Я подхожу к вопросу под другим углом.

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

Во-вторых, я предпочитаю читаемость по сравнению с тривиальными улучшениями производительности. В большинстве случаев преимущества читаемости перевешивают преимущества производительности.

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

Ответ 7

Используйте то, что делает код более удобным для чтения. Обычно это второй вариант.

Изменить

Во многих случаях это зависит от того, чего вы пытаетесь достичь, например, если вы хотите проверить правильность подключения:

Connect()
if connected then
    SendString("Hello!")
else
    FlagConnectionFailed()
endif

Если вы хотите поймать ошибку:

' Just about to send something
if not connected then
    FlagConnectionLost()
    return
endif
SendString("Still connected!")

Но вы можете даже хотеть:

Disconnect()
if not connected then
    return "Complete"
else
    FlagConnectionDisconnectFailure()
endif

(Я не программист VB, поэтому синтаксис выше в основном составлен!)

Ответ 8

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

Для меня это обычно означает упорядочение оператора if, чтобы первое действие (в терминах строк кода) было первым, так что если оператор находится около нижней части окна, я с большей вероятностью увижу "Else" на экране.

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

Ответ 9

Лучшей практикой является второй вариант - наиболее распространенный сначала действие.

Это упрощает чтение кода, поскольку вы не отвлекается на код для менее используемого/исключительного случая.

Ответ 10

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

Один полезный повторный факторинг, который я нашел:

if (a.getFoo() == 1 && a.getBar() == 2) 

можно переустановить на

if (a.isFooBar()) 

В таких случаях случается что-то неприятное,

if (!(fooSet.contains(a.getValidFoo()))) 

может быть

if (a.hasInvalidFoo(fooSet)) 

Это может сделать вариант 1 также опцией 2, упрощая оценку наиболее распространенного условия.