前提条件通常与不变量重叠吗?

时间:2012-12-11 19:15:36

标签: c++ contract invariants preconditions

我无法区分这两者。如果它们通常不重叠,它们有何不同?什么是先决条件但不是不变的东西的例子?

4 个答案:

答案 0 :(得分:2)

其他一些答案试图定义术语“前置条件”和“不变量”。我想,例如维基百科做得更好,所以我只是链接到维基百科的定义。无论如何,如果问题只是关于定义,那么这将是一个RTFM问题,我会投票关闭它,而不是回答。


  

“如果[前置条件和不变量]通常不重叠,它们有何不同?”

method 的先决条件始终可以视为由单个子条件的组合形成的单个 precondition ,因此我们经常谈及“前提条件”的理由。

对于公共方法,其中一个子前提条件始终是 class invariant ,所以是的,经常重叠。

在考虑内部(privateprotected)方法时,事情变得更加棘手。通常,公共方法通过暂时破坏类不变量然后恢复它来工作。在无效类不变量期间,它可能会调用一些内部帮助器方法,而那些内部帮助器方法不能很好地将类不变量包含在它们的前提条件中。

当人们试图明确区分公共界面和实现细节时,事情会变得更加棘手,而the previous attempt会引入类似于埃菲尔的 Design By Contract DBC )对C ++的断言滞留在此。

但实际上很容易,因为在实践中,可以避免非常棘手的案例,围绕它进行设计,可以这么说。


  

“什么是先决条件但不是不变的东西的例子?”

例如,

class Foo
{
public:
    void add( Bar* p )
    {
        assert( p != 0 );    // Precondition unrelated to the class invariant
        // ... whatever
    }
};

答案 1 :(得分:1)

前提条件只是必须在之前,但不一定在期间或之后必须是真实的。顾名思义,不变量在任何时间点都不会改变。例如,让我们说我想要对矢量进行标准化。一个先决条件可能是它的当前规范不能为0(因为我将导致除以零)。规范化的运算会改变向量的范数,这意味着它将是一个先决条件而不是一个不变量。

答案 2 :(得分:0)

不变量通常是您所在州的某些财产。例如,您可以始终声明1 <= x <= 100

前提条件适用于方法调用。例如,如果上面包含x的类具有方法Foo(int y, int z),则前提可能是y < xz > 10000,以使函数调用有效。

答案 3 :(得分:0)

简短的回答是肯定的。前提条件,后置条件和不变量本质上是同一事物的不同方面。

前提条件是在完成操作之前进行“即时”检查。 后置条件是完成操作后的“瞬时”检查。 不变量是一种持续一段时间的检查。

例如,如果你有一个平方根函数,要求其参数为> = 0,那就是一个先决条件,因为它是在操作之前进行的检查。

另一方面,如果你有一个成员x&amp; y,使得x>在所有情况下,这是一个不变量,因为条件持续一段时间(在你的对象的生命期间)。同样地,如果你有一个循环并且某些条件必须贯穿循环的每次迭代,那也是一个不变量,因为检查会持续一段时间。通常,术语类不变量和循环不变量将用于指定不变量的类型。