条款19:设计class犹如设计type
(Treat class design as type design.)
内容:
今天我们讨论的这款对于现在的我来说深有体会,随着做的项目越来越多,我越来越感觉到一个设计非常
优秀的class对于开发者来说是多么的重要,我一直都在思考和探寻着如何设计优秀的classes,写一个class
出来我相信大家都能够写的出来,而设计出优秀的classes则是一项艰巨的工作,本条款中提到设计class就像
设计types一样,为什么这么说呢?因为设计好的types是一项艰巨的工作.好的types有自然的语法,直观的语
义,以及一或多个高效实现品.在C++中,一个不良的规划下的class定义恐怕无法达到上述任何一个目标,书中
提到了如果你想设计高效的classes你至少要考虑下面的几个问题,而这几个问题的答案导致了你的设计规范:
★ 新type的对象应该如何被创建和销毁?
这个问题主要影响到你的构造函数析构函数以及内存分配和释放函数设计.
★ 对象的初始化和对象的复制该有什么样的区别?
这个是很多人容易忽略的问题,而规范的做法下你需要考虑这点,它决定了你的构造函数,拷贝构造,复制
操作符的行为以及它们之间的差别,别混淆了"初始化"和"赋值",如果忘记了赶紧回过头看一下条款4.
★ 新type的对象如果被pass by value(以值传递),意味着什么?
注意pass by value与pass by reference传递参数时候的区别,而在处理赋值操作符时注意到"自我赋值"的
情况.
★ 什么是新type的"合法值"?
考虑你的class必须维护的约束条件,你的成员函数的错误检查工作.它也影响函数抛出的异常.
★ 你的class需要配合某个继承体系么?
考虑一下你的class需要被其它class继承,那会影响你的声明函数,尤其是析构函数是否为virtual(条款7).
★ 你的新type需要什么样的转换?
考虑一下你的新type是否需要提供隐式或者显示转换函数(条款15).
★ 什么样的操作符和函数对此新type而言是合理的?
★ 什么样的标准函数应该被驳回?
★ 谁该取用新type的成员?
这将决定哪个成员为public,哪个为protected,哪个为private.它也帮助你决定哪一个class和/或functions
应该是friends,以及将它们嵌套与另一个之内是否合理.
★ 什么是新type的"未声明接口"(undeclared interface)?
它对效率,异常安全性(条款29我们将讨论这个问题)以及资源运用(例如多任务锁定和动态内存)提供何种保
证?你在这些方面提供的保证将为你的class实现代码加上相应的约束条件.
★ 你的新type有多么一般化?
或许你其实并非定义一个新type,而是定义一整个types家族.果真如此你就不该定义一个新class,而是应该
定义一个新的class template.
★ 你真的需要一个新type吗?
如果只是定义新的derived class以便为既有的class添加机能,那么说不定单纯定义一或多个non-member函
数或templates,能够达到目标.
这些问题不容易回答,所以定义出高效的classes是一种挑战.然而如果能够设计出至少像C++内置类型一样
好的用户自定义(user-defined) classes,一切汗水便都值得.
请记住:
■ class的设计就是type的设计.在定义一个新type之前,请确定你眼睛考虑过本条款覆盖的所有讨论主题.