图书馆方便使用"按合同设计"原则

yes*_*aaj 19 c++ design-by-contract

是否有任何库有助于在C++应用程序中通过契约原则实现设计?

特别是,我正在寻找一个可以使用原理的库,就像这样.

Dan*_*nas 9

我遵循以下文章的教导:

  • 异常或错误?(Miro Samek,C/C++ Users Journal,2003)
  • 简单支持C++中的契约式设计(Pedro Guerreiro,TOOLS,2001)

我最终应用的是Samek的方法.只需为REQUIRE,ENSURE,CHECK和INVARIANT(基于现有的assert宏)创建宏非常有用.当然,它不如母语支持那么好,但无论如何,它可以让你从技术中获得大部分实用价值.

至于图书馆,我认为使用图书馆并不值得,因为断言机制的一个重要价值就是它的简单性.

有关调试代码和生产代码之间的区别,请参阅何时断言保留在生产代码中?.


SPW*_*ley 6

简单?

在函数开头声明语句以测试您的需求.在函数末尾声明语句以测试结果.

是的,它很粗糙,它不是一个大系统,但它的简单性使它具有多功能性和便携性.

  • DbC的主要特征 - 前/后条件是继承的 - 将不会被Assert模仿. (6认同)
  • 当你在很少的地方使用"返回"时,"功能结束时"变得非常复杂.更不用说例外了. (4认同)

dmw*_*dmw 6

某些设计模式(例如非虚拟接口)可以自然地为给定方法编写前/后条件:

#include <cassert>

class Car {
    virtual bool engine_running_impl() = 0;
    virtual void stop_impl() = 0;
    virtual void start_impl() = 0;

    public:
    bool engine_running() {
        return engine_running_impl();
    }

    void stop() {
        assert(engine_running());
        stop_impl();
        assert(! engine_running());
    }

    void start()
    {
        assert(! engine_running());
        start_impl();
        assert(engine_running());
    }
}


class CarImpl : public Car {
    bool engine_running_impl() {
        /* ... */
    }

    void stop_impl() {
        /* ... */
    }

    void start_impl() {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)