一个好的系统分解的确是很有价值的,但并不是说一旦确立了好的结构,设计就可以停止
了。在确认出子程序的模块之后,还有许多设计工作要做。
伴随着某些设计方法的第三个要素,即强调应该只使用一种方法的思想,是非常有害的。
没有一种方法囊括了设计系统所需的全部创造力和洞察力。强调使用一种方法将破坏设计中的
思维过程。
但是,设计方法的选择往往会成为一种宗教似的问题——你去参加了一个宗教复兴会议,
听一些结构化设计的先知讲道,然后你回到自己的圣地在石碑上写下一些神圣的程序,从此以
后,你不再允许自己进入非基督教的领域。你应该知道,软件工程不是宗教,不应该引人宗教
的狂想性。
如果你是个建筑工人,你不会用同样的方法建造每一幢建筑物。在周一你在浇注水泥,而
到了周末你则在修建一幢木屋。你不会用水泥来修木屋,也不会在一幢新建好的摩天大楼门口
挂上“成人禁止入内”的牌子。你会根据不同的建筑物而采取不同的施工方法,从建造房子中,
你应该得到关于编程方法选择的启示,应该选择与问题相适应的方法,这种世俗方法的合理性
已经被许多例子和研究所证明。每种方法都有其优点,但同时也有其弱点,应分析使用(Peter
和Tripp 1977,Mannino 1987,Kelly 1987,Loy 1990)。
但是,有些方法的障碍是由它们自己的复杂的术语产生的。比如,你想学习结构化设计,
你必须懂得如下词汇:输入流与模块、输出流与模块、正规、控制、公用、全局和内容耦合、
功能的、顺序的、通讯的、过程的、临时的、逻辑的和偶然性内聚。输入、输出、事务处理中
心、事物处理分析和事物处理模块,甚至Benuzerfreundlichkeit(多可怕!)一词也出现了。字
典也无法给出这些词的解释。
结构化设计,以隐蔽信息为目标的设计和面向对象设计等方法提供了看问题的不同角度。
图7-4 给出了使用它们的典型方法。
从事结构化设计的人与从事面向对象设计的人会发现他们进行交流非常困难,原因是他们
没有意识到是在不同层次上讨论设计的,因此主题也是不同的。从事结构化设计的Tom说:“我
想这个系统应该分解成50个子程序。”面向对象设计的Joh则说:“我认为系统应划分成7个目
标”。如果你仔细观察,可能会发现这7 个目标中可能共含有50 个子程序,而Tom的子程序或
许可以分成7 组。
7.4.1 何时使用结构化设计
结构化设计主要是一种把程序分解成子程序的方法。它强调功能但不强调数据。一个面向
功能的问题域的例子是一个以批处理方式读入数据,按照可以预计的顺序对数据进行可以预计
的处理并且写数据。
结构化设计并没有把子程序组成一个协同工作子程序组的概念,也没有子程序内部设计的
概念,除非这个子程序的内部会影响到整个系统。因此,结构化设计非常适用于具有许多互不
作用的独立功能的系统。同时,它也适于那些只有几百行代码的小型程序,因为这些程序过于
简单,没有建立类、目标和属性的必要。
结构化设计的最先提出者Larry Constantine,曾经发表过一篇“目标、函数和程序可扩展性”
的文章,论述了把结构化设计和面向对象设计组合到一起的设计方法。如果数据变动可能性很
大,那么采用面向对象设计比较合适,因为它将变动可能性较大的数据独立在目标(模块)