重新考虑if和else之间的公共代码if

时间:2013-10-03 04:03:51

标签: c# c#-4.0

我有一个if ... else if语句如下:

  If(x > y && order.invoice != 1)
    {
       DoSomething();
       x = x + y;
    }
     else if(order.invoice == 1)
     {
       x = x + y;
     } 

有没有更好的方法来重新考虑这一点。在if和else if中,我感觉不太好x = x + y。

3 个答案:

答案 0 :(得分:5)

if (order.invoice != 1 && x > y) {
    DoSomething();
}
if (order.invoice == 1 || x > y) {       
   x = x + y;
}    

答案 1 :(得分:0)

您可以执行两次分配,也可以执行两次if语句。这个计算很简单,我不担心。

尽管如此,它可以缩短:

if(x > y && order.invoice != 1)
    {
       DoSomething();
       x += y;
    }
     else if(order.invoice == 1)
     {
       x += y;
     } 

另一个选择可能是使用标志来查看是否增加,但是在复杂性和单次调用与简单和半冗余代码之间仍然存在相同的拉锯战。

bool increment = false;

if(x > y && order.invoice != 1)
    {
       DoSomething();
       increment = true;
    }
     else if(order.invoice == 1)
     {
       increment = true
     } 

if (increment) { x += y; }

答案 2 :(得分:0)

这是重构它的证据/系统方法。从:

开始
if (x > y && order.invoice != 1)
{
    DoSomething();
    x = x + y;
}
else if (order.invoice == 1)
{
    x = x + y;
} 

所以问题是,哪一组输入导致x = x + y?良好:

x = x + y
<=> (x > y && order.invoice != 1) ||
    (!(x > y && order.invoice != 1) && order.invoice == 1)
<=> (x > y && order.invoice != 1) ||
    ((x <= y || order.invoice == 1) && order.invoice == 1)
<=> (x > y && order.invoice != 1) ||
    ((x <= y && order.invoice == 1) || (order.invoice == 1 && order.invoice == 1)
<=> (x > y && order.invoice != 1) ||
    ((x <= y && order.invoice == 1) || order.invoice == 1)
<=> (x > y && order.invoice != 1) ||
    order.invoice == 1
<=> (x > y || order.invoice == 1) && (order.invoice != 1 || order.invoice == 1)
<=> (x > y || order.invoice == 1)

因此它相当于

if (x > y && order.invoice != 1)
{
    DoSomething();
}
if (x > y || order.invoice == 1)
{
    x = x + y;
}

您也可以使用真值表

x > y | order.invoice == 1  |   x = x + y
F     | F                   |   N
F     | T                   |   Y
T     | F                   |   Y
T     | T                   |   Y

再次给你

x = x + y
<=> !(x <= y && order.invoice != 1)
<=> x > y || order.invoice == 1

最后,我不同意这种重构,除非它实际上使代码更容易理解。 保存代码行并不意味着您使代码更具可读性(因此无法实现 显然更易于维护)