例如,我有以下代码:
public class Calc(){
final int PI = 3.14; //is this an invariant?
private int calc(int a, int b){
return a + b;
//would the parameters be pre-conditions and the return value be a post-condition?
}
}
我对这些术语到底意味着什么感到困惑?上面的代码是我认为的,但是有人能用我的理论指出我正确的方向吗?
答案 0 :(得分:4)
您的代码与其他零碎代码签订了合同。前提条件基本上是最初必须满足的条件,以便您的代码保证它将执行它应该执行的操作。
例如,二进制搜索将具有必须对您要搜索的内容进行排序的前提条件。
另一方面,后置条件是代码在满足前置条件时保证的条件。例如,在二进制搜索的情况下,我们保证找到我们搜索的位置,或者在我们找不到任何内容的情况下返回-1。
前提条件几乎就像你的参数之外的另一件事。它们通常不直接影响代码,但在其他人使用您的代码时它很有用,因此他们正确使用它。
答案 1 :(得分:3)
前置条件是在调用方法之前必须为真的事情。该方法告诉客户“这是我对你的期望”。
后置条件是方法完成后必须为真的事情。该方法告诉客户“这是我保证会为您做的事情。”
不变量是永远正确且不会改变的事物。该方法告诉客户“在你打电话给我之前这是否属实,我保证当我完成时它仍然是真的”。
的回答答案 2 :(得分:3)
不变量是组合的前提条件和后置条件。它必须在调用方法之前和之后有效。必须先填充前提条件才能运行方法,然后再进行后置条件。
Java没有内置条件检查的机制,但这里有一个小例子。
public class Calc {
private int value = 0;
private boolean isValid() {
return value >= 0;
}
// this method has the validity as invariant. It's true before and after a successful call.
public void add(int val) {
// precondition
if(!isValid()) {
throw new IllegalStateException();
}
// actual "logic"
value += val;
// postcondition
if(!isValid()) {
throw new IllegalStateException();
}
}
}
如您所见,可能会违反条件。在这种情况下,您(通常)在Java中使用异常。
答案 3 :(得分:2)
private int calc(int a, int b){
return a + b;
//would the parameters be pre-conditions and the return value be a post-condition?
}
一个函数需要两个 int 并返回 int ,这是 a 和 b 。
您通常会在main中调用calc函数
public static void main(String[] args)
{
int a = 3, b = 4;
int sum = calc(a, b);
}
当你这样做时, a 和 b 的副本会传递给 calc ,但原始值为 a 和 b 不受 calc 函数的影响,因为 Java 中的参数通过值传递。
答案 4 :(得分:2)
关于函数所采用的参数,前提条件必须是真实的。所以它不足以说明变量是什么,但你需要谈谈它们的本质。例如,a和b必须是整数。 post条件说明函数完成后必须为true。在您的示例中,您的函数必须生成a和b的总和。前置条件和后置条件实际上可以导致两种方法,特别是在像Java这样的语言中。如果您有一个简单说明的前提条件"该两个参数必须是数字"该怎么办?那么你不仅要考虑整数,还要考虑浮点数。
希望有所帮助。
答案 5 :(得分:1)
只需提醒一句,将一个浮点数(3.14
)投射到int
会给您带来麻烦。您可能希望将其强制转换为浮点数:
final float PI = 3.14f;
final
表示无法再更改变量。
a
和b
只是您传递到calc()
的参数。以前,可以按照您希望的方式调用它们,但在calc()
内,您可以将它们称为a
和b
。
所以你可以拥有这个:
int foo = 5;
int bar = 7;
int sum = calc(foo, bar); //12