首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索过滤器和排序过滤器

搜索过滤器和排序过滤器
EN

Code Review用户
提问于 2014-01-22 07:47:59
回答 1查看 158关注 0票数 3

在我的Android应用程序中,我有两种类型的过滤器:搜索过滤器和排序过滤器。

我需要从视图中读取过滤器,在视图上显示过滤器,并将它们保存在内存中。我应该将这些所需的特性包含到一个类中,以帮助自己在将来添加新的过滤器。我也需要除以过滤器的类型。

我的应用程序中的过滤器通过以下方式表示:

  • 来自Java的Comparator<T>接口(用于排序过滤器)
  • SearchCriterion<T>接口(用于搜索过滤器)公共接口SearchCriterion {布尔型meetCriterion(T );}

为了做一些需要的事情,我写了一个interface

代码语言:javascript
复制
public interface Filter {
    void readFrom(View view);
    void displayOn(View view);
    void restoreFrom(SharedPreferences sharedPreferences);
    void saveInto(SharedPreferences.Editor editor);
    void includeInIfNeed(Filters filters);
}

Filter子类示例:

代码语言:javascript
复制
class SearchFilterByDiscountType implements Filter {

    private static class KeysOfDiscountTypes {
        public static final String BONUS = getClassName() + "Bonus";
        public static final String DISCOUNT = getClassName() + "Discount";
        public static final String CASH_BACK = getClassName() + "Cash Back";
    }

    private static String getClassName() {
        return SearchFilterDiscountType.class.getSimpleName();
    }

    private static final boolean DEFAULT_BONUS = true;
    private static final boolean DEFAULT_DISCOUNT = true;
    private static final boolean DEFAULT_CASH_BACK = true;

    private boolean bonus;
    private boolean discount;
    private boolean cashBack;

    public SearchFilterDiscountType() {
        bonus = DEFAULT_BONUS;
        discount = DEFAULT_DISCOUNT;
        cashBack = DEFAULT_CASH_BACK;
    }

    @Override
    public void readFrom(View view) {
        bonus = findCheckBox(view, R.id.bonusCheckBox).isChecked();
        discount = findCheckBox(view, R.id.discountCheckBox).isChecked();
        cashBack = findCheckBox(view, R.id.cashBackCheckBox).isChecked();
    }

    @Override
    public void displayOn(View view) {
        findCheckBox(view, R.id.bonusCheckBox).setChecked(bonus);
        findCheckBox(view, R.id.discountCheckBox).setChecked(discount);
        findCheckBox(view, R.id.cashBackCheckBox).setChecked(cashBack);
    }

    private CheckBox findCheckBox(View view, int idOfCheckBox) {
        return (CheckBox) view.findViewById(idOfCheckBox);
    }

    @Override
    public void restoreFrom(SharedPreferences sharedPreferences) {
        bonus = sharedPreferences.getBoolean(KeysOfDiscountTypes.BONUS, DEFAULT_BONUS);
        discount = sharedPreferences.getBoolean(KeysOfDiscountTypes.DISCOUNT, DEFAULT_DISCOUNT);
        cashBack = sharedPreferences.getBoolean(KeysOfDiscountTypes.CASH_BACK, DEFAULT_CASH_BACK);
    }

    @Override
    public void saveInto(SharedPreferences.Editor editor) {
        editor.putBoolean(KeysOfDiscountTypes.BONUS, bonus);
        editor.putBoolean(KeysOfDiscountTypes.DISCOUNT, discount);
        editor.putBoolean(KeysOfDiscountTypes.CASH_BACK, cashBack);
    }

    @Override
    public void includeInIfNeed(Filters filters) {
        filters.add(new DiscountTypeSearchCriterion(bonus, discount, cashBack));
    }
}

为了将过滤器的类型除以类型,我编写了以下类:

代码语言:javascript
复制
public class Filters implements Serializable {
    public final List<SearchableListing.SearchCriterion<PartnerPoint>> searchCriteria;
    public final List<Comparator<PartnerPoint>> comparators;

    public static Filters from(List<Filter> filters) {
        Filters result = new Filters();
        for (Filter filter : filters) {
            filter.includeInIfNeed(result);
        }
        return result;
    }

    public Filters() {
        searchCriteria = new ArrayList<SearchableListing.SearchCriterion<PartnerPoint>>();
        comparators = new ArrayList<Comparator<PartnerPoint>>();
    }

    public void add(SearchableListing.SearchCriterion<PartnerPoint> searchCriterion) {
        searchCriteria.add(searchCriterion);
    }

    public void add(Comparator<PartnerPoint> comparator) {
        comparators.add(comparator);
    }

    public void add(Filters other) {
        searchCriteria.addAll(other.searchCriteria);
        comparators.addAll(other.comparators);
    }
}

但在我看来,FilterFilters是这些非常不同的接口的混淆名称。

EN

回答 1

Code Review用户

回答已采纳

发布于 2014-01-22 12:47:03

您以前已经给出了类似的代码,虽然我的一些建议已经实现,但其他的建议没有.这很好,想必你有自己的理由,但最突出的是public void includeInIfNeed(Filters filters)方法,它是多余的.

至于命名,我有几个建议:

  • Filter是它的好名字。没必要改变。
  • SearchFilterByDiscountType不进行搜索,而是用于搜索。我使用的惯例是类/实现的专门化应该(通常)使用基类作为后缀。因此,在这里,Filter应该走到最后,成为DiscountTypeFilter。这在某种程度上是标准的,比如ListArrayListLinkedList等等。
  • Filters不是一个完全不好的名字,我同意它可能会更好,但是如果这是“生产”代码,我可能不会更改它,因为更改日志中的混乱是不值得的。另一方面,它很简单,现在可以改变,我有许多后缀我使用.SetListArrayChainPackGroup和其他一些我现在忘了的东西。我使用的后缀最接近于表示集合中数据的结构和数据访问机制。在这种情况下,我可能会使用FilterChain

我还有另外两项建议:

  • Filters实际上不是可序列化的,那么为什么声明它是可序列化的?
  • 如果Filters (FilterChain?)类还实现了Filter接口,它允许您以批处理的方式应用过滤器。
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/39786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档