0

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

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

(或者)

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

8 回答 8

5

第一个嵌套较少,所以 id 这么说。

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

if (x && y)
{
   // doXY
}
else if (x)
{
   // doX
}
else
{
   // doY
}
于 2010-10-06T15:34:19.487 回答
2

可读性方面,我肯定会选择第一个选项。

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

于 2010-10-06T15:41:46.610 回答
2

另一种可能:

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

这是 - 我预先声明 - 效率较低,但微不足道,几乎没有关系。从可读性和可维护性的角度来看,在某些情况下它可能会更好,因为没有一个子句依赖于任何其他子句,也没有要求它们按照指定的顺序执行。如果需要,可以将每个单独的子句提取到自己的方法中。

于 2010-10-06T15:44:04.250 回答
2

1.) 正如 kyndigs 所说,少嵌套是一个好习惯。

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

3.) 总是尽量简化你的“if”语句。我的意思if (isTrue)是比if (!(!isNotFalse))

我会这样写上面的代码:

if (x && y) {
   doXY();
}
else if (x) {
   doX();
}
else if (y) {
   doY();
}
于 2010-10-06T16:07:11.997 回答
1

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

于 2010-10-06T15:36:50.593 回答
1

您还可以执行以下操作:

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

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

于 2010-10-06T15:55:30.097 回答
0

我喜欢将代码行数视为维护成本。更少的线路 = 更低的成本。在您的情况下,第一个代码块短了一行,所以我投票赞成。

通常,这当然取决于语句的上下文。

在SLOC上查看此 Wiki 页面

于 2010-10-06T15:38:37.073 回答
0

DoXY 中的动作是否与动作 DoX() 和 DoY() 互斥?即:您可以像这样重新操作操作吗:

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

甚至可能作为 DoXY() 的参数

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

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

于 2010-10-06T15:49:48.717 回答