用新的通用子程序。通过使公共代码只出现一次,可以节约许多空间。这时改动也很方便,因
为只要在一个地方改动代码就可以了。这时代码也更可靠了,因为只需在一个地方检查代码。
而且,这也使得改动更加可靠,因为,不必进行不断地、非常类似地改动,而这种改动往往又
是认为自己编写了相同的代码这一错误假设下进行的。
限制了改动带来的影响。由于在独立区域进行改动,因此,由此带来的影响也只限于一个
或最多几个区域中。要把最可能改动的区域设计成最容易改动的区域。最可能被改动的区域包
括:硬件依赖部分、输入输出部分、复杂的数据结构和商务规则。
隐含顺序。把处理事件的非特定顺序隐含起来是一个很好的想法。比如,如果程序通常先
从用户那里读取数据,然后再从一个文件中读取辅助数据,那么,无论是读取用户数据的子程
序,还是读取文件中数据的子程序,都不应该对另一个子程序是否读取数据有所依赖。如果利
用两行代码来读取堆栈顶的数据,并减少一个Stacktop变量,应把它们放入一个PopStack()子程
序中,在设计系统时,使哪一个都可以首先执行,然后编写一个子程序,隐含哪一个首先执行
的信息。
改进性能。通过使用子程序,可以只在一个地方,而不是同时几个地方优化代码段。把相
同代码段放在子程序中,可以通过优化这一个子程序而使得其余调用这个子程序的子程序全部
受益。把代码段放入子程序也使得用更快的算法或执行更快的语言(如汇编)来改进这段代码
的工作变得容易些。
进行集中控制。在一个地方对所有任务进行控制是一个很好的想法。控制可能有许多形式。
知道一个表格中的入口数目便是其中一种形式,对硬件系统的控制,如对磁盘、磁带、打印机、
绘图机的控制则是其中另外一种形式。使用子程序从一个文件中进行读操作,而使用另一个子
程序对文件进行写操作便是一种形式的集中控制。当需要把这个文件转化成一个驻留内存的数
据结构时,这一点是非常有用的,因为这一变动仅改变了存取子程序。专门化的子程序去读取
和改变内部数据内容,也是一种集中的控制形式。集中控制的思想与信息隐含是类似的,但是
它有独特的启发能力,因此,值得把它放进你的工具箱中。
隐含数据结构。可以把数据结构的实现细节隐含起来,这样,绝大部分程序都不必担心这
种杂乱的计算机科学结构,而可以从问题域中数据是如何使用的角度来处理数据。隐含实现细
节的子程序可以提供相当高的抽象价值,从而降低程序的复杂程度。这些子程序把数据结构、
操作集中在一个地方,降低了在处理数据结构时出错的可能性。同时,它们也使得在不改变绝
大多数程序的条件下,改变数据结构成为可能。
隐含全局变量。如果需要使用全局变量,也可以像前述那样把它隐含起来、通过存取子程
序来使用全局变量有如下优点:不必改变程序就改变数据结构;监视对数据的访问;使用存取
子程序的约束还可以鼓励你考虑一下这个数据是不是全局的;很可能会把它处理成针对在一个
模块中某几个子程序的局部数据,或处理成某一个抽象数据的一部分。
隐含指针控作。指针操作可读性很差,而且很容易引发错误。通过把它们独立在子程序中,
可以把注意力集中到操作意图而不是机械的指针操作本身。而且,如果操作只在一处进行,也
更容易确保代码是正确的。如果找到了比指针更好的数据结构,可以不影响本应使用指针的子
程序就对程序作改动。
重新使用代码段。放进模块化子程序中的代码段重新使用,要比在一个大型号程序中的代
码段重新使用起来容易得多。