В чем разница между вложенным и каскадным if-else - PullRequest
5 голосов
/ 29 марта 2010

В чем разница между вложенным и каскадным if-else?

Ответы [ 3 ]

4 голосов
/ 29 марта 2010

Эти два эквивалентны:

if (condition1) block1 
else if (condition2) block2


if (condition1) block1 
else
{
   if (condition2) block2
}

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

2 голосов
/ 29 марта 2010

Я зависит от того, как вы их устроите. Вложенный if эквивалентен добавлению и к каждому из внутренних ifs:

if(A) {
    if(B) {
        statement1
    }
    else if(C) {
        statement2
    }
}

эквивалентно:

if(A and B) {
    statement1
}
else if(A and C) {
    statement2
}

Мой совет - стремиться к удобочитаемости и проверять логику. Законы Деморгана могут оказаться полезными для перестройки вашей логики.

Вот тот, который меня всегда раздражает:

if(A and B) {
    statement1
    statement2
}
else if(A and C) {
    statement1
    statement3
}
else if(not A) {
    statement4
}

против

if(A) {
    statement1
    if(B) {
        statement2
    }
    else if(C) {
        statement3
    }
}
else if(not A) {
    statement4
}

Я просто не уверен, что более читабельно. Они логически эквивалентны. Первый более табличный и более наглядный, но повторяет оператор1; вторая более вложенная и немного уродливая (на мой взгляд), но не повторяет утверждения. В конечном счете это вызов для оценки, поскольку он не имеет значения для компилятора.

1 голос
/ 29 марта 2010

Вложенные if-then-else управляющие структуры - это минимизированные переводы сложных логических правил. Они хороши во избежании избыточности в условиях проверки. Их главный недостаток заключается в том, что в конечном итоге эти структуры могут расти и делать методы включения слишком большими и сложными. Первым шагом в разрушении вложенных if-then-else блоков является нормализация. Например:

if (A) {
  if (B || C) {
    block 1;
  } else {
    if (!D) {
      block 2;
    }
  }
} else {
  block 3;
}

можно нормировать на каскад if-then-else

if (A && (B || C) {
  block 1;
  return;
}
if (A && !B && !C && !D) {
  block 2;
  return;
}
if (!A) {
  block 3;
}

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

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