往是一个深受欢迎的软件与被人弃之不用的软件间的主要不同之处。
这部分结构应该是模块化的,这样,当用新的界面代替旧的时,就不致影响到处理和输出
部分。比如,这部分结构应该使得用批处理接口替代交互式界面的工作非常容易。这种能力是
很有用的,特别是在单元测试和子系统测试阶段。
用户界面设计本身就值得写一部专著,但本书并未涉及这一内容。
输入/输出。输入/输出是结构中另一个应引起重视的部分。结构中应规定采用向前看、
向后看还是当前规则的查询方式。同时,还应该指出在哪个层次上检查输入/输出错误,是在
区域层次、记录层次还是在文件层次上。
内存管理。内存管理是结构设计中应该处理的另一个重要部分,结构中应该对正常和极端
情况下所需要的内存作出估计。例如,如果你正在写数据表,那么结构就应估计其中每一个单
元所需的内存。它还应估计正常表格和最大表格所需要的内存。在简单情形下,这种估计应表
明内存在某项功能的实现环境中是正常的。在复杂情况下,可能不得不建立自己的内存管理系
统,如果是这样,那么内存管理程序的设计应和系统其它部分一样,需要认真对待。
字符串存储。在交互式系统中,字符串存储也应在结构设计阶段予以重视。在这种系统中,
往往包含了大量的提示、帮助信息和状态显示。应该估计被字符串所占用的内存。如果程序是
商用的,那么,结构中应该考虑到典型的字符串问题,包括字符串的压缩,不必修改代码即可
保持字符串,以及保证在译成外文时对代码的影响将是最小的。结构设计可以决定字符串的使
用方法,是编码在程序中,还是把它保存在数据结构中。是需要时通过存取子程序调用,还是
把它存在一个源文件中,结构设计应该指明采用哪种方法及其原因。
错误处理
错误处理已成为当代计算机科学中最棘手的问题,没有谁能担负起频繁应付它的负担。有
人估计,程序中有90%的代码是为了应付例外的错误处理或者内务处理而编写的,就是说仅有
10%的代码才是处理正常情况的。既然有如此多的代码是用于错误处理,那么在结构中阐明处
理错误的策略就是十分必要的了。以下是些需要考虑的问题:
· 错误处理是纠正还是仅仅测试错误?如果是纠正错误,程序可以尝试从错误状态下恢
复。如果仅仅是测试,那么程序可以继续运行,就像什么也没有发生一样,或者直接
退出运行。但无论在哪种情况下,都应该提醒用户发现了错误。
· 错误测试是主动的还是被动的?系统可以积极地预防错误,如通过检验用户的输入是
否合法,当然也可以消极地在无法回避它们时才做出反应。例如,用户的一系列输入
产生了溢出,你可以清除,也可以滤除信息。同样,无论哪种方案,都要提醒用户。
· 程序是怎样对付错误的?一旦测试出错误,程序可以立刻抛弃产生错误的数据,也可
以把它当作错误而进入错误处理状态,还可以等到全部处理完毕后再通知用户数据有
误。
· 处理错误信息的约定是什么呢?如果结构设计中没有规定某种策略。那么用户界面在
程序的不同部分就会像迷宫中的通道一样忽东忽西,让人摸不着头脑。为避免出现这
类问题,结构设计中应建立一套处理错误信息的约定。
· 在程序中,应该在哪一个层次上处理错误呢?你可以在发现的地方立即处理,也可以
把它交给一个错误处理子程序去处理,或者交给更高层次的子程序处理。