现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
35732 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

43 | Contracts:C++ 和契约式编程

你好,我是吴咏炜。
最近,在 C++ 社区有一条热门新闻:契约(contracts)终于被(再次)加入 C++ 标准了!今天,我就先来讲讲契约式设计吧。

基本概念

Bertrand Meyer 在 1986 年发明了 Eiffel 语言,并同时提出了契约式设计(Design by Contract,DbC)的思想。就像商业活动中甲方和乙方之间用“契约”(合同)来规定彼此的义务和权利一样,软件系统中的各个元素之间也有“责任”和“权利”。如果某个函数提供了某种功能,那么它会:
期望客户代码在调用该函数时保证满足一定的条件,即函数的先决条件(precondition,另一种常见叫法是“前置条件”)——客户的责任和供应商的权利。这样,函数就不需要去处理不满足先决条件的情况。
保证函数退出时满足一定的条件,即函数的后置条件(postcondition)——供应商的责任,显然也是客户的权利。
要求一些条件在进入函数时成立,并确保它们在函数退出时还能保持成立,这就是不变量(invariant,也称为“不变式”或“不变条件”)。
此外,用来检查契约的断言既可以放在函数外部,作为正式的先决条件和后置条件;也可以放在函数内部,作为执行时的检查。如果契约被检查的话(后面我们会回到这一点),函数内部的契约当然是根据执行流,在代码执行到相应位置时进行检查。而先决条件和后置条件会在执行函数体代码之前和之后分别得到检查——尤其是后置条件,在没有直接契约支持时用其他方式检查还是比较麻烦的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. C++26将支持契约,包括先决条件断言 `pre`、后置条件断言 `post` 和契约断言语句 `contract_assert`。 2. 契约式设计有助于明确划分函数的实现者和调用方的职责,简化调试,减少返工。 3. C++26的契约支持灵活,使开发者可以根据不同运行环境动态配置契约的检查策略,以满足不同的需求。 4. 契约支持的基本概念包括先决条件、后置条件和不变量,有助于论证代码正确性。 5. 先决条件是函数对函数调用方的要求,后置条件是对函数自身的要求,不变量是程序的某一部分在执行中可以始终保证为真的条件。 6. 在C++26里,可以使用`pre`和`post`来明确先决条件和后置条件,以及使用`contract_assert`对不变量进行检查。 7. 派生类在覆盖成员函数时,只能削弱先决条件、增强后置条件,而不能增强先决条件、削弱后置条件,以满足Liskov可替换性。 8. 在没有契约支持的情况下,可以使用断言宏来模拟先决条件和后置条件的检查。 9. 不变量是程序的某一部分在执行中可以始终保证为真的条件,对于一个类对象,需要在构造函数里建立类不变量,并在所有修改成员变量的函数中保持类不变量继续成立。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部