第5章 总体设计
总体设计的基本目的就是回答“概括地说,系统应该如何实现”这个问题,因此,总体设计又称为概要设计或初步设计。
总体设计阶段的另一项重要任务是设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。
5.1 设计过程
3.推荐最佳方案
用户和有关的技术专家应该认真审查分析员所推荐的最佳系统,如果该系统确实符合用户的需要,并且是在现有条件下完全能够实现的,则应该提请使用部门负责人进一步审批。在使用部门的负责人也接受了分析员所推荐的方案之后,将进入总体设计过程的下一个重要阶段——结构设计。
5.2 设计原理
5.2.1 模块化
模块化是为了使一个复杂的大型程序能被人的智力所管理,是软件应该具备的唯一属性。下面论证上面结论。
设函数C(x)定义问题x的复杂程度,函数E(x)确定解决问题x需要的工作量(时间)。对于两个问题P1和P2,如果
显然
根据人类解决一般问题的经验,另一个有趣的规律是
虽然目前还不能精确地决定M的数值,但是在考虑模块化的时候总成本曲线确实是有用的指南。在第六章和5.3节讲解。
采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。模块化也有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的模块。
5.2.2 抽象
人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。人们在实践中认识到,在现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性)。把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。或者说抽象就是抽出事物的本质特性而暂时不考虑它们的细节。
软件工程过程的每一步都是对软件解法的抽象层次的一次精化。在可行性研究阶段,软件作为系统的一个完整部件;在需求分析期间,软件解法是使用在问题环境内熟悉的方式描述的;当由总体设计向详细设计过渡时,抽象的程度也就随之减少了;最后,当源程序写出来以后,也就达到了抽象的最低层。
5.2.3 逐步求精
5.2.4 信息隐藏和局部化
5.2.5 模块独立
1.低内聚
一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很松散的,就叫做偶然内聚。
一个模块完成的任务在逻辑上属于相同或相似的一类,则称为逻辑内聚。
一个模块包含的任务必须在同一段时间内执行,就叫时间内聚。
2.中内聚
一个模块内的处理元素是相关的,而且必须以特定次序执行,则称为过程内聚。
模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据,则称为通信内聚。
3.高内聚
一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行(通常一个处理元素的输出数据作为下一个处理元素的输入数据),则称为顺序内聚。
模块内所有处理元素属于一个整体,完成一个单一的功能,则称为功能内聚。功能内聚是最高程度的内聚。
5.3 启发规则
5.4 描绘软件结构的图形工具
5.4.1 层次图和HIPO图
5.4.2 结构图
5.5 面向数据流的设计方法
5.5.1 概念
5.5.2 变换分析
图5.13说明了第一级分解的方法。
对于数字仪表板的例子,第一级分解得出的结构如图所示。每个控制模块的名字表明了为它所控制的那些模块的功能。
5.5.3 事务分析
5.5.4 设计优化
设计人员应该致力于开发能够满足所有功能和性能要求,而且按照设计原理和启发式设计规则衡量是值得接收的软件。
设计的早期阶段尽量对软件结构进行精化。
对时间起决定性作用的软件进行优化是合理的。
(1) 在不考虑时间因素的前提下开发并精化软件结构。
(2) 在详细设计阶段选出最耗费时间的那些模块,仔细地设计它们的处理过程(算法),以求提高效率。
(3) 使用高级程序设计语言编写程序。
(4) 在软件中孤立出那些大量占用处理机资源的模块。
(5) 必要时重新设计或用依赖于机器的语言重写上述大量占用资源的模块的代码,以求提高效率。
本章小结
1.总体设计阶段主要由系统设计和结构设计两阶段组成。
2.进行软件结构设计时应该遵循的最主要的原理是模块独立原理。
3.在软件开发过程中既要充分重视和利用这些启发式规则,又要从实际情况出发避免生搬硬套。
4.层次图和结构图是描绘软件结构的常用工具。
5.用形式化的方法由数据流图映射出软件结构。