1.什么是契约式设计:契约式设计/契约式编码(Design by Contract(DbC)/Programming by Contract,以下简称 DbC )是一种设计计算机软件的方法。
这种方法描述了,软件设计者应该为软件组件定义正式的、准确的、可验证的接口规范,它扩展了抽象数据类型(abstract data type,ADT)对于先验条件(preconditions)、后验条件(postcondition)和不变性(invariants)的一般定义。这些规范称为“契约(contracts)”,它是一个比喻,类似于商业契约/合同的条件和职责。
2.契约式设计重要性——获得更优秀的设计
(1)更系统的设计 契约式设计鼓励程序员思考诸如“方法的先验条件是什么”这样的问题,这样有助于程序员理清概念。
(2)更清楚的设计 使用者和提供者之间的权利和义务得到了共享,同时获得了清晰的描述。
(3)更简单的设计 程序的先验条件清楚地描述了使用该程序的限制,而且非法调用的结果也很清楚,所以我们鼓励程序员不要开发过于通用的程序,而要设计小巧的、目标专一的方法。
3.契约式设计重要性——保证系统健壮性
(1)控制对继承的使用 例如,当要用到多态性和动态绑定时,检查契约可以确保重定义方法的先验条件在子类中不会被加强。
(2)系统地运用异常 当例程被非法使用(先验条件失败)或者例程没有遵循契约的规定(后验条件或者不变式失败)时,就会发生异常。
4.契约式设计重要性——尽可能准确地规定软件元素彼此通信时的义务和权利,从而有效组织通信。
其中的“规定”就是我们所说的“契约”。我们认为软件系统是由大量彼此协同的元素构成的。在面向对象构架中,这些元素可以是类和方法。
在其他的程序设计模式中,这些元素可以是其他的东西,不过在这里,我们假设是工作在面向对象环境。
这样,我们的软件系统就是由大量类组成的;这些类又包含很多将独立执行又彼此调用的方法。
所以,系统架构和系统运行都要依附于大量的存在于软件元素之间的通讯渠道。
契约的言下之意就是保证这些通讯在待提供服务的准确而不是含糊不清的要求基础上进行。
5.契约式设计重要性——提高可靠性
(1)编写契约可以帮助开发者更好地理解代码
(2)契约有助于测试(契约可以随时关闭或者启用)
6.契约式设计重要性——提供更出色的文档
(1)契约乃是类特性的公用视图中的固有成分
(2)契约是值得信赖的文档(运行时要检查断言,以保证制定的契约与程序的实际运行情况一致)
(3)契约是精确的规范,同时也可以作为测试的可靠指导
7.契约式设计重要性——简化调试
契约能把错误牢牢地定位,开发期间的支持 由于断言判断为假而在运行时展现出来的错误将被精确地定位。
如果断言失败,我们可以很清楚地知道错误的位置。
维护期间的支持 如果发布程序时打开了断言检查,客户就可以为开发人员提供更确切的错误信息。
8.契约式设计重要性——支持复用
(1)出色的文档
(2)正确运用了复用代码的运行时检测
(3)契约清楚地解释了程序库中各个类、各个例程的任务,以及使用中的限制条件,从而减轻了“此功能未实现”综合症的危害程度。对库使用者的帮助 运行时的契约检查为那些学习使用别人的类的人们提供了反馈。
没有契约的帮助,如果你在错误的情况下调用某个程序,就得不到有关出错位置的明确反馈信息。精心编写的契约,尤其是精心编写的先验条件,为客户程序员提供了关于出错位置的精确分析。