我最近一直在学习关于后置条件,先决条件和合同的设计,但我还没有找到这个问题的确切答案。
对我而言,后置条件似乎基本上是“被调用后该方法意味着什么”。
这是一个例子
//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;
}
}
答案 0 :(得分:1)
您未在example
方法中提供任何先决条件或后置条件。你提供的是一个类不变量。
在检查后置条件之前,在方法中检查前置条件。通常情况下,这是通过assert
为后置条件完成的。
后置条件说明方法在被调用时确保的内容 实现其先决条件。如果违反了后置条件 前提条件成立,方法(供应商)打破了 合同(实施错误)。换句话说,后置条件是一个 对客户的权利和对供应商的义务。
引用来源:https://c4j-team.github.io/C4J/examples_postcondition.html
您通常不会返回true
或false
。后置条件由断言处理。关于此的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