子程序在结构设计中应该被指出:
子程序将要包含的信息
子程序的输入
子程序的输出,包括受到影响的全局变量
子程序将如何处理错误
创建子程序:
是否检查过先决条件已经满足了吗
定义子程序将要解决的问题了吗
结构设计是否足够清楚
如何测试子程序
是否从模块化水平或满足时间和内存需求角度考虑过效率问题
是否查阅过参考书,寻找有帮助的算法
必要时,是否在逻辑设计之前考虑了数据
是否注意到足以使你返回到结构设计阶段的警告
在作出假设时,验证他们了吗
是否彻底理解你的代码,它容易理解吗
生成子程序的原因:
可取的内聚性:
耦合层次:
确保实际参数与形式参数匹配
按照输入-修改-输出的顺序排列参数
如果几个子程序使用了相似的参数,应按照不变的顺序排列这些参数
使用所有的参数
把状态和“错误”变量放在最后
不要把子程序中的参数当工作变量
说明参数的接口假设
参数个数限制在7个左右
考虑建一个关于输入、修改和输出的命名约定
仅传递子程序需要的那部分结构化变量
不要对参数传递做出任何设想
子程序将要包含的信息
子程序的输入
子程序的输出,包括受到影响的全局变量
子程序将如何处理错误
创建子程序:
是否检查过先决条件已经满足了吗
定义子程序将要解决的问题了吗
结构设计是否足够清楚
如何测试子程序
是否从模块化水平或满足时间和内存需求角度考虑过效率问题
是否查阅过参考书,寻找有帮助的算法
必要时,是否在逻辑设计之前考虑了数据
是否注意到足以使你返回到结构设计阶段的警告
在作出假设时,验证他们了吗
是否彻底理解你的代码,它容易理解吗
生成子程序的原因:
1、降低复杂性
减小代码段的篇幅,改进可维护性和正确性;避免代码重复;无需考虑内部实现细节,只需调用即可。
2、限制了改动带来的影响
最可能被改动的区域包括:硬件依赖部分、输入输出部分、复杂的数据结构和商务规则
3、隐含顺序
把处理事件的非特定顺序隐含起来
4、改进性能
可以只在一个地方优化代码段
5、进行集中控制
专门化的子程序去读取和改变内部数据内容,也是一种集中的控制形式
6、隐含数据结构
7、隐含全局变量
8、隐含指针操作
9、重新使用代码段
10、提高部分代码的可读性
11、提高可移植性
12、分隔复杂操作
13、简化复杂的布尔测试
测试的细节已经被隐藏了;清楚的函数名称已经概括了测试目的。
可取的内聚性:
功能内聚性:当程序执行一项并且仅仅是一项工作时
顺序内聚性:在子程序内包含需要按特定顺序进行的、逐步分享数据而又不形成一个完整功能的操作
通讯内聚性:在一个子程序中,两个操作只是使用相同数据,而不存在其他联系时产生的
临时内聚性:因为同时执行的原因才被放进同一个子程序里。耦合层次:
简单数据耦合:两个子程序之间传递的数据是非结构化的,并且全部都是通过参数表进行的
数据结构耦合:两个子程序之间传递的数据是结构化的,并且是通过参数表实现传递的
控制耦合:一个子程序通过传入另一个子程序的数据通知它该做什么
全局数据耦合:两个子程序使用同一个全局数据子程序参数:程序中39%的错误都是内部接口错误,即子程序间的通信错误。
确保实际参数与形式参数匹配
按照输入-修改-输出的顺序排列参数
如果几个子程序使用了相似的参数,应按照不变的顺序排列这些参数
使用所有的参数
把状态和“错误”变量放在最后
不要把子程序中的参数当工作变量
说明参数的接口假设
参数个数限制在7个左右
考虑建一个关于输入、修改和输出的命名约定
仅传递子程序需要的那部分结构化变量
不要对参数传递做出任何设想