微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

干净的代码 - 使用一个或多个具有特定规则的过滤器搜索端点:如何避免多个“ifs”?

如何解决干净的代码 - 使用一个或多个具有特定规则的过滤器搜索端点:如何避免多个“ifs”?

如果您正在开发一个可以有一个或多个过滤器的搜索端点,并且有用于组合这些过滤器的特定规则,那么如何避免使用多个“ifs”?

private void addCriteria(ProductFilter filter,Query query) {
//user does not fill anything,throws exception

        if (ObjectUtils.isEmpty(filter.getIds()) && !validateComboFilters(filter)) {
            throw new requiredFilterException();
        }

//user does not fill id filter but fills other filters

        if (ObjectUtils.isEmpty(filter.getIds()) && validateComboFilters(filter)) {

            query.addCriteria(Criteria.where(Constants.CREATED_AT)
                    .gte(filter.getFromDate())
                    .lte(filter.getToDate()));

            query.addCriteria(Criteria.where(Constants.STATUS).in(filter.getStatus()));
        }

//user fills id filter and one or more other filters

        if (ObjectUtils.isNotEmpty(filter.getIds())) {

            query.addCriteria(Criteria.where(Constants.ID)
                    .is(filter.getIds()));

            if (filter.filterByRangeDate()) {
                query.addCriteria(Criteria.where(Constants.CREATED_AT)
                        .gte(filter.getFromDate())
                        .lte(filter.getToDate()));
            }
            if (filter.filterByStatus()) {
                query.addCriteria(Criteria.where(Constants.STATUS).in(filter.getStatus()));
            }
        }
    }

解决方法

它可能看起来像这样。我没有检查编译,但我认为一般方法或多或少是正确的。

private static final BiFunction<ProductFilter,Query,Boolean> ADD_CRITERIA_IDS = (filter,query) -> {
    boolean res = ObjectUtils.isNotEmpty(filter.getIds());
    if (res)
        query.addCriteria(Criteria.where(Constants.ID).is(filter.getIds()));
    return res;
};

private static final BiFunction<ProductFilter,Boolean> ADD_CRITERIA_STATUS = (filter,query) -> {
    boolean res = filter.filterByStatus();
    if (res)
        query.addCriteria(Criteria.where(Constants.STATUS).in(filter.getStatus()));
    return res;
};

private static final BiFunction<ProductFilter,Boolean> ADD_CRITERIA_DATE_RANGE = (filter,query) -> {
    boolean res = filter.filterByRangeDate();
    if (res)
        query.addCriteria(Criteria.where(Constants.CREATED_AT)
                                  .gte(filter.getFromDate())
                                  .lte(filter.getToDate()));
    return res;
};

private void addCriteria(ProductFilter filter,Query query) {
    boolean added = ADD_CRITERIA_IDS.apply(filter,query);
    added |= ADD_CRITERIA_STATUS.apply(filter,query);
    added |= ADD_CRITERIA_DATE_RANGE.apply(filter,query);

    if (!added)
        throw new RequiredFilterException();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?