返回“假”'方法的有效后置条件?

时间:2014-05-14 11:12:05

标签: java oop design-by-contract

我最近一直在学习关于后置条件,先决条件和合同的设计,但我还没有找到这个问题的确切答案。

对我而言,后置条件似乎基本上是“被调用后该方法意味着什么”。

这是一个例子

//If x is not equal to y, do something with x and return true. Otherwise, return false.

public boolean example(int x)
{
    if(x != y)
    {
        return true;
        //do something with x.
    }
    else
    {
            return false;
    }
}

当说明这种方法的后置条件时,是否有理由说它返回'false'就是其中之一?或者后置条件只是用x做了什么?

编辑:

这是一个更好的例子,具有实际的前提条件 -

public boolean example2(Example x)
{
    if (x == a)
    {
        throw new IllegalArgumentException("x must not be the same as a");
    }

    if(x != y)
    {
        return true;
        //do something with x.
    }
    else
    {
            return false;
    }
}

2 个答案:

答案 0 :(得分:1)

您未在example方法中提供任何先决条件或后置条件。你提供的是一个类不变量。

在检查后置条件之前,在方法中检查前置条件。通常情况下,这是通过assert为后置条件完成的。

  

后置条件说明方法在被调用时确保的内容   实现其先决条件。如果违反了后置条件   前提条件成立,方法(供应商)打破了   合同(实施错误)。换句话说,后置条件是一个   对客户的权利和对供应商的义务。

引用来源:https://c4j-team.github.io/C4J/examples_postcondition.html

您通常不会返回truefalse。后置条件由断言处理。关于此的Oracle页面提供了良好的examples

   /**
     * Returns a BigInteger whose value is (this-1 mod m).
     *
     * @param  m the modulus.
     * @return this-1 mod m.
     * @throws ArithmeticException  m <= 0, or this BigInteger
     *         has no multiplicative inverse mod m (that is, this BigInteger
     *         is not relatively prime to m).
     */
    public BigInteger modInverse(BigInteger m) {
        if (m.signum <= 0)
          throw new ArithmeticException("Modulus not positive: " + m);
        if (!this.gcd(m).equals(ONE))
          throw new ArithmeticException(this + " not invertible mod " + m);

        ... // Do the computation

        assert this.multiply(result).mod(m).equals(ONE);
        return result;
    }

答案 1 :(得分:-1)

基本上,pre + postconditions可以是任何验证给定接口遵循所需行为的东西。

举个例子: List<E>是一个界面。 ArrayList<E>是一个类,实现List<E>并暴露预期的行为。想象一下,您针对List<E>编写了一组JUnit次测试,然后针对ArrayList<E>执行这些测试。如果您的ArrayList<E>通过了测试 - 它符合列表行为的合同。

`
//Precondition
List<Object> objectList = new ArrayList<Object>();
//Postcondition: a newly created list must be empty, if you did not put anything there
assertEquals(0,objectList.size);
//Precondition
Object someObject = new Object();
//Precondition
objectList.add(someObject);
//Postcondition: you get exactly the same element, that you have just put
assertEquals(1,objectList.size);
assertEquals(someObject,objectList.get(0));
`

在您的情况下,您有以下内容:

前提条件:x=something, but not equal to y 后置条件:example(x) is true