第6章: 可以工作的类
包含与继承:
- 继承的语义是"是一个", 而包含的语义是"有一个"
- 相比之下继承的复杂度更高, 如果你难以判断用包含还是继承, 就用包含
- 只使用最基本的继承关系, 尽量避免深层嵌套的继承和多重继承
一些小的点:
- 使用类的最大作用之一是将信息隐藏
- 尽量让类和成员函数与存储数据的方式无关
- 要让类的结构在同一个层次上
- 封装一般是指通过一些语法手段, 强制阻止你看到细节, 有助于保护抽象不会破坏
第7章: 高质量的子程避免
原则性问题:
- 子程序的设计要考虑内聚性: 保证每个子程序只做一件事
一些小的点:
- 好的函数名字:
- 包含所有事情
- 对返回值有所描述
- 长度不最多在20个字符左右
- 在整个项目中规则一致
- 即使某个操作很短, 如果它适合写成函数(比如出现了很多次, 有明确的逻辑含义), 那么也是有必要的.
- 函数很长不重要, 但要保证逻辑上只做了一件事情. 复杂的算法或业务逻辑确实会导致很长的函数, 这无法避免. 但通常超过200行的函数会严重影响可读性.
- 参数很多时, 将输入和输出函数分别放在一起
- 如果使用宏, 要注意用小括号保证运算顺序, 用大括号包含多个子句
- 尽量不用宏, 而是用inline, const, typedef等代替
第8章: 防御式编程
原则性问题:
- 防御式编程包括错误处理, 异常, 断言等. 它有众多优点, 但也会使程序变得复杂, 缓慢, 应该适当地使用.
- 要区分产品级软件(release版本)和开发级软件(debug版本), 有区别地使用防御式编程
一些小的点:
- 用断言处理绝不应该发生的状况, 用错误代码处理预期会发生的状况
- 只有在真正例外的情况下才抛出异常
- 避免在构造函数和析构函数中使用异常
- 建立隔离层, 集中地处理错误, 以减少程序的复杂度
第9章: 伪代码编程过程
一些小的点:
- 避免使用特定语言的语法元素: 伪代码的层次要高于代码
- 描述解决问题的方法, 而不是如何实现
- 伪代码应该能很容易转化成代码, 否则说明它不够详细, 掩盖了一些问题