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() && //...
,因为它确实看起来这是你打算写什么。如果情况并非如此,那么第一个条件将需要分开处理。
使用'else if's去除重复检查并分解函数调用,只存储ifs中的百分比。 – miniBill
嗯,我起初是这么做的,但是我们的教授告诉我们只用'if if'来重构'else if' – flower
这种感觉不对......任何理由呢? – miniBill