嵌套和级联if-else有什么区别

时间:2010-03-28 21:10:22

标签: language-agnostic if-statement

嵌套和级联if-else有什么区别?

3 个答案:

答案 0 :(得分:4)

这两个是等价的:

if (condition1) block1 
else if (condition2) block2


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

我认为他们也会编译成同一个程序集,因此应该没有区别。

答案 1 :(得分:2)

我取决于你如何安排它们。嵌套if等效于向每个内部ifs添加和:

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

相当于:

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

我的建议是努力提高可读性并检查你的逻辑。您可能会发现DeMorgan's Laws对重新安排逻辑非常有用。

这是一个总是让我恼火的人:

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 :(得分:1)

嵌套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 块以分离以其主体执行的业务逻辑命名的方法。