2

我有一个 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,我感觉不太好。

4

3 回答 3

5
if (order.invoice != 1 && x > y) {
    DoSomething();
}
if (order.invoice == 1 || x > y) {       
   x = x + y;
}    
于 2013-10-03T04:16:25.477 回答
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; }
于 2013-10-03T04:16:52.007 回答
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

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

于 2013-10-03T04:41:07.967 回答