契约模式Design by Contract

契约模式Design by Contract

背景

Design by Contract是Bertrand Meyer总结的一项设计技巧,也是Meyer发明的Eiffel语言的主要特点。不过,这条原则的作用范围并不局限于Eiffel,而是所有的程序设计语言。

那么什么是Contract呢?

我们在声明一个函数/方法的时候,对函数的输入和输出所具备的性质是有所期望和规定的。有时候这种性质会被我们明确的写出来,有时候会被我们忽略掉。这些期望和规定就是Contract。

核心

核心是断言(assertion)。所谓“断言”,是指永远为真的布尔型语句,如果不为真,则程序必然存在错误。通常情况下,检查断言的时机,应该局限于调试(debug)阶段,而不是代码的实际执行阶段。实际上,完成的程序永远不应期望断言会被检查。

Design by Contract使用了三类断言:post-conditions,pre-condition,以及invariants。违反这些操作会导致程序抛出异常

post-conditions,是指操作执行完之后的情况,发生在每个操作的最后

pre-condition,是指在执行操作之前,期望具备的环境,发生在每个操作(方法,或者函数)的最开始。

invariants,是指使关于类(class)的断言,实际上是前置条件和后置条件的交集。

歪理

从核心来看,这意味着,不变量可以应用于特定类暴露的所有公开操作的前提条件与后继条件。在方法的执行过程中,不变量可能为假,但是,在其他任何对象能够与被调用方进行交互的时刻,不变量断言必须恢复为真。

在继承关系中,断言扮演着独特的角色。继承的风险之一在于,开发人员为子类重新定义的行为,可能会违背父类的行为。断言减少了这种风险。对某个类来说,其不变量和后继条件必须能够应用于所有的子类。子类可以加强这两类断言,增加更多的限制,而不能削弱它们。而前提条件则只能削弱,而不能增强。

可能有些隐晦难懂可以看这里

参考文章

1.http://www.zhihu.com/question/19864652

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,964评论 19 139
  • 第一部分 打好基础 Laying the Foundation 第一章 欢迎进入软件构建的世界 Welcome t...
    白桦叶阅读 10,148评论 0 17
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,664评论 18 399
  • 随着自媒体越来越盛行,公众号文章越来越多,要想让读者在众多公众号中一眼锁定你的推文,首先要立一个醒目而又不作的标题...
    小葡葡萄儿阅读 27,439评论 0 8
  • 其实早有烘焙愿望,无奈读书时诸多不便。直到去年双十一入了烤箱和新手烘焙包,14日兴冲冲用从麦德龙买的半成品做...
    南窗有木阅读 4,470评论 1 4

友情链接更多精彩内容