# 第二部分
## 第7章 高质量的子程序
输入变量的值不应该被改变
慎用全局变量
子程序的作用应该单一而明确
注意防范错误的输入数据
不应该直接使用意义不明的数值
子程序参数不应太多,最好不要超过7个
子程序的参数应按照规律顺序排布
子程序的有效注释要充分
子程序的命名要能概括其作用
### 7.1 创建子程序的正当理由
降低复杂度
引入中间、易懂的抽象
避免代码重复
支持子类化
隐藏顺序
隐藏指针操作
提高可移植性
简化复杂的布尔判断
改善性能
确保所有子程序都很小
隔离复杂度
隐藏实现细节
限制变化所带来的的影响
隐藏全局数据
行程中央控制点
促成可重用的代码
达到特定的重构目的
## 7.2 在子程序层上设计
内聚性,子程序中各种操作之间联系的紧密程度
功能的内聚性
顺序上的内聚性
通讯上的内聚性
临时的内聚性
过程上的内聚性
逻辑上的内聚性
巧合上的内聚性
## 7.3 好的子程序名字
描述子程序所做的所有事情
避免使用无意义的、模糊或表述不清的动词
不要仅通过数字来行程不同的子程序名字
根据需要确定子程序名字的长度
给函数命名时要对返回值有所描述
给过程起名时使用预期强烈的动词加宾语的形式
准确使用对仗词
为常用操作确立命名规则
## 7.4 子程序可以写多长
最好在200行之内
## 7.5 如何使用子程序参数
按照输入-修改-输出的顺序排列参数
考虑自己创建in和out关键字,C++中的const来定义输入参数更为适宜
如果几个子程序都用了类似的一些参数,应该让这些参数的排列顺序保持一致
使用所有的参数
把状态或出错变量放在最后
不要把子程序的参数用作工作变量
在接口中对参数的假定加以说明,合理使用断言
把子程序的参数个数限制在大约7个以内
考虑对参数采用某种表示输入、修改、输出的命名规则
为子程序传递用以维持其接口抽象的变量或对象
使用具名参数
确保实际参数与形式参数相匹配
## 7.6 使用函数时要特别考虑的问题
## 7.7 宏子程序和内联子程序
把宏表达式整个包含在括号内
把含有多条语句的宏用大括号括起来
```
#define LookupEntry(key,index){
index = (key - 10)/5;
index = min(index,MAX_INDEX);
index = max(index,MIN_INDEX);
}
```
用给子程序命名的方法来展开后代码形同子程序的宏命名,以便在需要时可以用子程序来替换宏
宏子程序在使用上的限制