zoukankan      html  css  js  c++  java
  • 软件的按契约设计(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应该是软件设计过程的一部分。

    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语言)

    1c13803564f4a44b90ef3991
    图1.DbC总体结构

    19d309f45a8488b57609d791
    图2. 断言宏定义

    f070243fcf2738b654e72391
    图3. DbC的应用例子

    三.使用到的C99预定义宏

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

    四.DbC的加入与撤消

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

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

  • 相关阅读:
    231. Power of Two
    204. Count Primes
    205. Isomorphic Strings
    203. Remove Linked List Elements
    179. Largest Number
    922. Sort Array By Parity II
    350. Intersection of Two Arrays II
    242. Valid Anagram
    164. Maximum Gap
    147. Insertion Sort List
  • 原文地址:https://www.cnblogs.com/hyper99/p/ruan-jian-de-an-qi-yue-she-ji-DbCDesign-by-Contrac.html
Copyright © 2011-2022 走看看