Diese Frage ist eine Art Fortsetzung zu meinem früheren Beitrag: Visitor pattern implementation in java- How does this look?Zusammengesetzte Strategie Muster - Java - Wie schlimm ist dieser Code?
Ich habe ein wenig verwirrt, während ich meinen Code refactoring. Ich versuche, mein Besuchermuster (das im vorherigen Post erklärt wurde) in ein zusammengesetztes Strategie-Muster umzuwandeln. Ich versuche, so etwas zu tun:
public interface Rule {
public List<ValidatonError> check(Validatable validatable);
}
Jetzt habe ich eine Regel wie folgt definieren würde:
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.
}
}
Nun, ich zwei verschiedene Arten haben könnten Objekte validiert werden. Diese zwei könnten völlig unterschiedlich sein: Angenommen, ich habe einen Store, der Validatable
ist, und dann einen Schedule
, der Validatable
ist. Nun, wenn ich einen Verbund schreiben würde, die wie folgt aussehen:
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();
}
}
Ich würde definieren eine enum
das, was Reihe von Kontrollen definiert gehen, wo ...
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
}
und schließlich würde ich es ist wie folgt:
Validator validator = new Validator(ValidatorType.STORE_VALIDATOR);
for (Store store : stores) {
validator.check(store);
}
Ich habe ein seltsames Gefühl, dass mein Design fehlerhaft ist. Mir gefällt die Idee nicht, dass meine Regelschnittstelle eine Validatable
erwartet. Könnten Sie mir bitte vorschlagen, wie ich das verbessern würde?
Schätzen Sie Ihre Hilfe.
Sie brechen alle Regeln der Vertiefung. Wenn Sie möchten, dass andere etwas sehen und Ihnen bei etwas helfen, muss Ihr Code etwas besser aussehen.Gerade jetzt hat es schrecklichen Code Geruch. –
@Trevor Entschuldigung, habe es jetzt behoben. – Jay
Der Eindruck war immer noch etwas unlesbar. Ich habe es repariert. – Eddie