If statement 更好的方法来构建一个;如果;陈述

If statement 更好的方法来构建一个;如果;陈述,if-statement,code-readability,If Statement,Code Readability,以下哪项是构造Ifstations嵌套的更好方法 if (x && y) doXY(); else if (x) doX(); else if (y) doY(); (或) 第一个巢穴较少,所以我可以这么说 在第二个示例中,您将评估“x”是否为真,然后进入该块并评估“y”是否为真,通常最好尽可能少地嵌套代码 if (x && y) { // doXY } else if (x) { // doX } else { // doY

以下哪项是构造
If
stations嵌套的更好方法

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


第一个巢穴较少,所以我可以这么说

在第二个示例中,您将评估“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();

我预先声明,这是效率较低的,但其程度如此之小,根本不重要。从可读性和可维护性的角度来看,在某些情况下可能更好,因为这些条款都不依赖于其他任何条款,也不要求按照指定的顺序执行。如果需要,可以将每个单独的子句提取到自己的方法中

DoXY中的操作与DoX()和DoY()中的操作是否相互排斥?Ie:你能把这些动作重新设计成这样吗:

if (x) { DoX(); }
if (y) { DoY(); }
if (X && y) { DoXY(); }
甚至可能作为DoXY()的参数


但我可能会选择您的第一个可读性选项…

您还可以执行以下操作:

switch (x + (y<<1))
{
   case 1: doX();  break;
   case 2: doY();  break;
   case 3: doXY(); break;
}
switch(x+(y1。)正如肯迪希斯所说,减少嵌套是一个很好的做法

2.)另一个好建议是用括号括住操作符块
{}
,无论调用的方法是一个还是多个

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

我将以这种方式编写上面的代码:

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

这真的取决于情况(例如,哪一个在阅读时看起来更自然)。doXY()是否碰巧阅读了{doX();doY()}?如果是这样,你只需要两种情况…@atk:不,它们处理完全不同的功能。你在说什么语言?您在一种语言中的最佳解决方案可能不是在另一种语言中的最佳解决方案。@Unode:从可读性和可扩展性的角度来看,我正在寻找一种与语言无关的解决方案。第二个和第三个if语句中有冗余检查。如果它被重写为:If(x)doX()和If(y)doY()。它可以获得相同的结果,而不需要冗余的check@Woot4Moo:一般来说,我讨厌将逻辑运算符用作“if”语句。我想很多人都有这种感觉。其他的应该是做一些与众不同的事情。如果捕捉到(y),则应该还有第三个
switch (x + (y<<1))
{
   case 1: doX();  break;
   case 2: doY();  break;
   case 3: doXY(); break;
}
if (x && y) {
   doXY();
}
else if (x) {
   doX();
}
else if (y) {
   doY();
}