4

仕様パターンを実装しています。NotSpecification は、最初は単純に見えます。

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

ただし、すべての仕様で機能するわけではありません。

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

これは、true ではなく false を返す必要があります。これまでのところ、NotSpecification の isSpecialCaseOf を達成する唯一の方法は、remainingUnsatisfiedBy (仕様パターンに関する論文の部分的包含) を実装することだと思います。しかし、おそらく、これを不要にするもっと単純なものや論理的な洞察が欠けているのかもしれません。

質問:remainingUnsatisfiedBy を使用せずにこれを実装する別の方法はありますか?

4

1 に答える 1

3

これを Java で実装しようとしましたが、問題なく、remainingUnsatisfiedBy() も発生しませんでした。おそらく、実装に問題があると思われます。これが私のものです。

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

キャッチは Not() メソッドにあり、その引数の反対の型を正しく構築する必要があります。

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

次に必要なのは、すべての仕様に対して not() を正しく実装することだけです。

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

問題がある場合は、GreaterThan.isSpecialCaseOf と Not の実装を提供してください。私がお手伝いします。

于 2010-04-12T16:11:14.820 に答える