7、利用一些启发式原则来改进系统的初始结构图,直到得到符合要求的结构图为止。这些启发式原则大致有:
  (1) 模块功能的完善化。一个完整的功能模块,不仅应能完成指定的功能,而且还应当能够告诉使用者完成任务的状态,以及不能完成的原因。
  (2) 消除重复功能,改善软件结构。在系统的初始结构图得出之后,应当审查分析这个结构图。如果发现几个模块的功能有相似之处,可以加以改进。
  (3) 模块的作用范围应在控制范围之内。模块的控制范围包括它本身及其所有的从属模块。模块的作用范围是指模块内一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围。如果一个判定的作用范围包含在这个判定所在模块的控制范围之内,则这种结构是简单的,否则,它的结构是不简单的。
  (4) 尽可能减少高扇出结构,经验证明,一个设计得很好的软件模块结构,通常上层扇出比较高,中层扇出较少,底层扇入到有高扇入的公用模块中。
  (5) 避免或减少使用病态联接。应限制使用如下三种病态联接:直接病态联接(内容耦合)、公共数据域病态联接(公共耦合)和通过通信模块联接。
  (6) 模块的大小要适中。限制模块的大小是减少复杂性的手段之一,因而要求把模块的大小限制在一定的范围之内。通常规定其语句行数在50~100左右,最多不超过500行。
  (7) 设计功能可预测的模块,但要避免过分受限制的模块。
  一个功能可预测的模块不论内部处理细节如何,但对相同的输入数据,总能产生同样的结果。但是,如果模块内部蕴藏有一些特殊的鲜为人知的功能时,这个模块就可能是不可预测的。对于这种模块,如果调用者不小心使用,其结果将不可预测。调用者无法控制这个模块的执行,或者不能预知将会引起什么后果,最终会造成混乱。
  为了能够适应将来的变更,软件模块中局部数据结构的大小应当是可控制的,调用者可以通过模块接口上的参数表或一些预定义外部参数来规定或改变局部数据结构的大小。另外,控制流的选择对于调用者来说,应当是可预测的。而与外界的接口应当是灵活的,也可以用改变某些参数的值来调整接口的信息,以适应未来的变更。
  (8) 软件包应满足设计约束和可移植性。