《C++编程风格(修订版)》——2.4 类不变性-阿里云开发者社区

开发者社区> 开发与运维> 正文

《C++编程风格(修订版)》——2.4 类不变性

简介:

本节书摘来自异步社区出版社《C++编程风格(修订版)》一书中的第2章,第2.4节,作者:【美】Tom Cargill,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.4 类不变性

C++编程风格(修订版)
对于每个类,我们都可以写出一组类不变性(Class Invariant)条件,在类的每个对象的生 存期内,这些条件都应该是成立的。例如,如果 len 是用来表示字符串的长度,那么 string 类的 一个不变性条件就是

image

类不变性与循环不变性是相似的。循环不变性在循环的起始阶段就开始起作用,并且在循 环的每次迭代中都将保持这个不变性。因此,循环不变性将一直持续到循环结束。同理,在每个 对象的生存期之内也需要保持类不变性。我们首先在构造函数中建立起类不变性,然后在其他成 员函数中维持这个不变性,这样就在对象的整个生存期内都保持了类不变性。

用一致的方式来定义对象的状态——这需要识别出类不变性。
在其他一些编程语言中,例如 Eiffel,提供了显式的语言机制来表示和检查类不变性。然而, 在 C++ 中并没有提供正式的语言机制来支持类不变性,而是由程序员来决定如何实现类不变性。

从这一点来说,类不变性就更加类似于循环不变性。如果一个 C++ 程序员在头脑中始终记着循 环不变性,那么他在编写循环时就有两种选择。在编写完循环之后,可以将不变性作为循环代码 的注释,或者将不变性作为一个断言整合到代码中(通过在标准头文件 assert.h 中定义的 assert 宏, 我们可以很容易地在代码中增加断言)。将不变性作为类的注释和将不变性作为循环的注释是一 样简单的,然而将类不变性作为断言整合到类的代码中则要更困难一些。在类的源代码中,需要 增加类不变性断言的地方可能不止一个。由于在每个成员函数中都需要保持类不变性,因此,在 每个可以改变对象状态的成员函数中都需要对断言进行测试。其中一种方法就是将所有的类不变 性断言集中到一个特殊的成员函数中,并在其他成员函数的开始部分或者结束部分(也可以在这 两个部分)调用这个特殊的成员函数。不过,很少有 C++ 程序员会去做这种麻烦的工作,相对而言, 将类不变性作为注释是更为普遍的做法。

在程序清单 2.2 中给出了一个 string 类,在这个 string 类中 len 的值和 strlen(s) 的返回值保持 一致。在类的声明中有一条注释语句,用来说明 len 的类不变性。类的每个成员函数都将遵循这 个不变性。

程序清单 2.2 string 类中的 len 是一致的
image

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章