我有195个ifs的方法。这是一个简短的版本:
private BigDecimal calculateTax(String country, BigDecimal amount) throws Exception {
if(country.equals("POLAND")){
return new BigDecimal(0.23).multiply(amount);
}
else if(country.equals("AUSTRIA")) {
return new BigDecimal(0.20).multiply(amount);
}
else if(country.equals("CYPRUS")) {
return new BigDecimal(0.19).multiply(amount);
}
else {
throw new Exception("Country not supported");
}
}
我可以将ifs更改为switch:
private BigDecimal calculateTax(String country, BigDecimal amount) throws Exception {
switch (country) {
case "POLAND":
return new BigDecimal(0.23).multiply(amount);
case "AUSTRIA":
return new BigDecimal(0.20).multiply(amount);
case "CYPRUS":
return new BigDecimal(0.19).multiply(amount);
default:
throw new Exception("Country not supported");
}
}
但是195例仍然很长。如何改善该方法的可读性和长度?在这种情况下哪种模式最好?
创建一个Map<String,Double>
将国名映射到其相应税率的:
Map<String,Double> taxRates = new HashMap<> ();
taxRates.put("POLAND",0.23);
...
Map
如下使用:
private BigDecimal calculateTax(String country, BigDecimal amount) throws Exception {
if (taxRates.containsKey(country)) {
return new BigDecimal(taxRates.get(country)).multiply(amount);
} else {
throw new Exception("Country not supported");
}
}
这似乎不是抛出已检查异常的合理位置。我知道OP的代码可以做到这一点,但是我还是不想传播它。
@BenP。如果收到意外/不支持的输入,则抛出检查异常不会出现任何问题。我可能会使用一些自定义异常,而不是基础Exception类。
一个
IllegalArgumentException
应该很好,但是平原Exception
是不行的...您绝对不应该使用地图,它可以解决这个玩具问题,但是在将来的可扩展性方面确实受到限制(当您需要更多的情况,除税率之外还需要更多的有效载荷等)。这就是面向对象的目的。看我的回答。
Small nitpick:
Map.ofEntries()
可能比重复所有put
通话更好。较大的nitpick:仍然有太多的代码重复,恕我直言,其他一些注释者也很正确,可以将数据分解到文件或数据库中,并从中填充地图或直接查询数据源。中度:是的,别人怎么说例外。:)