摘自:《代码大全》
高质量的子程序
1. 创建子程序的理由
1.1 降低复杂度
1.2 引入中间的、易懂的抽象
1.3 避免代码重复
1.4 支持子类化
1.5 隐藏顺序
1.6 隐藏指针操作
1.7 提高可移植性
1.8 简化复杂的逻辑判断
1.9 改善性能
除此之外,创建类的很多理由也是创建子程序的理由
1.10 隔离复杂度
1.11 隐藏实现细节
1.12 限制编号所带来的影响
1.13 隐藏全局数据
1.14 形成中央控制点
1.15 促成可重用的代码
1.16 达到特定的重构目的
2. 子程序的内聚性
2.1 可接受的内聚性
2.1.1 功能的内聚性
2.1.2 顺序上的内聚性
2.1.3 通信上的内聚性
2.1.4 临时的内聚性
2.2 不可取的内聚性
2.2.1 过程上的内聚性
2.2.2 逻辑上的内聚性
高质量子程序核对表
大局事项
创建子程序的理由充分吗?
一个子程序中所有适于单独提出的部分是不是已经被提出到单独的子程序中了?
过程的名字中是否用了强烈、清晰的“动词+宾语”词组?函数的名字是否描述了其返回值?
子程序的名字是否描述了它所做的全部事情?
是否给常用的操作建立了命名规则?
子程序是否具有强烈的功能上的内聚性?即它是否做且只作一件事,并且把它做得很好?
子程序之间是否由较松散的耦合?子程序与其它子程序之间的连接是否是小的(small)、明确的(intimate)、可见的(viaible)和灵活的(flexible)?
子程序的长度是否是由其功能和逻辑自然确定,而非遵循任何人为的编码标准?
参数传递事宜
整体来看,子程序的参数表是否表现出一种具有整体性且一致的接口抽象?
子程序参数的排列顺序是否合理?是否与类似的子程序的参数排列顺序相符?
接口假定是否已在文档中说明?
子程序的参数个数是否没有超过7个?
是否用到了每一个输入参数?
是否用到了每一个输出参数?
子程序是否避免了把输入参数用作工作变量?
如果子程序是一个函数,那么它是否在所有可能的情况下都能返回一个合法的值?
高质量的子程序
1. 创建子程序的理由
1.1 降低复杂度
1.2 引入中间的、易懂的抽象
1.3 避免代码重复
1.4 支持子类化
1.5 隐藏顺序
1.6 隐藏指针操作
1.7 提高可移植性
1.8 简化复杂的逻辑判断
1.9 改善性能
除此之外,创建类的很多理由也是创建子程序的理由
1.10 隔离复杂度
1.11 隐藏实现细节
1.12 限制编号所带来的影响
1.13 隐藏全局数据
1.14 形成中央控制点
1.15 促成可重用的代码
1.16 达到特定的重构目的
2. 子程序的内聚性
2.1 可接受的内聚性
2.1.1 功能的内聚性
2.1.2 顺序上的内聚性
2.1.3 通信上的内聚性
2.1.4 临时的内聚性
2.2 不可取的内聚性
2.2.1 过程上的内聚性
2.2.2 逻辑上的内聚性
高质量子程序核对表
大局事项
创建子程序的理由充分吗?
一个子程序中所有适于单独提出的部分是不是已经被提出到单独的子程序中了?
过程的名字中是否用了强烈、清晰的“动词+宾语”词组?函数的名字是否描述了其返回值?
子程序的名字是否描述了它所做的全部事情?
是否给常用的操作建立了命名规则?
子程序是否具有强烈的功能上的内聚性?即它是否做且只作一件事,并且把它做得很好?
子程序之间是否由较松散的耦合?子程序与其它子程序之间的连接是否是小的(small)、明确的(intimate)、可见的(viaible)和灵活的(flexible)?
子程序的长度是否是由其功能和逻辑自然确定,而非遵循任何人为的编码标准?
参数传递事宜
整体来看,子程序的参数表是否表现出一种具有整体性且一致的接口抽象?
子程序参数的排列顺序是否合理?是否与类似的子程序的参数排列顺序相符?
接口假定是否已在文档中说明?
子程序的参数个数是否没有超过7个?
是否用到了每一个输入参数?
是否用到了每一个输出参数?
子程序是否避免了把输入参数用作工作变量?
如果子程序是一个函数,那么它是否在所有可能的情况下都能返回一个合法的值?