1

例如我有以下代码:

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?
  }
}

我只是对这些术语的确切含义感到困惑?上面的代码是我认为的,但是任何人都可以用我的理论指出我正确的方向吗?

4

5 回答 5

5

您的代码与其他代码片段签订了合同。前提条件本质上是最初必须满足的条件,以便您的代码保证它会做它应该做的事情。

例如,二分搜索的前提条件是您要搜索的内容必须经过排序。

另一方面,后置条件是代码保证前置条件是否满足的内容。例如,在二分查找的情况下,我们保证找到我们正在搜索的位置,或者在我们没有找到任何东西的情况下返回 -1。

前提条件几乎就像您的参数之上的另一件事。它们通常不会直接影响代码,但在其他人使用您的代码时很有用,因此他们可以正确使用它。

于 2013-10-01T15:09:56.450 回答
4

不变量是组合的前置条件和后置条件。它必须在调用方法之前和之后都有效。在运行方法之前必须满足前置条件,然后必须满足后置条件。

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 中使用异常。

于 2013-10-01T15:11:41.210 回答
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的函数,它是ab的总和。

您通常将 main 中的 calc 函数称为

public static void main(String[] args)
{
  int a = 3, b = 4;
   int sum =  calc(a, b);
}

当您这样做时, ab的副本将传递给calc但ab的原始值不受calc函数的影响,因为参数在Java中按值传递

于 2013-10-01T15:11:54.120 回答
2

前提条件是关于函数采用的参数必须为真的东西。所以仅仅说变量是什么是不够的,但你需要说一下它们的性质。例如,a 和 b 必须是整数。后置条件说明函数完成后必须为真。在您的示例中,您的函数必须产生 a 和 b 的总和。前置条件和后置条件实际上可以产生两种方法,尤其是在 Java 这样的语言中。如果您有一个简单的前提条件,即“两个参数必须是数字”怎么办。那么你不仅要考虑整数,还要考虑浮点数。

希望有帮助。

于 2013-10-01T15:12:29.790 回答
1

只是一个警告,将浮点数 ( 3.14) 转换为 anint会给您带来麻烦。您可能希望将其转换为浮点数:

final float PI = 3.14f;

final表示该变量不能再更改。

a并且b只是您传递给calc(). 以前,它们可以被称为任何你想要的名字,但在里面calc()你可以将它们称为aand b

所以你可以有这个:

int foo = 5;
int bar = 7;
int sum = calc(foo, bar); //12
于 2013-10-01T15:07:13.950 回答