子程序是为实现一个特定的目的而编写的一个可被调用的方法(method)或者过程(procedure)。创建子程序最主要的目的是提高程序的可管理性、可读性、可靠性和可修改性。

1、创建子程序的正当理由

  • 降低复杂度
  • 引入中间、易懂的抽象
  • 避免代码重复
  • 支持子类化
  • 隐藏顺序
  • 隐藏指针操作
  • 提高可移植性
  • 简化复杂的布尔判断
  • 改善性能

2、子程序的内聚性

子程序的内聚性,是指子程序中各种操作之间联系的紧密程度。我们的目标是让每一个子程序只把一件事情做好,不再做任何其他事情,以得到更高的可靠性。子程序的内聚性可以从以下概念思考:

  • 功能的内聚性
  • 顺序上的内聚性
  • 通信上的内聚性
  • 临时的内聚性
  • 过程上的内聚性
  • 逻辑上的内聚性
  • 巧合的内聚性

3、好的子程序名字

  • 描述子程序所做的所有事情
  • 避免使用无意义的、模糊或表述不清的动词
  • 不要仅通过数字来形成不同的子程序名称
  • 根据需要确定子程序名字的长度
  • 给函数命名时,需要对返回值有所描述
  • 给过程起名时使用与其强烈的动词加宾语的形式
  • 准确使用对仗词
  • 为常用操作确立命名规则

4、子程序可以写多长

大部分的子程序都非常短小,复杂的算法总会导致更长的子程序,这时可以允许子程序的长度增长到100~200行(不算注释和空行),超过200行的代码,在可读性方面会有问题。

5、如何使用子程序的参数

  • 按照输入-修改-输出的顺序排列参数
  • 考虑自己创建in 和 out关键字
  • 如果几个子程序都用了类似的一些参数,应该让这些参数的排列顺序保持一致
  • 使用所有的参数
  • 把状态或出错变量放在最后
  • 不要把子程序的参数用作工作变量
  • 在接口中对参数的假定加以说明
  • 把子程序的参数个数限制在大约7个以内
  • 考虑对参数采用某种标示输入、修改、输出的命名规则
  • 为子程序传递用以维持接口抽象的变量或对象
  • 使用具名参数
  • 确保实际参数与形式参数相匹配

6、使用函数是要特别考虑的问题

  • 什么时候使用函数,什么时候使用过程

    如果一个子程序的主要用途就是返回由其名字所指明的返回值,那么就应该使用函数,否则应该使用过程

  • 设置函数的返回值

    • 检查所有可能的返回路径
    • 不要返回指向局部数据的引用或指针

7、宏子程序和内联子程序

  • 把宏表达式整个包含在括号内
  • 把含有多条语句的宏用大括号括起来
  • 用给子程序命名的方法来给展开后代码形同子程序的宏命名,以便在需要时,可以用子程序来替代宏
  • 除非万不得已,不要使用宏来代替子程序
  • 节制使用内联(inline)子程序

更多有关《代码大全 2》的读书笔记,请关注 :
http://tabalt.net/blog/code-complete-2-reading-notes/

本文链接:http://tabalt.net/blog/cc2-high-quality-routines/,转载请注明。