代码中的主要问题可能是代码重复 ,这意味着如果要更改条件(例如条件),则可能必须在所有四个条件中应用相同的更改。 因此,您可以尝试排除常见功能,如您已为条件句建议的那样。 所以你可以定义一个方法
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);
现在,如果需要,您可以检测使用的数字中的模式,或者简单地对数组或列表中的数字进行硬编码,然后使用循环而不是多个类似的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
if(receiptsAmountIsBetweenFactorOfXAndYOfIncome(factorOfIncome[i], factorOfIncome[i+1]))
increaseTaxByFactorOfX(taxIncreaseFactor[i]);
最后的重构步骤完全摆脱了重复,但是在我看来,代码变得不太容易理解。
编辑:请注意,我认为第一个条件应该是
if(totalReceiptsAmount >= 0 * getIncome() && //...
因为看起来确实是您要编写的。 如果不是这种情况,则需要单独处理第一个条件。