程序员的首要使命:管理复杂服
1、类的目标:开发程序其他部分时,可以安全的忽视程序中尽可能多的其余部分,总体目标是像在现实世界一样操作实体,而不必在意底层的实现;
2、隐藏实现细节(修改一处而达到修改所有其他地方)、容易日后提高性能、程序的自我说明性更好;
3、类的接口设计:展现出一致的抽象层次、强内聚性、提供成对的服务、把不相关的信息转移到其他类中、尽量让接口可编程而不是表达语义(比如routine A 必须要Routine B之前调用,这类函数不应该做为接口,也就是说尽量让程序员不看类的内部实现可以轻松用起来这个类)、在增加类的方法时不要破坏一致的抽象层次;
4、抽象:提供一个让你忽略实现细节的模型来管理程序的复杂度; 封装:强制阻止你看到细节;
5、尽可能的private成员函数,不要把数据成员公有,避免把私有的成员函数放入接口;
6、私有属性在头文件中,不利于封装,方法是彻底将接口和实现分开,在接口的私有数据中保存一个指向实现类的对象的指针即可;
7、避免使用友元类,增加了复杂度;
8、阅读代码的次数远比写代码的次数多,时刻注意代码的质量;
9、注意抵制从语义上破坏封装性:比如,A的..函数会调用B的..函数,所以不用在B的函数调用前去调用A的函数;总结的意思就是,这个函数内部有一些细节你不看代码就不会知道,这类破坏封装的操作成为语义破坏封装; 错误是接口不仅仅依赖于抽象,还依赖于实现;
10、 包含关系(有一个...)、继承关系(是一个...);
11、类的数据成员不要超过 7 个;
12、慎用继承:派生类必须能通过基类的接口而被使用,而且使用者无需知道两者的区别;
13、继承层次控制在3层以内,不同的人认为是7层;
14、类的成员函数尽可能少、禁止一些你不需要的运算符重载(设置为private)、间接调用尽可能少(即A类的方法传入B类,调用B类的方法),总结来说,减少类和类之间的合作的范围;
15、构造函数要初始化全部数据成员;
16、优先选用深拷贝;
17、为什么要创建类? 降低复杂度、隔离复杂度、隐藏实现细节、复用代码;
18、避免创建万能类、无间紧要的类、动词命名的类