第7章 高质量的子程序
7.1 创建子程序的正当理由
降低复杂度(缩小代码规模、改善可维护性、提高正确性):内部循环或条件判断嵌套很深,考虑子程序;
引入中间、易懂的抽象,提高可读性;
避免代码重复;
支持子类化;
隐藏顺序:把需要按顺序完成的事情放到一起,对外隐藏细节;
隐藏指针操作;
提高可移植性:不可移植的部分包括非标准功能、对硬件和操作系统的依赖等;
简化复杂的布尔判断;
改善性能,减少需要进行优化的地方;
*简单小巧的子程序
提高可读性;
为之后可能变复杂的操作进行封装;
7.2 在子程序层上的设计
功能上的内聚:一个子程序仅执行一项操作;
顺序上的内聚:一个子程序包含需按特定顺序完成的操作,它们需要共享数据,只有全部执行完毕后才完成一项功能;
通信上的内聚:一个子程序中的不同操作使用同样的数据,而不存在其他任何联系;
临时的内聚性:因为需要同时执行才放到一起的操作组成的子程序,如startup(),shutdown()等。
*不可取的内聚
过程上的内聚:特定顺序完成的操作(与顺序上的内聚有何不同?);
逻辑上的内聚:若干操作在同一子程序,通过传入控制标志选择执行(如果子程序的代码仅由if/else或case语句以及调用其他子程序的语句组成,那么是允许的,此时它的唯一功能就是发布各种命令——“事件处理器”);
巧合的内聚性:无任何关联的操作被凑在一起;
7.3 好的子程序名字
描述子程序所做的所有事情,包括输出结果及其副作用;
避免使用无意义表述不清的动词,如handle,dealwithOutput等;
不要通过数字来形成不同的子程序名字;
根据需要确定名字长度:9-15;
要对返回值有所描述;
使用语气强烈的动宾结构,如printDocument(),如果是针对对象,则可省去宾语,如document.print();
准确使用对仗词;
为常用操作确立命名规则;
7.4 子程序可以写多长
一屏代码(50-150行),方便查看上下文;
7.5 如何使用子程序参数
按照输入-修改-输出的顺序排列参数,考虑不同的命名规则;
如果几个子程序都用了类似的一些参数,应该让参数的排列顺序保持一致,产生记忆效应;
使用所有的参数;
把状态或出错变量放在最后;
不要把子程序的参数用作工作变量,应该使用局部变量,防止输入变量被修改;
在接口中对参数的假定加以说明,相比于写在注释中,更好的方式是使用断言(指明参数输入修改或输出,大卫,状态代码和错误值的含义,范围,特定数值等);
7+-2原则;