避免多个if语句的最简洁方法 - 对象创建依赖于许多参数

时间:2016-02-08 16:38:04

标签: java oop if-statement design-patterns

我正在寻找最简洁的方法来确定价值而不使用多个if语句(或switch-case)。

例如,我有以下映射表: enter image description here

如您所见,我需要先考虑5个变量,然后才能确定确切的值。

使用if语句会导致嵌入ifs的噩梦。

我有两个解决方案:

非常脏 - 地图等地图的地图:

Map<String, Map<String, Map<String,...>>> myMappings;

涉及大量代码:带有子工厂的工厂导致最终值 - 实际上这对于可读性来说更好,但这仍然是封装在类中的if语句。

你有什么想法?

2 个答案:

答案 0 :(得分:3)

您可以通过引入复合键来解决此问题。只需将所有字段添加到其中,即可正确覆盖add_action( 'pre_get_posts', function ( $q ) { if ( !is_admin() // Only targets the front end && $q->is_main_query() // Only targets the main query && $q->is_tax( 'product-category' ) // Only targets the product-category tax pages ) { $q->set( 'orderby', 'rand' ); } }); hashCode。之后,您可以从某种equals中获取并获取必要的值。 作为一个注册,并不是所有领域都包括在内,最好提出一个更有意义的名字:

Map<CompositeKey, TaxCode>

那么你可以:

public class CompositeKey {

private final int companyNumber;
private final String sweepType;
private final int vatRate;

public CompositeKey(int companyNumber, String sweepType, int vatRate) {
    this.companyNumber = companyNumber;
    this.sweepType = sweepType;
    this.vatRate = vatRate;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    CompositeKey that = (CompositeKey) o;

    if (companyNumber != that.companyNumber) return false;
    if (vatRate != that.vatRate) return false;
    return Objects.equals(this.sweepType, that.sweepType);

}

@Override
public int hashCode() {
    int result = companyNumber;
    result = 31 * result + (sweepType != null ? sweepType.hashCode() : 0);
    result = 31 * result + vatRate;
    return result;
}
}

答案 1 :(得分:3)

就个人而言,我宁愿将所有这些值保存在表中,只考虑使用简单的SQL查询可以获得的最终值。您可以选择其他选项,但是您应该始终将这些映射保留在外部源(表,属性文件...)中,如果需求发生变化,您可以修改这些选项。