使用伪代码或程序设计语言规划程序的功能结构,流程。(清晰化)
当你生成实际代码时,你倾向于不修改代码,哪怕有bug。
程序设计的设计问题
. 这个子程序将要隐含的信息。
· 这个子程序的输入。
· 这个子程序的输出,包括受到影响的全局变量。
· 这个子程序将如何处理错误?
5.1.2 创建子程序的理由总结
以下是创建子程序理由概述
· 降低复杂性
· 避免重复代码段
· 限制改动带来的影响
· 隐含顺序
· 改进性能
· 进行集中控制
· 隐含数据结构
· 隐含指针操作
· 隐含全局变量
· 促进重新使用代码段
· 计划开发一个软件族
· 改善某一代码段可读性
· 改善可移植性
· 分隔复杂操作
· 独立非标准语言函数的
· 简化复杂的布尔测试
可取的内聚性
功能内聚性。功能内聚性是最强也是最好的一种内聚,当程序执行一项并且仅仅是一项工作时,就是这种内聚性
顺序内聚性。顺序内聚性是指在子程序内包含需要按特定顺序进行的、逐步分享数据而又不形成一个完整功能的操作,假设一个子程序包括五个操作:打开文件、读文件、关闭文件
通讯内聚性。通讯内聚性是在一个子程序中,两个操作只是使用相同数据,而不存在其它任何联系时产生的。
临时内聚性。因为同时执行的原因才被放入同一个子程序里,这时产生临时内聚性。典型的例子有;Startup() ,CompleteNewEmployee(),Shutdown() 等等,
不可取内聚
过程内聚性。当子程序中的操作是按某一特定顺序进行的,就是过程内聚性。与顺序内聚性不同,过程内聚性中的顺序操作使用的并不是相同数据。比如,如果用户想按一定的顺序打印报告,而所拥有的子程序是用于打印销售收入、开支、雇员电话表的.
逻辑内聚性。当一个子程序中同时含有几个操作,而其中一个操作又被传进来的控制标志所选择时,就产生了逻辑内聚性。之所以称之为逻辑内聚性,是因为这些操作仅仅是因为控制流,或者说“逻辑”的原因才联系到一起的,它们都被包括在一个很大的if 或者case 语句中,它们之间并没有任何其它逻辑上的联系。
偶然内聚性。当同一个子程序中的操作之间无任何联系时,为偶然内聚性。也叫作“无内聚性”。
“正常耦合”,这也是一种最好的耦合。序了解被调子程序的内容与结构。 传统上,把耦合层次称为非直觉性(unintuitive)。所以,在以下叙述中,将交替使用这两
个名字。在以下叙述中,既有好的耦合,也有不好的耦合。
简单数据耦合。如果两个子程序之间传递的数据是非结构化的,并且全部都是通过参数表进行的,这通常称作 数据结构耦合。如果在两个程序之间传递的数据是结构化的,并且是通过参数表实现传递的,它们之间就是数据结构耦合的。这种耦合有时也称之为“邮票耦合”(stamp coupling)(不过我总觉得这种叫法非常奇怪)。如果使用恰当的话,这种耦合也不错,它与简单耦合的主要区别是它所采用的数据是结构化的。
控制耦合。如果一个子程序通过传入另一个子程序的数据通知它该作什么,那么这两个子程序就是控制耦合的。控制耦合是令人不快的,因为它往往与逻辑内聚性联在一,并且,通常都要求调用程 全局数据耦合。如果两个子程序使用同一个全局数据,那它就是全局数据耦合的。这也就是通常所说的“公共耦合”或“全局耦合”。如果所使用的数据是只读的,那么这种耦合还是可以忍受的,但是,总的来说,全局耦合是不受欢迎的,因为这时子程序之间的联系既不密切,又不可见。这种联系容易被疏漏掉,甚至可以认为它是一种由信息隐含带来的错误——信息丢失。
不合理耦合(pathological)。如果一个子程序使用了另外一个子程序中代码,或者它改变了其中的局部变量,那么它们就是不合理耦合的。这种耦合也称之为“内容耦合”。这一类耦合是不能接受的,因为它不满足关于耦合规模、密切性、可见性和灵活性中的任何一条标准。虽然这是一个很紧的联系,但是这种联系却是不密切的。改动另一个子程序中的数据无异于在其后背桶上一刀,而且,这背后一刀从表面上又是看不出来的。由于它是建立在一个子程序完全了解另一个程序内容的止不合理耦合的语法规则。但是,在 Basic或汇编语言中,它却是允许的。因此,在用这种语言编程时,一定要小心!
· 最近研究发现,当子程序长度是100 到150 行时,错误率最低(Lind 和Variavan 1989)。 《是不是我就不懂了,就觉得这个结果很有趣》
从来不会输出乱七八糟像垃圾似的东西,不管它被输入的是什么。一个好程序的特点是“输入垃圾,什么也不产生”,或“输入垃圾,输出错误信息”,也可以是“不允许 一个好的程序垃圾进入”。
按照输入一修改一输出的顺序排列参数。
使用所有的参数.
把状态和“错误”变量放在最后。
。如果假定被传入子程序的数据具有某种特性,那么需要对这个假设序的地方都需要说明这一假设,这绝不是浪费时间。不要等再回过头来说明这些假设,因为那时很可能你已经忘记这些假设了。如果能在 说明参数的接口假作出说明。在子程序中和在调用程到写完子程序后代码中放入断言的话,那么其效果要好于说明这些假设。