Effective C++ 条款19

it2023-03-08  77

Treat class design as type design

C++ 就像在其他 OOP (面向对象编程)语言一样,当你定义一个新的 class,也就定义了一个新的 type。 身为 C++ 程序员,你的许多时间主要用来扩张你的类型系统。这意味你不是 class 设计者,而是 type 设计者。重载函数和操作符、控制内存分配和归还、定义对象的初始化和终结等等,完全都在你手上。

如何设计高效的 classes 呢,了解你面对的问题,并从以下规范出发:

新 type 的对象应该如何被创建和销毁? 这会影响到你的 class 的构造函数和析构函数以及内存分配函数和释放函数。对象的初始化和对象的赋值该有什么样区别? 这个答案决定你的构造函数和赋值操作符的行为,以及其间的差异。新 type 的对象如果被以值传递,意味着什么? 记住,copy 构造函数用来定义一个 type 的以值传递该如何实现。什么是新 type 的 “ 合法值 ” ? class 成员函数必须进行错误检查工作。你的新 type 需要配合某个继承图系吗? 如果你的 class 继承于某些既定的 classes,尤其注意析构函数——是否为 virtual。你的新 type 需要什么样的转换? 是否需要些类型转换函数什么样的操作符和函数对此新 type 而言是合理的? 这将决定你为你的 class 声明为哪些函数。其中某些该是成员函数,某些则不该是。什么样的标准函数应该驳回? 那些正是你必须声明为 private 的。谁该取用新 type 的成员? 这决定了 class 接口类型,比如 public、private、protected、friend 等等什么是新 type 的 “ 未声明接口 ”? 它对效率、异常安全性、以及资源运用提供何种保证?应该在这些方面的代码实现上加上相应的约束。你的新 type 有多么一般化? 或许你其实并非定义一个新 type,而是定义一整个 types 家族。果真如此你就不该定义一个新 class,而是应该定义一个新的 class template。你真的需要一个新 type 吗?

请记住: Class 的设计就是 type 的设计。在定义一个新 type 之前,请确定你已经考虑过本条款覆盖的所有讨论主题。

最新回复(0)