Каково различие между вложенным и каскадным если еще?
Эти два эквивалента:
if (condition1) block1
else if (condition2) block2
if (condition1) block1
else
{
if (condition2) block2
}
Я предполагаю, что они также компилируются в одну и ту же сборку, поэтому не должно быть никакой разницы.
Вложенные управляющие структуры 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 можно выделить в отдельные методы, названные в честь бизнес-логики, выполняемой их телами.
Зависит от того, как вы их расположите. Вложенное 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; второй более вложенный и немного более уродливый (на мой взгляд), но не повторяет утверждения. В конечном счете, это суждение, потому что для компилятора нет никакой разницы.