《代码大全2》
《代码大全2》
第六章 可以工作的类
- 抽象数据类型ADT :一组数据 和 对其的操作
- 类可以看成是 ADT + 继承 +多态
- 良好的类接口,类接口可以看成类共有子程序所构成的集合
- 类接口应该表现一致的抽象层次。
- 尽可能让接口可编程,而不是表达语义。将接口中逻辑部分转换为编辑器能实施的部分,如使用assert等。
- 一般来说应该尽量减少类和类之间相互合作的范围
- 减少实例化对象的数量
- 减少实例对象调用不同子程序的数量
高质量的子程序
- 变量名最好在9~15个字母之间
- 子程序名(方法名)则视命名是否清晰易懂而定
- 子程序的行数不要超过200行(不算注释与空行),否则可读性会下降
- 不要把子程序的参数用与计算处理,要用局部变量在子程序内处理
- 为子程序传递参数是多个变量还是一个对象,应该根据子程序参数的抽象层次上考虑。
防御式编程
- 子程序应该不应传入错误数据而被破坏
- 来写自己的断言,(在生产阶段关闭断言)
- 用断言来处理绝不应该发生的情况,而用错误处理代码来处理预期可能发生的状况。
- 隔离程序使其包容由错误产生的损害,让软件的某些部分处理“不干净的数据”,而让另一部分处理“干净的数据”,比如类的公用方法可以处理不干净的数据,而在调用私有方法时则认为数据都是干净的。在得到外部数据时可以得到清理,有时候多层清理也是应当的。
伪代码的编码过程
- 不要涉及编程语言,从子程序的意图上去写伪代码,伪代码可以在之后变成子程序的注释
- 子程序的高层设计至少要说明:
- 子程序要隐藏的信息
- 各项输入信息
- 输出信息
- 调用子程序的前条件
- 子程序在回调之前要确保后条件成立
使用变量的一般事项
- 在靠近变量第一次使用的地方初始化它(代码不会看起来很乱吗?)
- 在可能的情况下使用final
- 在类的构造函数中初始化数据成员(对应的是在析构函数中释放内存,如果在gc机制的语言中,这点还必要吗?)
- 尽量减少变量的作用域和生存时间增加代码的可读性,虽然写的时候可能麻烦一点)
- 为变量指定单一用途(接口中的方法也一样)(增加代码的可读性,写的时候可能麻烦一点)
变量名的力量
- 对变量的描述就是最佳的变量名
- 为循环下标命名(而不是简单的使用 i j k)
- 标记全局变量(加上g_)()
组织直线型代码
- 尽力写没有顺序依赖的代码;如果必须有,用子程序名来表明顺序依赖关系,或者在注释中注明。
使用条件语句
- 首先处理正常情况,并将正常情况放在if处 而不是else处。
重构
- 重构的理由
- 代码重复
- 冗长的子程序
- 循环过长或者嵌套过深
- 类的借口未能提供层次一致抽象
- 拥有太多的参数列表
- 重构策略
- 在增加子程序的时候重构
- 在添加类的时候重构
- 在修补缺陷的时候重构
- 关注易于出错的模块
- 重构的含义在于不影响程序行为的前提上改进可运行的代码
代码调整方法
- 在知道结果时停止判断
- 按照出现的频率来调整判断顺序
- 在循环中,如果循环是一个查找循环,可以使用哨兵值来减少每次循环所需要的判断时间
- 将所需要查找的值放在数组的末尾,这样可以保证循环一定会停止,也可以减少每次循环判断 i < array,count的判断时间。
- 多层循环时,将循环次数多的放在循环的外围。
个人性格
- 力图理解编译器的错误
- 彻底理解自己的程序而不是看看程序员是否能运行
- 有时候一个程序太大,过一段时间真的理解不过来啊。。
- 在开发过程中建立自我意识,如果分配给你的净是些不能提升自己能力的短期工作,你理应表示不满。
感觉一般,感觉这本书主要讲的还是提升代码的可阅读性。