在我的Android应用程序中,我有两种类型的过滤器:搜索过滤器和排序过滤器。
我需要从视图中读取过滤器,在视图上显示过滤器,并将它们保存在内存中。我应该将这些所需的特性包含到一个类中,以帮助自己在将来添加新的过滤器。我也需要除以过滤器的类型。
我的应用程序中的过滤器通过以下方式表示:
Comparator<T>接口(用于排序过滤器)SearchCriterion<T>接口(用于搜索过滤器)公共接口SearchCriterion {布尔型meetCriterion(T );}为了做一些需要的事情,我写了一个interface:
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子类示例:
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));
}
}为了将过滤器的类型除以类型,我编写了以下类:
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);
}
}但在我看来,Filter和Filters是这些非常不同的接口的混淆名称。
发布于 2014-01-22 12:47:03
您以前已经给出了类似的代码,虽然我的一些建议已经实现,但其他的建议没有.这很好,想必你有自己的理由,但最突出的是public void includeInIfNeed(Filters filters)方法,它是多余的.
至于命名,我有几个建议:
Filter是它的好名字。没必要改变。SearchFilterByDiscountType不进行搜索,而是用于搜索。我使用的惯例是类/实现的专门化应该(通常)使用基类作为后缀。因此,在这里,Filter应该走到最后,成为DiscountTypeFilter。这在某种程度上是标准的,比如List、ArrayList、LinkedList等等。Filters不是一个完全不好的名字,我同意它可能会更好,但是如果这是“生产”代码,我可能不会更改它,因为更改日志中的混乱是不值得的。另一方面,它很简单,现在可以改变,我有许多后缀我使用.Set,List,Array,Chain,Pack,Group和其他一些我现在忘了的东西。我使用的后缀最接近于表示集合中数据的结构和数据访问机制。在这种情况下,我可能会使用FilterChain。我还有另外两项建议:
Filters实际上不是可序列化的,那么为什么声明它是可序列化的?Filters (FilterChain?)类还实现了Filter接口,它允许您以批处理的方式应用过滤器。https://codereview.stackexchange.com/questions/39786
复制相似问题