软件工程导论 05章总体设计

1、典型的总体设计步骤:
①确定最佳方案
②功能分解
③体系结构设计
④模块设计
⑤数据结构与数据库设计
⑥用户界面设计
⑦设计完成设计文档
⑧评审
总体设计的目的:概括地回答系统应该如何实现这个问题。

2、设计原理:
①模块化:模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。但是不能无限制地分割软件,这是因为虽然分割软件让开发单个模块的成本下降了,但是模块之间接口的设计成本又增加了,所以应该在一定范围内分割软件
②抽象:抽出事务的本质特性而暂时不考虑实现细节。软件工程过程的每一步都是对软件解法的抽象层次的一次精化。在可行性研究阶段,软件作为系统的一个完整部件;在需求分析期间,软件解法是使用在问题环境内熟悉的方式描述的;当由总体设计向详细设计过渡时,抽象的程度也就随之减少了;最后,当源程序写出来以后,也就达到了抽象的最低层
③逐步求精:逐步求精定义为为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。抽象与求精是一对互补的概念。
④信息隐藏:信息隐藏是指应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的
⑤局部化:是指把一些关系密切的软件元素物理地放得彼此靠近
⑥模块独立:模块的独立程度可以由两个定性标准度量,这两个标准分别称为内聚(模块内部数据的紧密程度)和耦合(模块之间相互连接紧密程度)。往往模块之间耦合性高,则模块内部的内聚性就低;模块之间耦合性低,则模块内部的内聚性就高。在把软件系统划分为模块时,要尽量做到高内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。

3、耦合性
耦合性是指软件结构中模块相互连接的紧密程度,是模块间相互连接性的度量。耦合强度的大小是由模块间的接口的复杂程度决定的。具体从三个方面衡量:方式、作用、数量。模块分解的目标是让模块间的联系尽可能少,可以通过模块用过程语句调用其他模块、传送数据型参数、让共用信息尽可能少等方式来实现。
耦合共有七种类型,这七种类型的耦合性依次降低:
①内容耦合:一个模块直接访问另一个模块的内部数据,或一个模块不通过正常入口转到另一个模块的内部,或一个模块有多个入口,或两个模块有代码重叠。高级语言中是不允许出现这种现象的
②公共耦合:若干模块访问一个公共的数据环境,公共耦合有两种情况,松散公共耦合(模块同时只能对公共数据环境进行读或写的一种操作,是一种低耦合方式)和紧密公共耦合(若干模块对公共数据环境同时读或写,是一种强耦合方式)。其中紧密公共耦合严重影响模块的可靠性和可适应性。一般来说,仅当模块间共享的数据很多,且通过参数的传递很不方便时,才使用公共耦合。
③外部耦合:一组模块都访问同一全局简单变量(而不是同一全局数据结构 ),而且不是通过参数表传递该全局变量的信息。
④控制耦合:一个模块传递给另一模块的信息是用于控制该模块内部逻辑的控制信号。显然,对被控制模块的任何修改,都会影响控制模块。
⑤标记耦合:一个模块传送给另一个模块的参数是一个复合的数据结构。标记耦合会使某些本来无关的模块产生相互依赖性,同时由于某些模块包含了不需要的数据,也给纠错带来了麻烦。
⑥数据耦合:一个模块传送给另一个模块的参数是一个单个的数据项或者单个数据项组成的数组。模块间传递的是简单的数据值,相当于高级语言中的值传递。
⑦非直接耦合:两个模块间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。这种耦合程度最弱, 模块的独立性最高。

4、内聚性
内聚性表示一个模块内部各个元素(数据、处理)之间联系的紧密程度。它是信息隐蔽和局部化概念的自然扩展,是从功能的角度来度量模块间的联系。显然,块内联系愈紧,即内聚性愈高,模块独立性愈好。
块内联系的类型分为七种,内聚性依次增高:
①偶然内聚:又称为巧合型,为了节约空间,将毫无关系(或者联系不多)的各元素放在一个模块中。模块元素关系松散,显然不易理解、不易修改。
②逻辑内聚:将几个逻辑上相似的功能放在一个模块中,使用时由调用模块传递的参数确定执行的功能。由于要传递控制参数,所以影响了模块的内聚性。
③时间内聚:又称为经典内聚。是把需要同时执行的成分放在一个模块中。比如初始化、中止操作这一类内部结构比较简单的模块。由于判定较少,因此比 逻辑内聚高,但是由于内含多个功能,修改和维护困难。
④过程内聚:一个模块内的处理元素是相关的,而且必须以特定的次序执行。一个模块内有多个功能成分。
⑤通信内聚:模块中的成分引用共同的输入数据,或者产生相同的输出数据,则称为是通信内聚。
⑥顺序内聚:一个模块内的处理元素都密切相关于同一功能,模块中某个成分的输出是另一成分的输入。由于这类模块是按数据执行顺序,模块的一部分依赖于另外一部分,因此具有较好的内聚性。顺序内聚模块可能含有多个功能,也可能只含有不完整的部分功能。当模块含有多个功能时,如果修改某一功能,就要找出模块中这个功能的全部部分,修改时还要注意对其他功能的影响;如果模块只含有不完整的部分功能,修改时需要找出与完整功能有关的若干个相邻模块,还需要了解这些模块都做些什么事情。
⑦功能内聚:一个模块包括而且仅包括完成某一具体功能所必须的所有成分。或者说,模块的所有成分都是为完成该功能而协同工作、紧密联系、不可分割的。

5、启发规则
①改进软件结构提高模块独立性
②模块规模应该适中
③深度、宽度、扇出和扇入都应适当
④模块的作用域应该在控制域之内(其中作用域是指受该模块内一个判定影响的所有模块的集合,控制域是指模块本身以及所有直接或间接从属于它的模块的集合。具体方法为将做判定的点上移或者将在作用域但不在控制域中的模块移到控制域中)
⑤力争降低模块接口的复杂程度
⑥设计单入口单出口的模块
⑦模块功能应该可以预测

6、描绘软件结构的图形工具
①层次图与HIPO图
层次图用来描绘软件的层次结构。它与数据结构的层次方框图相同,但是表现的内容却完全不同。层次图很适于在自顶向下设计软件的过程中使用。HIPO图在层次图的基础上,在除了顶层之外的方框之外的每一个方框都加了编号。
软件工程导论 05章总体设计
②结构图
结构图中一个方框代表一个模块,框内注明模块的名字或主要功能; 方框之间的箭头(或直线)表示模块的调用关系。尾部是空心圆表示传递的是数据,实心圆表示传递的是控制信息。选择调用在分支处补上一个菱形,循环调用则是在分支处用回旋箭头表示。
软件工程导论 05章总体设计
7、分布式系统结构主要包括:多处理器体系结构客户/服务器体系结构