五、总体设计

总体设计又称为概要设计或初步设计。其基本目的就是回答“概括地说,系统应该如何实现”这个问题。

设计过程

总体设计过长一般分两个阶段组成:系统设计阶段,结构设计阶段。

总体设计一般包含以下九个步骤

  • 设想供选择的方案
  • 选取合理的方案

要为用户提供低成本、中成本、高成本三种方案

并且为每个方案准备:系统流程图、组成系统的物理元素清单、成本/效益分析、进度计划。

  • 推荐最佳方案
  • 功能分解
  • 设计软件结构
  • 设计数据库
  • 制定测试计划
  • 书写文档
  • 审查和复审

设计原理

模块化:把程序划分为独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成制定的功能满足用户的需求。

抽象:人们在现实世界中认识到一定事物、状态、过程之间总存在着某些相似的二方面,把这些相似的方面集中或概括起来,暂时忽略他们之间的差异,这就是抽象。

逐步求精:逐步求精是人类解决复杂问题时采用的基本方法,也是许多软件工程技术的基础。其定义为:“为了能集中精力解决主要问题而尽量推迟对问题细节的考虑”

信息隐藏原理:一个模块内包含的信息对于不需要这些信息的模块来说是不能访问的。

局部化:把一些关系密切的软件元素物理地放得彼此靠近。

模块独立

模块的独立成都可以有两个定性的标准度量,内聚和耦合

内聚:一个模块内部各个元素彼此结合的紧密程度

耦合

定义:不同模块之间彼此互相依赖的紧密程度。

耦合性强弱分级

无直接耦合:如果两个模块分别从属于不同模块的控制和调用,它们之间 不传递任何信息,没有直接的联系,相互独立,称无直接耦合。

数据耦合:如果两个模块之间有调用关系,相互传递的信息以参数的形式 给出,而且传递的信息仅仅是简单的数据,则称为数据耦合。

控制耦合:如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。

特征耦合:如果两个模块之间传递的是数据结构,而且被调用模块不需要作为参数传递过来的整体数据结构,只需要使用数据结构其中一部分数据元素,则称为标记耦合。

公共环境耦合:两个或多个模块共用一个数据环境,称为公共环境耦合。

松的公共环境耦合:一个模块送数据,一个模块取数据

紧的:两个模块都又送又取

内容耦合:一个模块直接访问另一个模块的内部数据,一个模块不通过正常入口而转入另一个模块内部,一个模块有多个入口,这都属于内容耦合。

我们尽量使用数据耦合、少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。

内聚

内聚标志着模块内各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展。

内举行由弱到强分级

偶然内聚: 一个模块完成一组任务,任务之间关系很松散。

逻辑内聚:将逻辑上相同或相似的一类任务放在同一个模块中,每次被调用时,由传送给模块的参数来确定该模块应完成的某一功能。

时间内聚:把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。

过程内聚:一个模块内的处理元素是相关的,而且必须以特定次序执行。

通信内聚:如果模块中所有元素都使用相同的输入数据或者产生相同的输出数据,则称为通信内聚。

顺序内聚:一个模块中各个处理元素都紧密相关于同一个功能个且必须顺序执行,此模块的块内联系属顺序内聚。

功能内聚:模块内所有元素属于一个整体,共同完成一个单一功能,缺一不可,则称为功能内聚。

我们要做到高内聚、低耦合!!!

启发式规则

人们在开发计算机软件的长期实践中积累了丰富的经验,总结出的这些经验得出了一些启发式规则。

以下几条:

1、改进软件结构提高copy模块独立性。

2、模块规模应该适中。

3、深度、宽度、扇出和扇入都应适当。

深度:软件结构中控制的层数,它往往能粗略的标志一个系统的大小和复杂程度。

宽度:软件结构内同一层次上的模块总数的最大值,一般说来宽度越大,系统越复杂。

扇出:扇出是一个模块直接控制(调用)的模块数目,扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块。

扇入:扇入表明有多少个上级模块直接调用它,扇入越大则共享该模块的上级模块越多。

4、模块的作用域应该在控制域内。

5、力争降低模块接口的复杂程度。

6、设计单入口单出口的模块。

7、模块功能应该可以预测,避免过多限制。

软件结构图形工具

层次图与HIPO图

层次图可以用来描述软件的层次结构!下面是一个层次图的例子。


层次图很适合自顶向下设计软件过程中使用。十分简洁清晰!

在层次图的基础上,HiPO图是除了顶层的方框之外,每个方框都按数据流图编号方法进行编号的图。下图是Hipo图的例子。

总体设计及架构 总体设计构想_恰饭

结构图

结构图与层次图类似,每一个方框代表一个模块,框中注明模块名字以及主要功能,方框的箭头表示模块间的调用关系。具体大家可以查看书中103页的那张图,了解了解就行了。

面向数据流的设计方法(重要)

面向数据流的设计方法的目标是给出设计软件结的一个系统化途径。

通常说的结构化设计方法(SD方法)就是面向数据流的设计方法。

概念

在面向数据流的设计方法中,一般把数据流图中的数据流划分为两种类型,一种是变换流,一种是事务流

信息沿着输入通路进入系统,同时将信息的外部形式转换成内部表示,然后通过变换中心处理,再沿着输出通路转换成外部形式化离开系统,具有这种特性的信息流称为变换流

信息沿着输入通路到达一个事务中心,事务中心根据输入信息的类型在若干个动作序列中选择一个来执行,这种信息流称为事务流

变换分析

变换分析,大家请根据书中105页的例子进行理解。

步骤:

  • 复查基本系统模型
  • 复查精化数据流图
  • 确定数据流图具有变换特性还是事务特性
  • 确定输入输出流边界,孤立变换中心
  • 完成第一级分解
  • 完成第二级分解
  • 使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化。
事务分析

事务分析的设计步骤与变换分析的设计步骤类似,主要差别仅在于由数据流图到软件结构的映射方法的不同。

一般来说由事务流构成的软件结构包括一个接收分支和发送分支。

具体大家可以参考下书上112页的例子。

设计优化

应在设计的早期阶段对软件结构进行优化!

设计优化应该力求做到在有效的模块化的前提下使用最少量的模块,以及在能够满足信息要求的 前提下使用最简单的数据结构。

对时间取决定性作用的软件进行优化的合理方法:

  • 在不考虑时间因素的前提下开发并精化软件结构;
  • 再详细设计阶段选出最耗时间的模块,仔细设计他们的处理过程,提高效率;
  • 使用高级程序设计语言进行编写;
  • 在软件中孤立出那些占用大量处理及资源的模块;
  • 必要时重新设计或依赖于机器的语言重写那些占用大量资源的模块。

课后题

本章课后题多为举例或设计题,在此就不写了,各位可以自己做一做康康。