2010-04-07 25 views
4

J'implémente le modèle de spécification. Le NotSpecification semble simple au premier abord:bonne façon d'implémenter NotSpecification: isSpecialCaseOf?

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

Mais cela ne fonctionne pas pour toutes les spécifications:

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

Cela devrait retourner false au lieu de vrai. Jusqu'à présent, je pense que la seule façon d'accomplir isSpecialCaseOf NotSpecification est d'implémenter le restedernsatisfiedBy (subsomption partielle dans l'article sur le modèle de spécification). Mais peut-être qu'il me manque quelque chose de plus simple ou un aperçu logique qui rend cela inutile. Question: Existe-t-il une autre façon de mettre en œuvre ceci en n'utilisant pas remainderUnsatisfiedBy?

+0

Que devrait faire exactement "IsSpecialCaseOf()"? –

+0

@gabriel: isSpecialCaseOf détermine essentiellement si une spécification est plus restrictive qu'une autre (car supérieur à 5 est plus restrictif que supérieur à 2). "La spécification B est un cas particulier de la spécification A si et seulement si pour tout objet candidat possible X, où A est satisfait par X, B sera toujours satisfait par X également." – koen

Répondre

3

J'ai essayé de l'implémenter en Java et ça s'est passé sans problème et restederuUnsatisfiedBy(). Vous avez probablement un problème dans votre mise en œuvre, voici le mien est:

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

Le hic est dans la méthode Non(), qui devrait construire correctement le type opposé de son argument. Ensuite, tout ce dont j'ai besoin est d'avoir une implémentation correcte de not() pour toutes les spécifications, par ex. pour LesserThan:

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

Si vous avez des problèmes, s'il vous plaît fournir votre implémentation de GreatherThan.isSpecialCaseOf et de ne pas, je vais essayer d'aider.

+0

Les comparaisons entre GreaterThan/LesserThan/Equals fonctionnent comme prévu. Ils ne sont pas le problème. Le problème est le NotSpecification.isSpecialCaseOf. Quelle est votre application de cela, et comment cela résout-il le problème que j'ai mentionné ci-dessus? – koen

+0

J'utilise un truc, je n'ai pas de NotSpecification, à la place j'ai défini dans la classe abstraite Specification une méthode statique Not(), qui retourne spec.not() pour la spécification donnée. Que dans LesserThan.not je retourne simplement GreaterThan avec la même limite et cela fonctionne. Donc, au lieu de définir tout Notspecification puissant, j'ai tous les types de spécifications pour savoir comment se neutraliser. –

+0

Si ce n'est toujours pas clair, je peux vous envoyer la source complète. –