c++ - 前置条件通常与不变量重叠吗?

标签 c++ contract invariants preconditions

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

最佳答案

其他一些答案试图定义术语“前提条件”和“不变”。我认为例如维基百科在这方面做得更好,所以我只是链接到维基百科以获取定义。无论如何,如果问题仅仅是关于定义,那么它应该是 RTFM。问题,我会投票关闭它,而不是回答。


“If [preconditions and invariants] do not usually overlap, how are they different?”

A method 的前置条件总是可以看作是一个单一的 precondition 由各个子条件的结合形成,因此我们经常谈论和推理“the”前提。

对于公共(public)方法,子前提条件之一始终是 class invariant ,所以是的,经常有重叠。

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

当人们试图清楚地区分公共(public)接口(interface) 和实现细节时,事情会变得更加棘手,the previous attempt介绍类似埃菲尔的 Design By Contract (DBC) 对 C++ 的断言陷入困境。

尽管如此,实践中还是很容易的,因为可以这么说,对于实践中的人来说,可以避免非常棘手的情况,围绕它进行设计。


“What is an example of something that would be a precondition but not an invariant?”

例如,

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

关于c++ - 前置条件通常与不变量重叠吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13826930/

相关文章:

c++ - QT Framework C++ 我如何从另一个类访问 progressBar

c++ - 不熟悉的基本 C++ 代码

blockchain - 松露部署的网络是最新的

integer - 为什么 Dynamic_Predicate 不起作用?

ethereum - 在solidity中是否有类似null的东西

java - 二分查找平方根[作业]

java - JML 不是空变体?

pattern-matching - 在允许解构的同时保留不变量

c++ - 如何在 xtext DSL 中嵌入 C++ 代码?

Boost.Range 的 C++ 元组 - 获取元素类型的元组?