Если-еще против, если нет-если - PullRequest
0 голосов
/ 07 февраля 2019

Согласно руководству на работе, различие между

if (invalid) {
   ...some code
}

if (!invalid) {
  ...some code
}

и

if (invalid) {
  ...some code
} else {
  ...some code
}

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

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

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Это определенно не выбор стиля.

Если у вас есть два отдельных if s, тогда выражение будет эффективно оценено дважды.Выражение может быть сложным, это может быть даже метод, этот метод может иметь побочные эффекты:

if (someMethod()) {
}

if (!someMethod()) {
}

Разница должна быть очевидной.

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

Обычно компилятор не может обнаружить одну и ту же ситуацию с двумя отдельными if s.

0 голосов
/ 07 февраля 2019

Мало того, что здесь есть избыточность, но в зависимости от языка, также может быть разница в правильности / достоверности.Рассмотрим этот код C #:

int value;
bool condition = DateTime.UtcNow.Second < 30;
if (condition)
{
    value = 10;
}
else            
{
    value = 20;
}
// No problem, value is definitely assigned
Console.WriteLine(value);

Это полностью верно.Но если мы напишем его в избыточном стиле, мы получим ошибку во время компиляции:

int value;
bool condition = DateTime.UtcNow.Second < 30;
if (condition)
{
    value = 10;
}
if (!condition)
{
    value = 20;
}
// error CS0165: Use of unassigned local variable 'value'
Console.WriteLine(value);

То же самое будет верно в Java, и я подозреваю, что и во многих других языках.Компилятор может учитывать тот факт, что в if / else выполнение будет выполняться точно в одну из этих ветвей.В стиле «два утверждения if» языковые правила не дают такой гарантии.

...