目录
第五章:程序设计
设计的特征:最小的复杂度、易于维护、松散耦合、可扩展性好、可重用性好、高扇入、低扇出、可移植性、精简性、层次性、标准技术。
最小复杂度:代码简单易于理解
易于维护:方便其他人查看,修改。
松散耦合:让程序的各个部分关联性较小,对类进行合理的抽象、封装,这样防止一个地方修改影响其他地方。
可扩展性好:在扩展系统功能时尽可能不需要修改底层,且不影响其他部分。
可重用性:使代码设计的更具有共性;
高扇入:让大量的类使用某个给定的类,是系统更好的利用底层类。
低扇出:
第六章:可以工作的类
使用ADT(抽象数据类型)的益处:
可隐藏实现细节;
改动不会影响到整个程序
让接口能提供更多信息
更容易提高性能
让程序正确性更显而易见
程序具有自我说明性
创建类的原因:
为现实世界中的对象建模;
为抽象的对象建模;
降低复杂度
隔离复杂度;
隐藏实现细节
第七章:高质量的子程序:
为什么要创建子程序:
- 降低复杂度:可以将程序的一些复杂的逻辑隐藏起来,
- 引入中间、易于抽象:有时候有些复杂的逻辑其实读者并不需要关心,这时候我们将逻辑抽象出来,起一个易于读懂的名字,这样或许会更好。
- 避免代码重复:使有些代码被更多地方复用,方便后期写代码;
- 简化复杂的布尔判断:一般复杂的布尔判断会加大代码的阅读难度,有时候获取读者只关心这一块是要做什么,不需要知道具体怎么做的,这中可以单独出来,提高可读性;
- 改善性能:使用子程序,可以只在一个地方优化代码,更方便查找代码的问题以及优化代码;
- 子程序不是越小越好;
子程序名字:
- 描述子程序做的所有事情
- 避免模糊不清的动词
- 长度:清晰度重要性一般大于长度,
- 描述返回值,就是最终要得到什么;
- 准确的对脏词
子程序的参数:
顺序:只做输入、即做输入又做输出、只做输出。
如果几个子程序有一些参数类似,尽量让这些参数顺序一致,
一般不要把子程序的变量作为工作变量,就是在子程序中用这个变量作为值或返回值,这样容易混淆;
参数一般在7个以内,
第八章:防御式编程
1、什么是防御式编程?为什么需要?
防御式编程不是指不让别人批评你的代码,而是指确保你要承担的责任,保证你的方法不会因为传入错误数据而破坏,看似微小的防范,收益可能大于你的想象,能够让错误更容易发现,修改,并减少对已经编写代码的修改
2、如何使用防御式编程?
在开发阶段,建议不从产品角度考虑,建议让错误暴露的越明显越好,能更快的排查错误;在产品上线时,防御式编程的代码可能影响性能以及体验,需要适当修改,但是需要根据场景考虑,比如银行设备以及普通网站,不同产品,错误处理方式不一样;
隔离程序与参数,即对参数进行验证,使之能包容错误造成的损害,并进行适当处理;
3、处理方法:
- 检查所有来源外部数据的值
- 子程序对参数做检查
3、选择合适的方案输出错误
4、面对错误的处理具体方式:
- 返回中立值:根据错误数据返回一个正确的值
- 返回与之前相同的值
- 用一个接近的合法值
- 返回错误码、根据错误返回不同的提示、直接抛出异常;
- 严重时关闭程序
5、关于异常
避免在构造和析构函数中使用异常;考虑创建一个集中的方式处理异常,能够为一些与异常有关的信息提供集中的存储;把项目中对异常的使用标准化,考虑创建抛出异常的基类,这样就能把记录日志、报告错误等操作集中起来并标准化;不滥用异常,应该在异常和其他错误处理手段进行权衡,如果某些错误能局部处理,那就局部处理它;
第九章:使用变量的一般事项
变量的初始化:
1、在声明变量的时候初始化。
2、理想情况下,在靠近第一次使用变量的位置声明和定义改变量。
3、在可能的情况下使用final或者const。
4、重复使用的变量注意初始化
作用域
1、使变量的引用局部化,减小变量的作用域:
2、在循环开始之前再去初始化该循环里使用的变量,而不是在该循环所属的子程序的开始处初始化这些变量。
3、直到变量即将被使用时再为其赋值。
4、把相关语句放在一起,可能的情况下提取成单独的子程序。
5、开始时采用最严格的可见性(比如设为private),然后根据需要扩展变量的作用域。
6、“方便性”和“智力可管理性”两种理念之间的区别,归根结底来源于侧重写程序还是读程序之间的区别。
7、每个变量只应该用于单一用途,且不应该有隐藏含义(比如当x大于5000时代表什么)。
第十一章:变量名的力量
1、一个好名字通常表达的是“what”而不是“how”。一般而言,如果一个名字反映了计算的某些方面而不是问题本身,那么它反映的就是“how”而不是“what”了。
2、较长的名字适用于较长的作用域,较短的名字适用于短的作用域(循环、小的方法等)。
3、计算限定词注意,如Total、Sum、Average、Min、Max、String、Pointer等等,应该放在名字的最后。
4、变量名的队长词要准确;
5、典型的布尔变量名:done(表示是否完成), error(表示是否发生错误), found(表示寻找、获得的布尔), success, ok(表示操作的状态)等。布尔变量应该是那些隐含了“真/假”含义的名字,如done和success等。应该使用肯定的布尔变量命名,而不是notFound,notDone等。
避免使用具有相似含义的名字。如果你能够交换两个变量的名字而不会妨碍对程序的理解,那么你就需要为这两个变量重新命名了。
命名规则应该能够区分局部数据、类的数据和全局数据。
应该避免的名称:避免使用令人误解的名字或缩写;避免使用具有相似含义的名字;避免使用不同含义名字却相似的名字;避免名字中使用数字;避免在名字中包含混淆的字符;