如何提高具有许多 if 语句的方法的可读性和长度?

2022-09-01 13:30:04

我有一个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");
    }
}

我可以将 if 更改为开关:

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例还是那么长。如何提高该方法的可读性和长度?在这种情况下,哪种模式是最好的?


答案 1

创建一个将国家/地区名称映射到其相应税率的函数: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");
    }
}

答案 2

将数据放在 XML 文件或数据库中,然后使用它来填充字典。这样,您可以轻松更改数据,并将数据与应用程序逻辑分开。或者,只需在方法中执行 SQL 查询。


推荐