2015-05-03 117 views
1

我需要一些帮助来重构这个if语句。我想过把百分比声明为常量。我也想做一个包含if方括号内的代码的方法。我还可以做些什么?重构if语句中的语句

if(totalReceiptsAmount >= getIncome() && totalReceiptsAmount < 0.20 * getIncome()) 
     setTaxIncrease(getBasicTax() + 0.05 * getBasicTax()); 
    if(totalReceiptsAmount >= 0.20 * getIncome() && totalReceiptsAmount < 0.40 * getIncome()) 
     setTaxIncrease(getBasicTax() - 0.05 * getBasicTax()); 
    if(totalReceiptsAmount >= 0.40 * getIncome() && totalReceiptsAmount < 0.60 * getIncome()) 
     setTaxIncrease(getBasicTax() - 0.10 * getBasicTax()); 
    if(totalReceiptsAmount >= 0.60 * getIncome()) 
     setTaxIncrease(getBasicTax() - 0.15 * getBasicTax()); 
+0

使用'else if's去除重复检查并分解函数调用,只存储ifs中的百分比。 – miniBill

+0

嗯,我起初是这么做的,但是我们的教授告诉我们只用'if if'来重构'else if' – flower

+0

这种感觉不对......任何理由呢? – miniBill

回答

2

在你的代码的主要问题是可能的代码的复制,这意味着如果你想例如,改变的情况下,你可能在所有四个条件采用同样的变化。因此,您可以尝试将常用功能分解出来,就像您对条件已经提出的那样。所以,你可以定义一个方法

private boolean receiptsAmountIsBetweenFactorOfXAndYOfIncome(double x, double y){ 
    return totalReceiptsAmount >= x * getIncome() && totalReceiptsAmount < y * getIncome(); 
} 

,并相应地更新您的if语句:

if(receiptsAmountIsBetweenFactorOfXAndYOfIncome(0, 0.2)) 
    setTaxIncrease(getBasicTax() + 0.05 * getBasicTax()); 
if(receiptsAmountIsBetweenFactorOfXAndYOfIncome(0.2, 0.4)) 
    setTaxIncrease(getBasicTax() - 0.05 * getBasicTax()); 
if(receiptsAmountIsBetweenFactorOfXAndYOfIncome(0.4, 0.6)) 
    setTaxIncrease(getBasicTax() - 0.10 * getBasicTax()); 
if(receiptsAmountIsBetweenFactorOfXAndYOfIncome(0.6, 1)) 
    setTaxIncrease(getBasicTax() - 0.15 * getBasicTax()); 

现在,仍然有重复的if语句的主体。再次

private void increaseTaxByFactorOfX(double x){ 
    setTaxIncrease(getBasicTax() + x * getBasicTax()); 
} 

和更新的if语句:所以,你可以引入其他方法

if(receiptsAmountIsBetweenFactorOfXAndYOfIncome(0, 0.2)) 
    increaseTaxByFactorOfX(0.05); 
if(receiptsAmountIsBetweenFactorOfXAndYOfIncome(0.2, 0.4)) 
    increaseTaxByFactorOfX(-0.05); 
if(receiptsAmountIsBetweenFactorOfXAndYOfIncome(0.4, 0.6)) 
    increaseTaxByFactorOfX(-0.10); 
if(receiptsAmountIsBetweenFactorOfXAndYOfIncome(0.6, 1)) 
    increaseTaxByFactorOfX(-0.15); 

现在,如果你愿意,你可以在使用numericals检测模式,或只需硬编码数组或列表中的数字,并使用循环代替多个类似的if语句:

double[] factorOfIncome = {0, 0.2, 0.4, 0.6, 1}; 
double[] taxIncreaseFactor = {0.05, -0.05, -0.10, -0.15}; 

for(int i = 0; i<taxIncreaseFactor.length; i++) 
    if(receiptsAmountIsBetweenFactorOfXAndYOfIncome(factorOfIncome[i], factorOfIncome[i+1])) 
     increaseTaxByFactorOfX(taxIncreaseFactor[i]); 

This la st重构步骤完全摆脱了重复,但在我看来使代码有点不太可以理解。

编辑:注意,我认为第一个条件应该是

if(totalReceiptsAmount >= 0 * getIncome() && //... 

,因为它确实看起来这是你打算写什么。如果情况并非如此,那么第一个条件将需要分开处理。