《代码大全》笔记
《代码大全》2 学习笔记,随手记录值得记录、便于记录的知识点,不定时更新。
文章目录
- 第六章
- 6.2 良好的类接口
- 在类的接口中呈现一致的抽象级别
- 一定要理解类实现的是什么抽象
- 尽可能使接口可编程而不是表达语义
- 把抽象和内聚放在一起考虑
第六章
6.2 良好的类接口
在类的接口中呈现一致的抽象级别
反例:
Class EmployeeCensus: pubilc ListContainer {
public:...// 这些子程序的抽象层次在Employee层void AddEmployee( Employee employee );void RemoveEmployee( Employee employee );//这些子程序的抽象层次在List层Employee NextItemInList();Employee FirstItem();Employee LastItem();...
private:...
};
程序员为了便于使用容器类的方法,直接让EmployeeCensus继承ListContainer并封装使用其方法,于是出现了混合抽象,然而这些容器类方法在雇员类层应当被隐藏。
解决方案:
Class EmployeeCensus: pubilc ListContainer {
public:...// 这些子程序的抽象层次都在Employee层void AddEmployee( Employee employee );void RemoveEmployee( Employee employee );Employee NextEmployee();Employee FirstEmployee();Employee LastEmployee();// 提高了抽象层次,将更具体的实现细节抽象成更高级的实体业务...
private:ListContainer m_EmployeeList; // 隐藏ListContainer类库的实现细节...
};
一定要理解类实现的是什么抽象
要为抽象接口负责,而不是具体实现。设计模式中的另一种解释。
例如将一个提供了150个方法的电子控件类“伪装”成一个只需提供15个方法+额外自定义方法的网格控件类,那么一定要抱着写网格控件的想法去设计类,只提供15个方法和需要的额外方法,而不是暴露一堆不需要的方法,让这个类最终看起来还是像电子控件类。
尽可能使接口可编程而不是表达语义
每个接口都由一个可编程部分和语义部分构成。可编程部分是指编译器予以强制的数据类型、属性等,如果出错会在编译时报错;语义部分则是指这个接口在逻辑上如何使用的假设,例如在调用该方法前“必须先初始化对象O”、“必须先调用方法A”、“对参数内部更具体的格式有要求”,否则就会崩溃。
对于语义部分尽量利用断言或其他技术转换为可编程部分,其次是让接口被用户清晰地理解用法,实在不行写上注释。
把抽象和内聚放在一起考虑
内聚性越好的类往往抽象一致性也不差,如果发现一个类的内聚性很差,也可以从抽象一致性的角度去考虑。