フィルターがパラメーターを受け取るかどうかについては言及していません。たとえばfilter_A
、カテゴリフィルタの場合、「適用する必要がある」という質問だけでなく、「カテゴリフィールド=ですべてのレコードfilter_A
を適用filter_A
して返す必要がある」などの問題もありますfooCategory
。
説明したとおりに実装する最も簡単な方法(ただし、以下の回答の後半を必ず読んでください)は他の回答と似ていますが、ブールチェックはまったくありません。インターフェイスを定義しますFilterA, FilterB, FilterC
。次に、次のようなものを作成できます(私はJavaプログラマーなので、これはJava風の構文になります)。
class RequestFilters {
FilterA filterA;
FilterB filterB;
FilterC filterC;
}
次に、このようなものを持つことができます(を使用して 列挙シングルトンパターンから効果的なJavaの):
enum NoOpFilterA implements FilterA {
INSTANCE;
public List<Item> applyFilter(List<Item> input) {
return input;
}
}
しかし、実際にいくつかのアイテムをフィルタリングしたい場合は、代わりFilterA
に実際に何かを実行する実装のインスタンスを提供できます。あなたのろ過方法は非常に簡単になります
List<Item> filterItems(List<Item> data, RequestFilters filters) {
List<Item> returnedList = data;
returnedList = filters.filterA.filter(data);
returnedList = filters.filterB.filter(data);
returnedList = filters.filterC.filter(data);
return returnedList;
}
しかし、私はまだ始まったばかりです。
applyFilter
呼び出しは、実際には3種類のフィルターすべてで非常に似ていると思われます。その場合、私は上記の方法でそれをしません。インターフェースを1つだけにして、次のようにすることで、よりクリーンなコードを取得できます。
class ChainedFilter implements Filter {
List<Filter> filterList;
void addFilter(Filter filter) {
filterList.add(filter);
}
List<Item> applyFilter(List<Item> input) {
List<Item> returnedList = input;
for(Filter f : filterList) {
returnedList = f.applyFilter(returnedList);
}
return returnedList;
}
}
次に、ユーザーがページ間を移動するときに、必要に応じて必要なフィルターの新しいインスタンスを追加します。これにより、将来その動作が必要になった場合に異なる引数で同じフィルターの複数のインスタンスを適用できるようになり、将来的にフィルターを追加することもできます、デザインを変更することなくます。
さらに、NoOpFilter
上記のようなものを追加することも、コードに簡単なものであれば、特定のフィルターをリストにまったく追加することもできません。