需求分析确定了系统的开发目标,下一步工作就是软件设计。软件设计可以进一步地分为两个阶段:总体设计和详细设计。其中,总体设计又称概要设计,即确定系统的具体实现方案、给出软件的模块结构、编写总体设计说明书。
下面就重点给大家讲解一下模块独立性和系统结构图:
模块独立性
模块独立性是指模块内部各部分及模块间的关系的一种衡量标准,由内聚和耦合来度量。
一、耦合
如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用实现的,这就是非直接耦合。这种耦合的模块独立性最强。但是,在一个软件系统中不可能所有的模块之间都无任何连接。
2) 数据耦合
如果两个模块彼此间通过数据参数(不是控制参数、公共数据结构或外部变量)交换信息,这种耦合称为数据耦合。由于限制了只通过参数表传递数据,所以按数据耦合开发的程序界面简单、安全可靠。数据耦合是松散的耦合,模块之间的独立性比较强,在系统中必须有这类耦合。
3) 标记耦合
如果模块之间通过参数表传递记录信息,就是标记耦合。由于模块传递的不是简单变量,而是某一数据结构的子结构,所以在设计中应避免这种耦合。
4) 控制耦合
如果模块传递的信息中有控制信息,就称作控制耦合。这种耦合的实质是在单一接口上选择多功能模块中的某项功能。因此,对被控制模块的任何修改,都会影响控制模块。控制耦合属于中等程度的耦合,它增加了系统的复杂程度。
5) 公共耦合
如果一组模块通过同一个公共数据环境相互作用,则它们之间的耦合称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区、任何存储介质上的文件、物理设备等。
公共耦合常引发的问题:
1.公共数据环境内某个数据的修改将会影响到所有访问该公共环境的其他模块。
2.无法控制各个模块对公共数据的存取,严重影响软件模块的可靠性和适应性。
3.公共数据名的使用,降低了程序的可读性。
6) 内容耦合
如果发生下列情形之一,两个模块之间就发生了内容耦合。
2.一个模块不能通过正常入口转到另一模块的内部。
3.两个模块有一部分程序代码重叠(只可能出现在汇编语言中)。
4.一个模块有多个入口。
7) 外部耦合
如果一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称为外部耦合。
二、内聚
内聚是一个模块内部各个元素彼此结合的紧密程度的度量。一个内聚程度高的模块应当完成软件过程中的单一任务。它是信息隐蔽概念的一种自然扩展。一般模块的内聚性也有7 种类型。
1) 偶然内聚
如果一个模块各部分之间没有关系,或者即使有关系,这种关系也是很松散的,则称作偶然内聚。它是内聚程度最低的模块。例如,一些不同的模块中可能存在同一组语句,程序员为了节省空间,把它们抽出来组成一个新模块,这就出现了偶然内聚的模块。很明显,这种模块不易修改和维护,通常情况下应避免构造这种模块。
2) 逻辑内聚
如果一个模块中包含多个逻辑上相关的功能,每次被调用时,根据传递给该模块的判定参数来确定模块应执行的功能,称作逻辑内聚。它属于单入口多功能模块。例如,错误处理模块根据收到的出错信号显示出不同的出错信息等。逻辑模块的修改也比较困难,有时对局部功能的改动也会影响到全局。
3) 时间内聚
如果一个模块所包含的任务必须在同一时间内执行,称作时间内聚,如初始化模块和终止模块。时间内聚比逻辑内聚好一些,它在一定程度上反映了程序的某些实质,但由于它把许多功能、任务组合在一起,给维护和修改带来了困难。
4) 过程内聚
如果一个模块内的处理是相关的,而且必须以特定次序执行,则称为过程内聚。使用程序流程图作为工具设计程序时,常常通过流程图来确定模块的划分,这样得到的就是过程内聚模块。它相对时间内聚的程度更强一些,但由于仅仅为完整功能的一部分,所以内聚程度仍比较低。
5) 通信内聚
如果一个模块各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称为通信内聚。通常,通信内聚模块是通过数据流图来定义的。因为此模块中包含了许多独立的功能,所以它的内聚程度高于过程内聚。但由于各功能部分使用了相同的I/O 缓冲区,从而降低了整个系统的效率。
6) 信息内聚
如果一个模块能够完成多个功能,各个功能都在同一数据结构上操作,每一项功能有唯一的入口点,称作信息内聚。它可以看作是多个功能内聚模块的组合,并能达到信息的隐蔽,增强了各模块的独立性。
7) 功能内聚
如果一个模块内各个部分都是完成某一具体功能必不可少的组成部分,称作功能内聚。此模块间功能明确、耦合简单,是最高程序的内聚。
SC图(Structure Chart,结构图)
系统结构图(SC 图)是SD(Structured Design,结构化设计方法)方法使用的主要描述工具,用来显示软件的组成模块及其调用关系。
1.SC图的组成符号
SD 方法约定,用矩形框表示模块,用带箭头的连线表示模块之间的调用关系,在调用线的两旁应标出传入和传出模块的数据流。下图显示了SC图的6种模块。
2.SC图中的模块调用
在 SC图中,调用线的箭头指向被调用模块。下图中,允许模块A调用模块B和模块C,而不能相反。调用B 时,A 向它传送数据流X 与Y,B向A返回数据流Z。调用C时,A 向C 传送数据流Z。显而易见,B 属于变换模块,C 属于漏模块。图(b)是图(a)的一种替代画法。用附表列出在模块间传送的数据流,以代替直接在调用线的两侧作标注。当SC 图包含的数据流太多、画面拥挤时,采用这种画法可以减少错读和漏注。
2) 选择调用
如下图所示,图中用菱形符号表示选择。左方菱形的含义是,模块A 根据其内部的判断,来决定是否要调用模块B。右方的菱形则表示,A 按照另一判定的结果,选择调用模块C 或者模块D。
3) 循环调用
循环用叠加在调用线始端的环形箭头表示。下图含义是,模块A 将根据其内在的循环重复调用B、C 等模块,直至在A 模块内部出现满足循环终止的条件为止。