4

Я реализую шаблон спецификации. NotSpecification кажется простым на первый:хороший способ реализовать NotSpecification: isSpecialCaseOf?

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

Но это не работает для всех Технические характеристики:

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

Это должно возвращать ложь вместо истины. До сих пор я считаю, что единственный способ выполнить isSpecialCaseOf NotSpecification - реализовать оставшуюся частьUnsatisfiedBy (частичное подчинение в документе по шаблону спецификации). Но, возможно, мне не хватает чего-то более простого или логичного понимания, которое делает это ненужным.

Вопрос: Есть ли другой способ реализации этого, не используя остаток? Неудовлетворительно?

+0

Что должно делать «IsSpecialCaseOf()»? –

+0

@gabriel: isSpecialCaseOf по существу определяет, является ли спецификация более ограничительной, чем другая (чем больше 5, более ограничительная, чем более 2). «Спецификация B является частным случаем Спецификации A тогда и только тогда, когда для любого возможного объекта-кандидата X, где A удовлетворяет X, B всегда будет удовлетворять также X». – koen

ответ

3

Я попытался реализовать это на Java, и он прошел без проблем и остался неудовлетвореннымBy(). Возможно, у вас есть какие-то проблемы в вашей реализации, вот мое:

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

Загвоздка в методе Not(), который должен правильно построить противоположный тип аргумента.

Тогда все, что мне нужно, это правильная реализация not() для каждой спецификации, например. для LesserThan:

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

Если у вас есть какие-либо проблемы, пожалуйста, укажите Ваш реализацию GreatherThan.isSpecialCaseOf и нет, я постараюсь помочь.

+0

Сравнение между GreaterThan/LesserThan/Equals работает как ожидалось. Это не проблема. Проблема заключается в NotSpecification.isSpecialCaseOf. Какова ваша реализация этого и как она решает проблему, о которой я говорил выше? – koen

+0

Я использую трюк, у меня нет NotSpecification, вместо этого я определил в абстрактном классе спецификаций статический метод Not(), который возвращает spec.not() для данной Спецификации. Чем меньше в LesserThan. Я просто возвращаю GreaterThan с той же границей, и он работает. Поэтому вместо определения allmighty NotSpecification у меня есть каждый тип спецификации, чтобы знать, как свести себя на нет. –

+0

Если все еще неясно, я могу отправить вам полный источник. –