Filtrelerin herhangi bir parametre alıp almadığını söylemediniz. Örneğin, filter_A
bir kategori filtresi olabilir, bu yüzden bu sadece "başvurmam gerekiyor mu" sorusu değil, " Tüm kategorileri = = = alanıyla birlikte tüm kayıtları filter_A
uygulamam filter_A
ve geri göndermem gerekiyor" sorusu olabilir fooCategory
.
Tam olarak tanımladığınız şeyi uygulamanın en basit yolu (ancak aşağıdaki cevabın ikinci yarısını okuduğunuzdan emin olun) diğer cevaplara benzer, ancak herhangi bir boolean kontrolüm olmazdı. Ben arabirimleri tanımlarsınız: FilterA, FilterB, FilterC
. Sonra bir şey olabilir (Ben bir Java programcısıyım, bu yüzden bu Java-esque sözdizimi olacak):
class RequestFilters {
FilterA filterA;
FilterB filterB;
FilterC filterC;
}
O zaman böyle bir şey (kullanarak olabilir enum Tekli yöntemin gelen Etkili Java ):
enum NoOpFilterA implements FilterA {
INSTANCE;
public List<Item> applyFilter(List<Item> input) {
return input;
}
}
Ancak, bazı öğelerin gerçekten filtrelenmesini istiyorsanız bunun yerine bir FilterA
şey yapan bir uygulamanın örneğini sağlayabilirsiniz . Filtrasyon yönteminiz çok basit olacak
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;
}
Ama daha yeni başlıyorum.
applyFilter
Çağrının aslında her üç filtre türü için de oldukça benzer olacağından şüpheleniyorum . Eğer durum buysa, yukarıda anlatıldığı gibi yapmam bile. Sadece bir arayüze sahip ve daha sonra bunu yaparak daha temiz bir kod elde edebilirsiniz:
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;
}
}
Ardından, kullanıcınız sayfalarda gezinirken, uygun olduğunda ihtiyacınız olan her filtre için yeni bir örnek eklersiniz. Bu, ileride bu davranışa ihtiyaç duymanız durumunda aynı filtrenin birden fazla örneğini farklı bağımsız değişkenlerle uygulayabilmenizi ve ayrıca tasarımınızı değiştirmek zorunda kalmadan gelecekte ek filtreler eklemenizi sağlar .
Ayrıca, NoOpFilter
yukarıdaki gibi bir şey ekleyebilir veya kodunuz için daha kolay ne olursa olsun listeye belirli bir filtre ekleyemezsiniz.