【问题标题】:Pre-condition vs Post-condition in java? [duplicate]java中的前置条件与后置条件? [复制]
【发布时间】:2013-10-01 15:04:23
【问题描述】:

例如我有以下代码:

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

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

【问题讨论】:

  • 有趣的 int PI = 3.14,没有编译器问题?

标签: java preconditions post-conditions


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    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】:
       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,但 a 的原始值strong> 和 b 不受 calc 函数的影响,因为参数在 Java按值传递。 p>

      【讨论】:

      • 都是真的,但这与 OP 关于“前置条件”和“后置条件”的问题有什么关系?
      • 我以为他问错了问题。他的代码中没有 if/else,所以没有条件。
      • 前置/后置条件和不变量是独立的东西,与代码中是否存在 if/else 测试没有逻辑联系。它们与assert 语句的关系更密切。
      【解决方案4】:

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

      希望对您有所帮助。

      【讨论】:

        【解决方案5】:

        只是一个警告,将浮点数 (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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多