这部分主要涉及设计的风格的事宜:基本观点还是那句话,高内聚,低耦合,扩展性强,简单
第5条 一个实体应该只用一个紧凑的职责
一次只解决一个问题。一个实体只负责一件事。
一个实体职责过多,导致实体多重性格,难控制
典型反例:
realloc() 函数
C++ basic_string 类
第6条 正确,简单和清晰第一
KISS(keep it simple oftware)
典型反例:
不必要的C++ 操作符号重载
使用临时变量作为构造函数的参数
第7条 编程中应知道何时和如何考虑可伸缩性
(1)使用灵活的,动态分配的数据,不要使用固定大小的数组
(2)了解算法的实际复杂性
(3)优先使用线性算法或者尽可能快的算法
(4)尽可能避免劣于线性复杂度的算法
(5)永远不要使用指数负载型的算法,除非你已经山穷水尽了。
测试数据表明优化是非常必要的且重要。
第8条 不要进行不成熟的优化
第9条 不要进行不成熟的劣化
第10条 尽量减少全局和共享数据
共享会导致冲突:避免共享数据,尤其是全局数据。共享数据会增加耦合度,提高维护成本,降低性能
全局名字空间中的对象名称会无缘全局名字空间
共享数据对单元测试不利
共享数据和全局数据会减少多线程和多处理器环境的并行性
尽量降低类间的耦合性,尽量减少交互
第11条 隐藏信息
第12条 懂得何时和如何进行并发性编程
尽量减少共享数据,安全地共享必须共享数据
安全法则:
(1)参考目标平台的文档,了解该平台的同步化原语(原子整数,内存障珊,互斥体)
(2)把平台原语用自己设计的抽象类封装
(3)确保正在使用的类型在多线程中使用是安全的
外部加锁
内部加锁(是否为共享对象类,控制加锁的粒度)
不加锁(只读对象)
第13条 确保资源为对象所拥有。使用显式的RAII和智能指针
不要在一条语句中分配一个以上的资源。RAII(resource acquiresition is intialization)
每当处理需要配对的获取、释放函数调用的资源时,应该把该资源封装在一个对象中。
确保所有资源都为对象所有,用智能指针来保存动态分配的资源,同样应该显式地执行资源分配。