部分绝缘技术:
- 消除私有继承
即将IsA关系转换为HoldsA关系。
私有继承是为了实现对基类成员的访问控制,有选择的开放基类成员。同样的功能可以通过不透明指针实现。Class2通过一个指向Class1的指针,有选择的开放Class1的成员,而不用继承Class1。注意,实质依赖于Class2的所有成员函数都应该声明为非内联函数。
代价:额外的函数调用开销以及动态分配。
- 消除嵌入数据成员
即将HasA关系转换为HoldsA关系。
将以前直接操作嵌入数据成员的内联函数重写为非内联函数。
代价:额外的函数调用开销、管理分层实例的工作、间接寻址、动态分配。
- 消除私有成员函数
非内联私有成员函数有外部连接,这使声明为友元并且在其他编译单元中定义的函数和类能够调用它们。将类的私有成员定义为在组件作用域中的静态自由函数,能够支持严格的组件范围内的访问控制形式。
- 消除保护成员函数
原则55:以一个基类的保护成员函数的形式为派生类的作者提供支持,会将派生类的未绝缘的实现细节暴露给基类的公共客户。
- 消除私有成员数据
消除私有静态成员数据,通常有可能将静态成员数据移到组件.c文件的文件作用域中定义的一个静态变量中。
- 消除编译时产生的成员函数
显式的定义拷贝构造函数、赋值运算符、析构函数。
- 消除Include指令
通常有三种情况需要在.h文件中#include其他头文件:(1)IsA:在这个组件中的一个类派生于在被包含的文件中定义的一个类。
(2)HasA:该组件中的一个类嵌入了一个定义在被包含文件中的类的一个实例。
(3)Inline:在该组件的头文件中声明为inline的函数实质使用了一个定义在被包含文件中的类。
将头文件中所有不必要的包含指令都移到.c文件中,并且用适当的类声明替换它们。
- 消除默认参数
可以用单个函数取代默认参数。例如:
class Circle {
// ...
public:
Circle (double x = 0, double y = 0, double radius = 1);
// ...
};
class Circle {
// ...
public:
Circle ();
Circle (double x);
Circle (double x, double y);
Circle (double x, double y, double radius);
// ...
};
- 消除枚举类型
原则56:给较高层次的客户程序授予修改较低层次共享资源的接口的权利,会隐含的耦合所有的客户程序。