Лучшая практика по заявлению IF / ELSE - PullRequest
13 голосов
/ 20 августа 2009

Какая практика лучше? (Я пишу в .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

Ответы [ 10 ]

32 голосов
/ 20 августа 2009

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

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

Код завершен , 2-е издание, стр. 356-357.

8 голосов
/ 20 августа 2009

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

if (condition == true) // bad
if (condition) // better 
3 голосов
/ 20 августа 2009

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

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

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

Понятия не имею, прошла ли эта функция «стадию проектирования / обучения»

3 голосов
/ 20 августа 2009

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

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
2 голосов
/ 21 августа 2009

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

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

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

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

2 голосов
/ 20 августа 2009

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

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.

1 голос
/ 21 августа 2009

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

Я нашел один полезный ре-факторинг:

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

может быть перефакторизовано до

if (a.isFooBar()) 

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

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

может быть

if (a.hasInvalidFoo(fooSet)) 

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

1 голос
/ 20 августа 2009

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

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

1 голос
/ 20 августа 2009

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

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

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

1 голос
/ 20 августа 2009

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

Редактировать

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

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, поэтому приведенный выше синтаксис в основном составлен!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...