4 Stimmen

gute Möglichkeit zur Implementierung von NotSpecification: isSpecialCaseOf?

Ich implementiere das Spezifikationsmuster. Die NotSpecification scheint auf den ersten Blick einfach:

NotSpecification.IsSpecialCaseOf(otherSpecification)
    return !this.specification.isSpecialCaseOf(otherSpecification)

Aber es funktioniert nicht für alle Spezifikationen:

Not(LesserThan(4)).IsSpecialCaseOf(Equals(5))

Dies sollte false anstelle von true zurückgeben. Bisher denke ich, dass die einzige Möglichkeit, den isSpecialCaseOf the NotSpecification zu erreichen, darin besteht, das remainderUnsatisfiedBy zu implementieren (partielle Subsumtion im Paper on the specification pattern). Aber vielleicht übersehe ich etwas Einfacheres oder eine logische Einsicht, die dies unnötig macht.

Frage: Gibt es eine andere Möglichkeit, dies zu implementieren, indem man nicht remainderUnsatisfiedBy verwendet?

3voto

Gabriel Ščerbák Punkte 17544

Ich habe versucht, dies in Java zu implementieren und es ging ohne Probleme und remainderUnsatisfiedBy(). Wahrscheinlich haben Sie einige Probleme in Ihrer Implementierung, hier ist meine:

public boolean isSpecialCaseOf(Specification spec) {
    if (spec instanceof GreaterThan) {
        return ((GreaterThan) spec).boundary > this.boundary;
    }
    return false;
}

Der Haken an der Sache ist die Not()-Methode, die den entgegengesetzten Typ ihres Arguments korrekt konstruieren sollte.

static final Specification Not(Specification spec) {
    return spec.not();
}

Dann brauche ich nur noch eine korrekte Implementierung von not() für jede Spezifikation, z. B. für LesserThan:

    @Override
public Specification not() {
    return new GreaterThan(boundary);
}

Wenn Sie Probleme haben, geben Sie bitte Ihre Implementierung von GreatherThan.isSpecialCaseOf und Not an, dann werde ich versuchen zu helfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X