以下哪项是构建If
语句嵌套的更好方法。
if (x && y)
doXY();
else if (x)
doX();
else if (y)
doY();
(或者)
if(x)
if(y)
doXY();
else
doX();
else if(Y)
doY();
以下哪项是构建If
语句嵌套的更好方法。
if (x && y)
doXY();
else if (x)
doX();
else if (y)
doY();
(或者)
if(x)
if(y)
doXY();
else
doX();
else if(Y)
doY();
第一个嵌套较少,所以 id 这么说。
在第二个中,您正在评估“x”是否为真,然后进入该块并评估“y”是否为真,这通常是尽可能少地嵌套代码的好习惯。
if (x && y)
{
// doXY
}
else if (x)
{
// doX
}
else
{
// doY
}
可读性方面,我肯定会选择第一个选项。
但是,如果这是执行数百万次的某些逻辑的一部分,并且您知道 x 和 y 为真与只有 x 为真或只有 y 为真的概率分布有利于后者之一,您可能想要为了性能而牺牲可读性。但是,请确保在进行此类优化之前进行概要分析,并确保记录构造此类 if 语句的原因,以便其他开发人员不会只是通过重构您的代码来帮您一个忙。
另一种可能:
if (x && y)
doXY();
if (x && !y)
doX();
if (!x && y)
doY();
这是 - 我预先声明 - 效率较低,但微不足道,几乎没有关系。从可读性和可维护性的角度来看,在某些情况下它可能会更好,因为没有一个子句依赖于任何其他子句,也没有要求它们按照指定的顺序执行。如果需要,可以将每个单独的子句提取到自己的方法中。
1.) 正如 kyndigs 所说,少嵌套是一个好习惯。
2.) 另一个好建议是用括号括住运算符块,{ }
无论是否只有一个或多个被调用的方法。
3.) 总是尽量简化你的“if”语句。我的意思if (isTrue)
是比if (!(!isNotFalse))
我会这样写上面的代码:
if (x && y) {
doXY();
}
else if (x) {
doX();
}
else if (y) {
doY();
}
我认为第一个更好的可读性和良好的结构
您还可以执行以下操作:
switch (x + (y<<1))
{
case 1: doX(); break;
case 2: doY(); break;
case 3: doXY(); break;
}
免责声明:请注意,这既不是更快也不是更好的可读性,只是一种替代方案,在极少数情况下可能是可接受的解决方案。
DoXY 中的动作是否与动作 DoX() 和 DoY() 互斥?即:您可以像这样重新操作操作吗:
if (x) { DoX(); }
if (y) { DoY(); }
if (X && y) { DoXY(); }
甚至可能作为 DoXY() 的参数
if (X || y) { DoXY(x,y); }
但我可能会选择你的第一个可读性选项......