java中的前置条件与后置条件?

时间:2013-10-01 15:04:23

标签: java preconditions post-conditions

例如,我有以下代码:

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

我对这些术语到底意味着什么感到困惑?上面的代码是我认为的,但是有人能用我的理论指出我正确的方向吗?

6 个答案:

答案 0 :(得分:4)

您的代码与其他零碎代码签订了合同。前提条件基本上是最初必须满足的条件,以便您的代码保证它将执行它应该执行的操作。

例如,二进制搜索将具有必须对您要搜索的内容进行排序的前提条件。

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

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

答案 1 :(得分:3)

前置条件是在调用方法之前必须为真的事情。该方法告诉客户“这是我对你的期望”。

后置条件是方法完成后必须为真的事情。该方法告诉客户“这是我保证会为您做的事情。”

不变量是永远正确且不会改变的事物。该方法告诉客户“在你打电话给我之前这是否属实,我保证当我完成时它仍然是真的”。

来自stackoverflow question

的回答

答案 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表示无法再更改变量。

ab只是您传递到calc()的参数。以前,可以按照您希望的方式调用它们,但在calc()内,您可以将它们称为ab

所以你可以拥有这个:

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