软件的按契约设计(DbC---Design by Contract)
一.DbC基本概念
DbC的思想源于商业活动中商家和用户的行为(义务和利益关系),双方都要遵守一个契约(合同),交易才能完成。
商家与用户的契约关系如下:
1. 商家必须提供某种产品(义务),并有权获得用户支付的费用(利益);
2. 客户端必须支付费用(义务),并有权获得产品(利益);
3. 商家用户双方都必须遵守某些义务,如法律,法规。
二.软件中的DBC
DbC(Design by Contract,按契约设计)是一种软件设计方法,该方法首先在1986年由Bertrand Meyer提出,DbC已经由Eiffel Software公司注册为公司商标,开发者把这个方法也叫做按契约编程、契约优先编程。
把DbC思想用于软件系统开发中,就是把软件系统看做是不同构件之间的相互协作,构件之间的相互协作必须遵循精确定义的规范(契约、合同)。
许多语言都有写断言(assert)的特性,使用带有断言的C或C++,可以保证不同构件之间遵循的规范,保证软件开发的正确性,所以DbC主张首先写断言,DbC应该是软件设计过程的一部分。
- 使用DbC的优点: 
 (1)便于调试、发现程序中的错误;
 (2)便于代码重用,有契约的软件模块描述了模块的行为,便于生成代码重用的文档;
 (3)对运行的代码影响较小[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)的更多相关文章
- 重构第25天 引入契约设计(Introduce Design By Contract checks)
		理解:本文中的”引入契约式设计”是指我们应该对应该对输入和输出进行验证,以确保系统不会出现我们所想象不到的异常和得不到我们想要的结果. 详解:契约式设计规定方法应该对输入和输出进行验证,这样你便可以保 ... 
- 契约式设计 契约式编程  Design by contract
		Design by contract - Wikipedia https://en.wikipedia.org/wiki/Design_by_contract What is the use of & ... 
- 重构25-Introduce Design By Contract checks(契约式设计)
		契约式设计(DBC,Design By Contract)定义了方法应该包含输入和输出验证.因此,可以确保所有的工作都是基于可用的数据,并且所有的行为都是可预料的.否则,将返回异常或错误并在方法中进行 ... 
- 设计原则 Design Principle
		Design Principle设计原则 最近由于碰到要参与设计一个音频处理系统,有人提议用一个大的全局变量结构体来做状态信息交流的地方,引起了我对设计一个系统的思考,于是找到了如下资料,当然,关于这 ... 
- 运行时设计(Design at Run-time)
		1.定义 传统软件开发必须经历“设计时”和“运行时”两个阶段,运行时设计,顾名思义,就是在软件运行过程中,对软件进行实时设计修改,而无需再次进行编译,用户即可使用. “运行时设计(Design at ... 
- Silverlight游戏设计(Game Design):(十四)练习用游戏素材资源的获取及相关工具使用心得 --转
		Silverlight游戏设计(Game Design):(十四)练习用游戏素材资源的获取及相关工具使用心得 通过前6节的Demo制作演示,大家应该已经相当熟悉这款Silverlight-2D游戏场景 ... 
- 开源软件项目管理系统招设计/开发。。。。。Zend Framework2架构 svn://735.ikwb.com/pms
		开源软件项目管理系统招设计/开发.....Zend Framework2架构svn://735.ikwb.com/pms 
- Android 5.0之应用中实现材料设计—Material Design
		上午的时候在刷Google+,看到了Abraham Williams转发了一篇强文,是Android Developers网站新发的一篇博客—Implementing Material Design ... 
- 微软最新设计Fluent Design System初体验
		微软最新设计Fluent Design System初体验 本文图片不全!建议移步知乎专栏查看!!! https://zhuanlan.zhihu.com/p/30582886 原创 2017-11- ... 
随机推荐
- SOL的补充
			之前写过一些关于远程安装系统的文档,但是对于SOL还是糊涂不清. Serial Console 可以将输入输出转发到串行接口(com1, com2), 假如你有串行读取设备,就可以看到显示,控制输入. ... 
- percona mysql 5.7再centerOS 7上的安装
			第一次测试装的,还不是很熟练.很多东西不太对,以后还回改进 一.卸载包检查是否安装有MySQL Server: rpm -qa | grep mysql rpm -qa | grep mariadb ... 
- 使用文档碎片(DocumentFragments)追加DOM元素
			标签(空格分隔): JavaScript DocumentFragment接口表示一个没有父级文件的最小文档对象.它被当做一个轻量版的Document使用,用于存储已排好版的或尚未打理好格式XML片段 ... 
- 7.Zabbix 3.0 web监控
			请查看我的有道云笔记: http://note.youdao.com/noteshare?id=5f6b67f98a802fb831a83d810969c583&sub=B8D5267BDD5 ... 
- GridView中的更新按钮不能触发RowUpdating事件
			当点击“编辑”按钮以后,可以看到“更新”和“取消”按钮,“取消”按钮可以正常触发RowCancelingEdit事件,但是“更新”按钮不能触发RowUpdating事件. 解决方案: 在<asp ... 
- 2019年5月训练记录(更新ing)
			前言 \(ZJOI\)正式结束了. 但期中考试只考了年级\(216\),退役既视感... 于是就被抓回去补文化课了. 下半个学期可能要以文化课为主了吧! 但周三.周日应该还是会正常参加训练的,但其他时 ... 
- 深度优先搜索(dfs),城堡问题
			题目链接:http://poj.org/problem?id=1164 1.深搜,每个点都访问一次,没有标记的话,就做深搜,同时标记. #include <iostream> #inclu ... 
- php 的 number_format使用
			$num = 1.0258963147; // 1.0259 $num = number_format($num, 4, '.', ''); $num = number_format($num); $ ... 
- Hibernate的优缺点:
			1.Hibernate的优缺点:优点:1.程序更加面向对象:2.提高了生产率:3.方便移植(修改配置文件):4.无侵入性.缺点:1.效率比JDBC略差:2.不适合批量操作. 总的来说,hibernat ... 
- Android学习笔记_3_四种布局
			Android布局是应用界面开发的重要一环,在Android中,共有四种布局方式, 分别是:FrameLayout( 帧布局 ).LinearLayout (线性布局).TableLayout(表格布 ... 
