嵌套和级联if-else有什么区别?
答案 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 块以分离以其主体执行的业务逻辑命名的方法。