Каково различие между вложенным и каскадным если еще

Каково различие между вложенным и каскадным если еще?

5
задан skaffman 28 March 2010 в 21:20
поделиться

3 ответа

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

if (condition1) block1 
else if (condition2) block2


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

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

4
ответ дан 14 December 2019 в 08:46
поделиться

Вложенные управляющие структуры 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 можно выделить в отдельные методы, названные в честь бизнес-логики, выполняемой их телами.

1
ответ дан 14 December 2019 в 08:46
поделиться

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

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
}

vs

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

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

2
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

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