Cette question est une sorte de continuation à mon poste précédent: Visitor pattern implementation in java- How does this look?Modèle de stratégie composite - Java - Quelle est la gravité de ce code?
Je me suis un peu perdu en refacturant mon code. J'essaye de convertir mon modèle de visiteur (expliqué dans la publication précédente) dans un modèle de stratégie composé. Je suis en train de faire quelque chose comme ceci:
public interface Rule {
public List<ValidatonError> check(Validatable validatable);
}
Maintenant, je définirais une règle comme ceci:
public class ValidCountryRule {
public List<ValidationError> check(Validatable validatable) {
// invokeDAO and do something, if violation met
// add to a list of ValidationErrors.
// return the list.
}
}
Maintenant, je pourrais avoir deux objets différents types à valider. Ces deux pourraient être complètement différents: Dites que j'ai un magasin qui est Validatable
, puis un Schedule
qui est Validatable
. Maintenant, si j'écrirais un composite qui ressemblerait à ceci:
class Validator implements Rule {
private List<Rule> tests = new ArrayList<Rule>();
public void addRule(Rule rule) {
tests.add(rule);
}
public List<ValidationError> check(Visitable visitable) {
List<ValidationError> list = new ArrayList<ValidationError>();
for(Rule rule : tests) {
list.addAll(rule.check(visitable);
}
}
public Validator(ValidatorType type) {
this.tests = type.getRules();
}
}
Je définirais un enum
qui définit un ensemble de contrôles où aller ...
public Enum ValidatorType {
public abstract List<Rule> getRules();
STORE_VALIDATOR {
public List<Rule> getRules() {
List<Rule> rules = new ArrayList<Rule>();
rules.add(new ValidCountryRule());
rules.add(new ValidXYZRule());
}
// more validators
}
et enfin, je voudrais utiliser comme ceci:
Validator validator = new Validator(ValidatorType.STORE_VALIDATOR);
for (Store store : stores) {
validator.check(store);
}
J'ai un étrange sentiment que mon design est défectueux. Je n'aime pas l'idée que mon interface de règle attend un Validatable
. Pourriez-vous me suggérer comment je pourrais améliorer cela?
Appréciez votre aide.
Vous enfreignez toutes les règles de l'indentation. Si vous voulez que les autres regardent et vous aident avec quelque chose que votre code doit regarder un peu mieux.En ce moment, il a une horrible odeur de code. –
@Trevor Désolé à ce sujet, réparé maintenant. – Jay
L'indentation était encore un peu illisible. Je l'ai corrigé. – Eddie