构造“If”语句的更好方法

时间:2010-10-06 15:33:07

标签: if-statement code-readability

以下哪项是构建If语句嵌套的更好方法。

if (x && y)
   doXY();
else if (x)
   doX();
else if (y)
   doY();

(OR)

if(x)
   if(y)
     doXY();
   else
     doX();       
else if(Y)
   doY();

8 个答案:

答案 0 :(得分:5)

第一个没有嵌套,所以id说。

在第二个评估中,您正在评估“x”是否为真,然后进入该块并评估“y”是否为真,通常很好的做法是尽可能少地嵌套代码。

if (x && y)
{
   // doXY
}
else if (x)
{
   // doX
}
else
{
   // doY
}

答案 1 :(得分:2)

可读性方面我绝对会选择第一种选择。

但如果这是某些逻辑执行数百万次的一部分,并且您知道x&概率的概率分布。你是真的,只有x是真的,或者只有y是真的,有利于后者之一,你可能想为了表现而牺牲可读性。但是,请确保在跳转到这样的优化之前进行概要分析,并确保记录构造if语句的原因,以便其他开发人员不会只是通过重构来帮助帮助您你的代码。

答案 2 :(得分:2)

另一种可能性:

if (x && y)
   doXY();
if (x && !y)
   doX();
if (!x && y)
   doY();

这是 - 我在前面说 - 效率低下,但是到了这么小的程度,几乎没有关系。从可读性和可维护性的角度来看,在某些情况下可能会更好,因为没有任何条款依赖于任何其他条款,并且不要求它们按指定的顺序执行。如果需要,可以将每个单独的子句提取到自己的方法中。

答案 3 :(得分:2)

1。)正如kyndigs所说,较少的筑巢是一种很好的做法。

2.)另一个好的建议是用括号{ }包围运算符块,无论是否只有一个被调用方法或更多。

3.)始终尝试简化“if”语句。我的意思是if (isTrue)优于if (!(!isNotFalse))

我会用这种方式编写上面的代码:

if (x && y) {
   doXY();
}
else if (x) {
   doX();
}
else if (y) {
   doY();
}

答案 4 :(得分:1)

我认为第一个更好的可读性和良好的结构性

答案 5 :(得分:1)

您还可以执行以下操作:

switch (x + (y<<1))
{
   case 1: doX();  break;
   case 2: doY();  break;
   case 3: doXY(); break;
}

免责声明:请注意,这既不是更快也不是更好的可读性,只是一种替代方案,在极少数情况下可能是可接受的解决方案。

答案 6 :(得分:0)

我喜欢将代码行视为维护成本。线路越少=成本越低。在你的情况下,第一个代码块是一行更短,所以我投票支持。

一般来说,这当然取决于声明的背景。

SLOC

上查看此Wiki页面

答案 7 :(得分:0)

DoXY中的操作是否与Actions DoX()和DoY()互斥?即:你可以重新开始这样的行动:

if (x) { DoX(); }
if (y) { DoY(); }
if (X && y) { DoXY(); }

甚至可能是DoXY()的参数

if (X || y) { DoXY(x,y); }

但是我可能会选择第一个可读性选项......