以下是一些可能变动的区域:
对硬件有依赖的地方。对于监视器、打印机、绘图机等,要清楚在尺寸、颜色、控制代码、
图形能力及内存等方面可能的变化。其余对硬件有依赖性的方面包括与磁盘、磁带、通讯口、
声音器件等接口的变化等等。
输入和输出。在比原始的硬件接口稍高一些的设计层次上,输入/输出是另外一个反复无常
的区域。如果某一应用产生它自己的数据文件,那么当这一应用变得复杂起来时,文件的格式
可能也要变化。用户层次上的输入和输出格式也有可能变化,比如,在打印纸上边界的位置、
每页上边界的数量、域的排列顺序等等。总之,检查所有的外部接口以寻找可能的变化是个好
主意。
非标准语言特性。如果在程序中使用了非标准扩展,应该把这些扩展隐含在一个模块中,
以便当运行环境变化时你可以很容易地替换它。同样,如果你使用了不是在所有环境下都存在
的库子程序,应该把实际的库子程序放在另一个环境下也可以使用的接口后面。
难于设计和实现的域。最好把难于设计和实现的域隐含起来,因为此处的工作可能作得很
糟,你可能不得不返工。把它们分隔起来,以便使由于拙劣设计或实现对系统所带来的危害最
小。
状态变量。状态变量指示程序的状态,往往比其它数据更容易被改动。在典型的情形下,
你可能最初把某一错误状态变量定义成逻辑变量。但后来又发现如果把它赋成具有 NoError,
WarningError和FatalError三个值的枚举型变量来实现会更好。
你至少可以在使用状态变量时,加上两个层次的灵活性和可读性。
· 不要使用逻辑型变量作为状态变量,应使用枚举型变量。赋予状态变量一种新状态是
非常常见的,给枚举型变量赋一个新的类型只需要重新编译一次,而对于逻辑型变量
则需要重新编写每行检查状态变量的代码,谁难谁易是很明显的。
· 使用存取子程序检查变量,而不要对其直接检查,通过检查存取子程序而不是状态变
量,可以进行更复杂的状态测试。例如,如果想检查一个错误状态变量和一个当前函
数状态变量,那么把测试隐含在子程序中来进行,要比用充斥着程序的复杂代码进行
测试容易得多。
数据规模限制。如果你说明一个数组中含有 15 个元素,那么你就把系统不需要的信息暴
露给了它。应该保护其隐私权,信息隐蔽并不总是意味着把一系列功能装入模块这类复杂的工
作,有时,它简单到就是用一个像MAX_EMPLOYEES 之类的常量来代替15,以便隐含它。
商业规则。商业规则指法律、政策、规定、惯例等编入一个计算机系统中的东西。如果你
在编写一个工资发放系统,你可能把IRS 关于允许的扣留数和估计税率等规则编入程序。其余
附加的规则是由工会规定的关于加班率、节假日付酬等方面的规定。如果你正在编写一个引用
保险率的软件,其规定来源于州关于信誉、实际保险率等的管理规定。
这些规定往往是数据处理系统中频繁变动的部分。因为国会可能修改法律,保险公司会调
整保险率。如果你遵从信息隐蔽原则,那么当规则变动时,建立在这些规则上的逻辑关系不会
完全垮掉。这些逻辑关系会隐藏在系统中唯一一个阴暗角落里,直到需对其作出改动为止。
预防到改动。当考虑一个系统中潜在的改动时,应该按照使得改动范围或大小与其改动可
能性成反比的原则来设计系统。如果改动很可能发生,要确保系统可以容易地容纳这一特征。
只有极其不可能发生的变动,才应该被允许在变动时,会影响到系统中一个以上的模块。