高质量的子程序(P161)
1.创建子程序的正当理由
- 降低复杂度
- 引入中间、易懂的抽象
- 避免代码重复
- 支持子类化
- 隐藏顺序
- 隐藏指针操作
- 提高可移植性
- 简化复杂的布尔判断
- 改善性能
- 确保所有的子程序都很小
2.在子程序层上设计
我们的目标是让每一个子程序只把一件事做好,不再做任何其他事情,即高内聚性。
功能的内聚性是最强也是最好的一种内聚性,也就是说让一个子程序仅执行一项操作。
3.好的子程序名字
有时一个子程序中仅有的问题就是其名字表述不清,而子程序本身也许设计的很好,但如果把它的名字由HandleOutput()改为FormatAndPrintOutput(),那你就很容易看清这个子程序的功能了。
4.子程序可以写多长
理论上认为的子程序最佳最大长度通常是一屏代码或打印出来一到两页的代码,也就是约50~150行。
在任何时候,复杂的算法总会导致更长的子程序,他们都非常短小。可以允许子程序的长度有序地增长到100至200行。
但是如果要编写一段超过200行代码的子程序,迟早会在可读性方面遇到问题。
5.如何使用子程序参数
- 按照输入-修改-输出的顺序排列参数
- 考虑自己创建in和out关键字
- 如果几个子程序都用了类似的一些参数,应该让这些参数的排列顺序保持一致
- 使用所有的参数
- 把状态或出错变量放在最后
- 不要把子程序的参数(输入参数)用做工作变量
- 在接口中对参数的假定加以说明
- 把子程序的参数个数限制在大约7个以内
- 考虑对参数采用某种表示输入、修改、输出的命名规则
- 为子程序传递用以维持其接口抽象的变量或对象
- 使用具名参数
- 确保实际参数与形式参数相匹配
6.使用函数时要特别考虑的问题
1)什么时候使用函数,什么时候用过程
如果一个子程序的主要用途就是返回由其名字所指明的返回值,那么就应该使用函数,否则就应该使用过程。
2)设置函数的返回值
- 检查所有可能的返回路径
- 不要返回指向局部数据的引用或指针
7.宏子程序和内联子程序
- 把宏表达式整个包含在括号内
- 把含有多条语句的宏用大括号括起来
- 用给子程序命名的方法来给展开后代码形同子程序的宏命名,以便在需要时可以用子程序来代替宏