前置条件和后置条件

译自 Preconditions and Postconditions


在这篇文章中,我们将讨论术语前置条件(Precondition)和后置条件(Postcondition)。

前言

“前置条件”和“后置条件”这两个词看起来很吓人,但理解起来并不复杂。

定义

首先,让我们以一种正式的方式来定义“前置条件”和“后置条件”这两个词。

前置条件

前置条件是在方法运行之前必须为真的条件(condition)或者说断言(predicate)。换句话说,该方法告诉使用者:“这是我对你的期望”。即正在调用的方法期望在调用该方法之前或调用该方法时满足一定的条件。除非满足前置条件,否则不能保证操作会按其应有的方式执行。

后置条件

后置条件是在方法运行之后能够被保证为真的条件或者说断言。换句话说,该方法告诉使用者:“这是我承诺为你做的”。如果操作正确且满足前置条件(可能有多个),则可以保证后置条件为真。

现实世界中的例子

让我们看看在现实世界中,什么是前置条件和后置条件。

  • 吃掉披萨——前置条件:有一个披萨;后置条件:披萨没了。
  • 从 ATM 的借记帐户中取款——前置条件(有多个):首先,提取的金额应小于等于该帐户中剩余的金额,其次,提取的金额应小于等于 ATM 中剩余的金额;后置条件:ATM 和帐户上的余额提醒应等于其原始金额减去提取金额。
  • 马里奥击败鲍泽——前置条件:鲍泽出现;后置条件:马里奥救了皮奇。

一个更具体的例子

现在来看一个更具体的例子。假设我们有一个用于计算平方根的函数,那么这里的前置条件即传给这个平方根函数的参数必须为非负数,后置条件即计算得到的结果的平方必定与传入的参数相等。可将其表示为:

def square_root(x):
    assert x >= 0 // _前置条件_
    计算过程...返回一个名为 Y 的值
    assert y*y == x // _后置条件_
    return y

编程实例

假设我们有这样一个函数:

int getSum(int a, int b)
{
    int sum = a + b;
    return sum;
}

这个函数的功能是计算给定的两个整数的和并将和返回。对该函数来说,前置条件为给定的两个值都为整数,后置条件为这两个整数的和被返回。

不变式

我们有时会看到“不变式”一词,不变式(invariant)指总为真的条件或者说断言。即该方法告诉使用者:“如果它在调用我之前为真,那么我可以保证在我调用结束后它仍然为真”。不变式是前置条件和后置条件的组合。在调用方法之前和之后,它都必定为真。

总结

通过本文,我们了解了什么是“前置条件”和“后置条件”。我们看到前置条件即在调用方法之前必须为真的条件,而后置条件即在方法调用结束后必定为真的条件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章