2010-03-28 188 views

回答

4

这两者是等价的:

if (condition1) block1 
else if (condition2) block2 


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

我相信他们也编到相同的组件,所以应该没有什么区别。

+1

这不取决于特定的语言吗?虽然我想不出一种不正确的语言,但我确实可以创建一个:-) – Rune 2010-03-28 21:18:34

+0

+1编译部分 – 2010-03-28 21:18:37

+0

符文,你是对的! :)但是C语法现在已经接管了这个世界。在哪里是没有算术符号的旧cobol ... – abc 2010-03-28 21:24:19

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;第二个是更多的嵌套和有点丑陋(在我眼中),但不重复陈述。最终这是一个判断的要求,因为它对编译器没有任何影响。

+0

在第一个版本中,你正在重复代码,所以我一定会选择实现第二个代码,这也使得它在我看来更具可读性。重复的线条更加膨胀。 – Dkyc 2013-12-05 10:30:39

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块和进行了进一步提取方法重构容易。所有这三个如果块可以被提取到独立的方法,它们的名称以其执行的业务逻辑命名。

+0

我喜欢这个想法,但我认为那么远应该只用于保护子句而不是核心功能逻辑。此外,许多公司环境限制了函数可能具有的返回数量,因此这种方法可能无法实现。 – charlieb 2010-03-28 21:43:13

+0

由于嵌套的if-then-else子句,我见过一段时间以后像癌症一样增长的方法。当他们必须由许多人维护时,没有人有勇气或愿意将它们分成几种方法。 '规范化'使得这种重构成为可能,并且使代码更好。 – 2010-03-29 07:16:02

+1

测试是勇气的绝佳替代品。 – 2010-03-31 17:13:58