转载时请表明出处
作者联系方式:liuyuxin0829@qq.com
一、前言
本周培训中接触到了契约式设计,查阅了许多资料后仍然是一知半解,与同事和大学导师交流了后,受到了启发,本文记录总结了个人对契约式设计的学习感悟。
二、什么是契约式设计?
1、概述
契约式设计/契约式编码(Design by Contract(DbC),以下简称 DbC )是一种设计计算机软件的方法。这种方法描述了,软件设计者应该为软件组件定义正式的、准确的、可验证的接口规范,它扩展了抽象数据类型对于先验条件、后验条件和不变式的一般定义。这些规范称为“契约”,它是一个比喻,类似于商业契约/合同的条件和职责,对于以上概念,下文会详细描写。
注:Dbc起源于Eiffel语言,但它的应用范围与语言无关。
2、目的
Dbc的主要目的是希望程序员能够在设计程序时明确地规定一个模块单元(具体到面向对象,就是一个类的实例)在调用某个操作前后应当属于何种状态。Dbc不是一种编程范型,它是一种设计风格,一种语法规范。
3、思路
契约式设计强调三个概念:先验条件,后验证条件和不变式。
- 先验条件:对于函数来讲,期望所有调用它的模块都保证一定的进入条件,这样它就不用去处理不满足先验条件的情况,先验条件发生在每个函数的最开始。
- 后验条件:保证退出时给出特定的属性,也就是说函数保证能做到的事情,函数完成时的状态,函数有这一事实表示它会结束,不会无休止的循环,后验条件发生在每个函数的最后。
- 不变式:在进入时假定,并在退出时保持一些特定的属性,不变式实际上是前置条件和后置条件的交集,违反这些操作会导致程序抛出异常。从调用者的角度来看,该条件总是为真,在函数的内部处理过程中,不变项可以为变,但在函数结束后,控制返回调用者时,不变项必须为真。
4、六大原则
(1)区分命令和查询。查询返回一个结果,但不改变对象的可见性质。命令改变对象的状态,但不一定返回结果。
(2)将基本查询同派生查询分开。派生查询可以用基本查询来定义。
(3) 针对每个派生查询,设定一个后验条件,使用一个或多个基本查询的结果来定义它。这样我们只要知道基本查询的值,也就能知道派生查询的值。
(4) 对于每个命令都撰写一个后验条件,规定每个基本查询的值。结合“用基本查询定义派生查询”的原则,我们已经能够知道每个命令的全部可视效果。
(5)对于每个查询和命令,采用一个合适的先验条件。先验条件限定了客户调用查询和命令的时机。
(6) 撰写不变式来定义对象的恒定特性。类是某种抽象的体现,应当将注意力集中在最重要的属性上,以帮助读者建立关于类抽象的正确概念模型。
三、为什么要使用Dbc(重要性)
-
获得更优秀的设计:Dbc鼓励程序员思考诸如“函数的先验条件是什么”这样的问题,这样