Java 中的前置条件与后置条件



例如,我有以下代码:

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

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

您的代码与其他代码处于契约中。前提条件本质上是最初必须满足的条件,以便您的代码保证它将执行它应该做的事情。

例如,二叉搜索的前提是必须对正在搜索的内容进行排序。

另一方面,后置条件是代码在满足前提条件时所保证的。例如,在二叉搜索的情况下,我们保证找到我们正在搜索的位置,或者在我们找不到任何东西的情况下返回 -1。

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

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

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

 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);
}

当你这样做时,a 和 b 的副本会传递给 calc,但 ab 的原始值不受 calc 函数的影响,因为参数在 Java 中是按值传递的。

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

希望有帮助。

只是一句警告,将浮点数(3.14)投射到int会给你带来麻烦。您可能希望将其转换为浮点数:

final float PI = 3.14f;

final意味着无法再更改变量。

ab只是您传递到calc()的参数。以前,它们可以随心所欲地称呼它们,但在calc()内部,您可以将它们称为 ab .

所以你可以有这个:

int foo = 5;
int bar = 7;
int sum = calc(foo, bar); //12

相关内容

  • 没有找到相关文章

最新更新