Bon modèle de conception pour l'exécution d'un processus sur une collecte de données?
-
19-09-2019 - |
Question
Best expliqué avec le code, je pense, cela est juste un exemple simple:
public class MyPOJO {
public String name;
public int age;
public MyPOJO(String name, int age) {
this.name = name;
this.age = age;
}
}
public class MyProcessor {
public List<MyPOJO> process(List<MyPOJO> mypojos) {
List<MyPOJO> temp = new ArrayList<MyPOJO>;
for (int i=0; i <moypojos.size(); i++) {
if (filterOne(mypojos[i])) continue;
if (filterTwo(mypojos[i])) continue;
if (filterThree(mypojos[i])) continue;
temp.add(mypojos[i];
}
}
public boolean filterOne(MyPOJO mypojo) {
// in practice filters aren't so basic
return (mypojo.age < 21);
}
// assume implementations for the other filter methods
}
Yikes qui est laid. Fondamentalement, j'ai une collection et je voudrais passer à travers un tamis de toutes sortes de poursuivre seulement le traitement des objets qui répondent à certains critères. Je suppose qu'il ya une meilleure forme pour ce qu'un tas de méthodes qui renvoient booléens.
La solution
Vous pouvez avoir la liste des IFilters
.
comme si
boolean filtersResult = false;
for (IFilter filter : filters) {
filterResult = filter.process(mypojos[i])
if (filterResult)
break;
}
Autres conseils
Vous pouvez mettre en œuvre vos filtres tels qu'ils prennent une collection, et retourner une collection filtrée:
public interface IFilter<E> {
public Collection<E> filter(Collection<E> input);
}
De cette façon, vous pouvez enchaîner les filtres ensemble très trivialement. L'inconvénient est que pour les grandes collections, il est plus lent et prend plus de place; mais le code est beaucoup plus lisible.
Pourquoi ne pas utiliser Bean-Query ? il peut rendre votre code lisible.
List<MyPOJO> result=selectBean(MyPOJO.class).where(
not(
anyOf(
value("aga",lessThan(21)),
value("age",greaterThan(50))
)
)
.executeFrom(myPojos).