以下哪项是构建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();
答案 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)
答案 7 :(得分:0)
DoXY中的操作是否与Actions DoX()和DoY()互斥?即:你可以重新开始这样的行动:
if (x) { DoX(); }
if (y) { DoY(); }
if (X && y) { DoXY(); }
甚至可能是DoXY()的参数
if (X || y) { DoXY(x,y); }
但是我可能会选择第一个可读性选项......