一.DbC基本概念

DbC的思想源于商业活动中商家和用户的行为(义务和利益关系),双方都要遵守一个契约(合同),交易才能完成。

商家与用户的契约关系如下:
1. 商家必须提供某种产品(义务),并有权获得用户支付的费用(利益);
2. 客户端必须支付费用(义务),并有权获得产品(利益);
3. 商家用户双方都必须遵守某些义务,如法律,法规。

二.软件中的DBC

DbC(Design by Contract,按契约设计)是一种软件设计方法,该方法首先在1986年由Bertrand Meyer提出,DbC已经由Eiffel Software公司注册为公司商标,开发者把这个方法也叫做按契约编程、契约优先编程。

把DbC思想用于软件系统开发中,就是把软件系统看做是不同构件之间的相互协作,构件之间的相互协作必须遵循精确定义的规范(契约、合同)。

许多语言都有写断言(assert)的特性,使用带有断言的C或C++,可以保证不同构件之间遵循的规范,保证软件开发的正确性,所以DbC主张首先写断言,DbC应该是软件设计过程的一部分。

  1. 使用DbC的优点:
    (1)便于调试、发现程序中的错误;
    (2)便于代码重用,有契约的软件模块描述了模块的行为,便于生成代码重用的文档;
    (3)对运行的代码影响较小[2]。

  2. 传统调试与DbC调试:
    (1) if-else方法:
    传统程序模块开始时,使用很多的If(条件){符合条件;}else{不符合,返回}的格式用于检测边界条件(也可以叫合同)。条件符合时,执行模块功能代码;不符合时,返回调用者,由调用都来处理错误。
    (2)try-catch方法:
    这是先运行try{模块功能代码}中代码,如果有错(异常),执行catch(希望的异常){捕获异常}用于捕获异常。这是先运行,之后看有没有错的方法。
    (3)断言方法:
    Java语言开发中,常用assert()断言用于白盒测试,测试函数的边界条件。但它是编一个函数,测试一个函数的过程。
    (4)DbC方法:
    先看合同,后运行的方法,它也使用断言。与第一种if-else有点类似,但是,当有错误出现时,它会自动调用回调函数my_onAssert(),而不是像第一种方法返回到调用者。在回调函数my_onAssert()中,可以显示错误出现的文件和行号;在嵌入式系统开发时,也可以在回调函数中实现串行通信,把错误传到PC机;也可以用LED闪亮次数来表示错误位置。

二.DbC的实现(C语言)


图1.DbC总体结构


图2. 断言宏定义


图3. DbC的应用例子

三.使用到的C99预定义宏

(1)__FILE__ :所在源文件名称字符串;
(2)__LINE__:所在源文件中行位置数;
(3)#name:也就是name对应字符串。

四.DbC的加入与撤消

在调试程序时,用宏开关加入契约;调试正确后,可以用宏开关来撤消契约,以节省ROM空间和提高运行效率。

参考:
[1]DbC:http://en.wikipedia.org/wiki/Design_by_Contract

软件的按契约设计(DbC---Design by Contract)的更多相关文章

  1. 重构第25天 引入契约设计(Introduce Design By Contract checks)

    理解:本文中的”引入契约式设计”是指我们应该对应该对输入和输出进行验证,以确保系统不会出现我们所想象不到的异常和得不到我们想要的结果. 详解:契约式设计规定方法应该对输入和输出进行验证,这样你便可以保 ...

  2. 契约式设计 契约式编程 Design by contract

    Design by contract - Wikipedia https://en.wikipedia.org/wiki/Design_by_contract What is the use of & ...

  3. 重构25-Introduce Design By Contract checks(契约式设计)

    契约式设计(DBC,Design By Contract)定义了方法应该包含输入和输出验证.因此,可以确保所有的工作都是基于可用的数据,并且所有的行为都是可预料的.否则,将返回异常或错误并在方法中进行 ...

  4. 设计原则 Design Principle

    Design Principle设计原则 最近由于碰到要参与设计一个音频处理系统,有人提议用一个大的全局变量结构体来做状态信息交流的地方,引起了我对设计一个系统的思考,于是找到了如下资料,当然,关于这 ...

  5. 运行时设计(Design at Run-time)

    1.定义 传统软件开发必须经历“设计时”和“运行时”两个阶段,运行时设计,顾名思义,就是在软件运行过程中,对软件进行实时设计修改,而无需再次进行编译,用户即可使用. “运行时设计(Design at ...

  6. Silverlight游戏设计(Game Design):(十四)练习用游戏素材资源的获取及相关工具使用心得 --转

    Silverlight游戏设计(Game Design):(十四)练习用游戏素材资源的获取及相关工具使用心得 通过前6节的Demo制作演示,大家应该已经相当熟悉这款Silverlight-2D游戏场景 ...

  7. 开源软件项目管理系统招设计/开发。。。。。Zend Framework2架构 svn://735.ikwb.com/pms

    开源软件项目管理系统招设计/开发.....Zend Framework2架构svn://735.ikwb.com/pms

  8. Android 5.0之应用中实现材料设计—Material Design

    上午的时候在刷Google+,看到了Abraham Williams转发了一篇强文,是Android Developers网站新发的一篇博客—Implementing Material Design ...

  9. 微软最新设计Fluent Design System初体验

    微软最新设计Fluent Design System初体验 本文图片不全!建议移步知乎专栏查看!!! https://zhuanlan.zhihu.com/p/30582886 原创 2017-11- ...

随机推荐

  1. PHP header() session_start() 函数前为什么不能有输出?

    前阵面试遇到的问题,当时没答上来,后来查了些资料,仍未得到答案.今天研究HTTP请求,终于知道了答案. HTTP 函数允许在其他输出被发送之前,对由 Web 服务器发送到浏览器的信息进行操作. HTT ...

  2. java带jar包的命令行运行

    运行有些java类需要第三方的jar包(lib),在用命令行运行时本人总结如下几个方法: 方法一.编译  javac -cp D:\lab\googleapi.jar Lab.java设置classp ...

  3. Excel-怎样实现行列转置

    有时候,我们为了某些需要,必须把工作表的行列进行转置的方式显示.重新输入很浪费时间,怎样简单的实现转置呢,强大的excel2007提供了此项功能,具体怎么做,下面看我来演示一下. 工具/原料   装有 ...

  4. Jmeter入门15 JSON Assertion 适用于json格式的响应断言

    当响应结果是json格式时,用JSON Assertion更方便判断. 1 在请求上右键添加json断言 2  编辑json Assertion 判断方式: 如果响应结果不是json格式的,fail ...

  5. 设计模式——抽象工厂模式(AbstractFactoryPattern)

    抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. UML图: IFactory: package com.cnblog.clarck ...

  6. vue.js--基础事件定义,获取数据,执行方法传值

    <template> <div id="app"> <h1>{{ msg }}</h1> <br> <button ...

  7. C++设计模式实现--訪问者(Visitor)模式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/L_Andy/article/details/36896645 一. 訪问者模式 定义:表示一个作用于 ...

  8. CENTOS 6 通过YUM升级GCC到4.7/4.8

    第一阶段:升级到4.7 [root@01314.CN ~]# cd /etc/yum.repos.d [root@01314.CN yum.repos.d]# wget http://people.c ...

  9. Spring管理连接池的几种方式

    第一种方式:.Spring常规的数据库连接方法: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations=&qu ...

  10. 【转】一个Android项目搞定所有主流架构-1.项目介绍和基本MVC架构示例

    http://www.jianshu.com/p/798536fb91c5 项目启发来自谷歌的同类框架项目https://github.com/googlesamples/android-archit ...