第四章 结构化分析与设计2

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4.2.1抽象与逐步求精
“逐步求精”就是软件设计要自顶向下、从高到低的设计 过程。 N.Wirth:“将软件的体系结构按自顶向下的方式,对各个 层次的过程细节和数据细节逐层细化,直到用程序设计语言的 语句能够实现为止,从而最后确立整个的体系结构。”
逐步求精是一种先总体、后局部的思维原则,也是一种逐
在软件设计中,没有必要精确地确定内聚级别。
设计时力争做到高内聚,并且能够辨认出低内聚的模块。
模块之间越紧密,耦合性就越高,而其独立性就越弱。
一个模块内部各个元素之间越紧密,它的内聚性就越高。 模块独立性比较强的模块应是高内聚低耦合的模块。
Hale Waihona Puke Baidu
4.2 软件设计的基本原理
4.2.1抽象与逐步求精 4.2.2模块和模块化 4.2.3信息隐藏和局部化
关,构成个不可分割的整体,因此内聚程度高且易于理解。
图4.6 顺序内聚
4.2.4模块独立性
(7)功能内聚 一个模块内所有处理元素仅为完成一个具体的功能而协同 工作,紧密联系,不可分割,则称为功能内聚。 功能内聚是最高程度的内聚。在设计时应尽可能使模块到 达功能内聚这一级。
4.2.4模块独立性
注意:
4.2.4模块独立性
4.2.5复用性设计
4.2.6软件结构设计的优化原则
4.2.2模块和模块化
模块 模块是数据说明、可执行语句等系统对象的集合。它是单 独命名且可通过名字来访问的,如过程、函数、子程序等。基 本属性: (1)功能:描述该模块实现的功能。
(2)逻辑:描述模块内部怎么做。
(3)状态:该模块使用时的环境和条件。
只从公共数据环境中提取数据,则这种公共耦合称为松散公共
耦合,如图4.2(a)所示。
4.2.4模块独立性
如果两个模块对既往公共数据环境输送数据又从里面提取 数据,则这种耦合称为紧密公共耦合,如图4.2(b)所示。 如使用公共耦合,应尽量采用松散公共耦合。
图4.2 公共耦合
4.2.4模块独立性
(6)内容耦合 内容耦合是最高程度的耦合,如果发生下列情形,两模块 之间就发生了内容耦合: ①一个模块直接访问另一个模块的内部数据。 ②一个模块不通过正常入口转到另一模块内部。 ③两个模块有一部分程序代码重叠。
标准进行度量。
模块的内聚度高,模块间耦合度低,模块的独立性就好, 软件设计的质量也就好。
4.2.4模块独立性
耦合 耦合衡量不同模块彼此间互相依赖的紧密程度。 两个模块之间存在着很强的依赖关系称为紧密耦合,两个 模块之间存在较少依赖关系称为松散耦合,模块之间没有任何 依赖关系称为无耦合。耦合越松散,模块之间的联系就越小,
4.2.2模块和模块化
描述一个模块,按模块的外部特性与内部特性分别描述。 模块的外部特性是指模块名和参数表。 模块的内部特性是指完成其功能的程序代码和仅供模块内部 使用的数据。 功能、状态与接口反映模块的外部特性,逻辑反映它的内部
特性。
模块的外部特性,是软件结构设计来解决的。
模块的内部特性,是软件详细设计来解决的。
4.2.4模块独立性
(4)过程内聚 一个模块内的处理元素是相关的,而且必须以特定次序执 行,则称为过程内聚。例如,在利用流程图划分模块时,如果 将流程图中完成同一个处理的循环部分、判定部分、计算部分 分成3个模块,则这3个模块就是过程内聚模块。
过程内聚的内聚程度比较低。
4.2.4模块独立性
(5)通信内聚 模块中各功能部分都使用同一个输入数据和(或)产生同 一个输出数据,则称为通信内聚。图4.5所示的是一个通信内聚 模块的示意图。
模块间无任何连接,耦合程度最低。
4.2.4模块独立性
(2)数据耦合
如果两个模块彼此间通过参数交换信息,而且交换的信息
仅仅是数据,那么这种耦合称为数据耦合。数据耦合是最简单
的耦合形式,模块间耦合程度较低。如下所示: sum(int a,int b) { int c。 c=a+b。 return(c)。 } main() { int x,y。 scanf("%d,%d",&x,&y)。 printf("x+y= %d ",sum(x,y))。 }/*主函数与sum函数之间即为数据耦合关系*/
4.2.4模块独立性
4.2.5复用性设计
4.2.6软件结构设计的优化原则
4.2.5复用性设计
软件复用的概念
软件复用的问题
软件复用的粒度
4.2.5复用性设计
软件复用的概念
软件复用是在两次或多次软件开发过程中重复使用相同或相
近软件元素的过程。
软件元素主要包括程序代码、测试用例、用户界面、数据、
间接口所需要的成本将随着模块数目的增多而变大。
采用模块化原理可以便软件结构清晰、容易设计、阅读和理
解。
模块化使软件容易测试和调试,有助于提高软件的可靠性。 模块化能够提高软件的可修改性。 模块化有助于软件开发的组织管理,便于分工实现和维护。
4.2 软件设计的基本原理
4.2.1抽象与逐步求精 4.2.2模块和模块化 4.2.3信息隐藏和局部化
4.2.2模块和模块化
模块化 模块化就是把系统划分成独立命名且可独立访问的模块的 过程。 模块化是软件结构设计的一个基本原则,模块化给设计人 员提供了处理复杂软件的一种方法,这种“分而治之”的思想
为模块化提供了根据:把复杂的问题分解成许多容易解决的小
问题。
4.2.2模块和模块化
每个软件都相应地有一个最适当的模块数目,使得系统的 开发成本最小。因为随着模块数目的增加,每个模块的规格确 实在减小,开发单个模块需要的成本也减少,然而,设计模块
4.2.4模块独立性
4.2.5复用性设计
4.2.6软件结构设计的优化原则
4.2.3信息隐藏和局部化
信息隐藏是指在设计和确定模块时,使一个模块内包含的 信息(过程和数据),对于不需要这些信息的其它模块来说, 是不可访问的。
独立的模块彼此间仅仅交换那些为了完成系统功能而必须交
换的信息,而将自身的实现细节与数据“隐藏”起来。
图4.1是模块A和模块B通过控制变量flag通信的控制耦合。
图4.1 控制耦合
4.2.4模块独立性
(5)公共耦合 一组模块都访问同一个公共数据环境,则这组模块之间的 耦合就称为公共耦合。公共数据环境可以是全局数据结构、共 享的通信区、内存的公共覆盖区、任何存储介质上的文件等。 如果一个模块只向公共数据环境传送数据,而另一个模块
层分解、分而治之的方法。在面对一个复杂的大问题时,它采 用自顶向下、逐步细化的方法,将一个大问题逐层分解成许多 小问题。
4.2.1抽象与逐步求精
抽象就是将事物相似的方面集中和概括起来暂时忽略它们 之间的差异。抽象就是抽出事务本质特性而暂时不考虑它们细 节。
软件项目实施中的每一步都可以看作是对软件抽象层次的
图4.3 内容耦合
4.2.4模块独立性
表4.1列出各种不同类型的耦合特点比较。
表4.1 各种耦合的比较 耦合类型 非直接耦合 数据耦合 标记耦合 控制耦合 公共耦合 内容耦合 耦合程度 最弱 弱 较弱 中等 强 最强 可维护性 好 好 中等 差 中等 坏 可理解性 好 好 中等 差 坏 坏 可重用性 好 好 中等 差 坏 坏
而引入的错误就很少能被传播到其它部分。
4.2 软件设计的基本原理
4.2.1抽象与逐步求精 4.2.2模块和模块化 4.2.3信息隐藏和局部化
4.2.4模块独立性
4.2.5复用性设计
4.2.6软件结构设计的优化原则
4.2.4模块独立性
模块独立性指软件系统中每个模块只涉及软件要求的具体 子功能,与其它的模块接口是简单的。 模块的独立性是模块化、抽象、信息隐蔽和局部化的直接 结果,也是评价模块化设计的重要指标。 模块的独立程度由模块间的耦合和模块内的内聚两个定性
如果模块内部数据结构的改变或处理算法的改变,只要该模
块所提供的功能不变,不会影响到其它模块。
4.2.3信息隐藏和局部化
局部化使一些关系密切的软件元素彼此靠近些。在模块中 使用局部变量就是局部化的一个例子。 局部化有助于实现信息隐藏。 将信息隐蔽用做模块化系统的设计标准。绝大多数数据和过 程对于软件的其他部分而言是隐蔽的,在修改期间由于疏忽
尽量使用数据耦合,少用控制耦合,限制公共耦合的范围 ,完全不采用内容耦合。
4.2.4模块独立性
内聚 内聚是衡量一个模块内部各个元素彼此结合的紧密程度。 一个模块内聚程度越高,说明该模块内部各元素之间的关联也 就越强。 (1)偶然内聚
模块内部各元素在功能上不相关或关系松散,则称偶然内 聚。例如,在编写程序时,发现一组相同的语句分别在多个子 模块中出现,于是将这组语句单独组成一个模块,这样就出现 了偶然内聚的模块。 偶然内聚被认为是最差的一种内聚,其缺点是:模块不易 理解,不易维护,不易重用。
模块的独立性就越强。
耦合的强度依赖于以下因素: (1)一个模块对另一个模块的引用 如模块A调用模块B、那么模块A的功能依赖于模块B的功能。
4.2.4模块独立性
(2)一个模块向另一个模块传递的数据量 如模块A为了完成其功能需要模块B向其传递一组数据,那 么模块A依赖于模块B。 (3)一个模块施加到另一个模块的控制的数量 如模块A传递给模块B一个控制信号,模块B执行的操作依
一次细化。例如,软件结构每一层中的模块,表示了对抽象层
次的一次精化。
抽象与逐步求精是一对互补的概念。抽象使得设计者能够 说明过程和数据,同时却忽略低层细节,求精有助于设计人员 在数据处理过程中揭示低层的细节。
4.2 软件设计的基本原理
4.2.1抽象与逐步求精 4.2.2模块和模块化 4.2.3信息隐藏和局部化
4.2.4模块独立性
(2)逻辑内聚 一个模块完成的任务在逻辑上属于相同或相似的一类则称 为逻辑内聚。图4.4中被调用模块就是一个逻辑内聚模块,它根 据输入的控制信息判定执行相应的功能。
图4.4 逻辑内聚
4.2.4模块独立性
逻辑内聚模块比偶然内聚模块的内聚程度要高。 逻辑内聚模块不易修改。 在调用时需要进行控制参数传递,这就增加了模块间的耦合 程度。 将未用的部分也调入内存会降低系统的效率。
4.2.4模块独立性
(3)时间内聚 一个模块包含了需要在同一时间段中执行的多个任务,则 称该模块的内聚为时间内聚。例如,将多个变量的初始化放在 同一个模块中实现。 优点:不需要选择参数,所有任务可以任意次序执行,逻辑
简单。
缺点:这种模块结合了许多无关的任务,模块一旦失效,难 以直接确定是哪一个任务失效。
《软件工程》
德州学院
第四章 结构化分析与设计
4.1结构化分析与设计概述 4.2 软件设计的基本原理 4.3 面向数据流的设计方法 4.4 总体设计评审 4.5软件的详细设计 4.6详细设计评审 4.7本章小结
4.2 软件设计的基本原理
4.2.1抽象与逐步求精 4.2.2模块和模块化 4.2.3信息隐藏和局部化 4.2.4模块独立性 4.2.5复用性设计 4.2.6软件结构设计的优化原则
设计文档、需求分析文档、项目计划、体系结构等。 可复用的软件元素越大,则复用的粒度越大。 在结构化程序设计中,主要是源代码和目标代码的复用。 在面向对象程序设计中,主要是类库和软件组件复用。
赖于控制信号的值。
4.2.4模块独立性
(4)模块之间接口的复杂程度 如如果模块A给模块B传递一个简单的数值,但模块C和模 块D之间传递的是数组,甚至是控制信号,则模块A和B之间接 口的复杂度小于模块C和D之间的接口复杂度。 常见的耦合类型:
(1)非直接耦合
两个模块都能独立地工作而不需要另一个的存在,这表明
图4.5 通信内聚
通信内聚模块各部分都紧密相关于同一数据或数据结构,所
以内聚性要高于前面几种。
4.2.4模块独立性
(6)顺序内聚 一个模块内的处理元素和同一个功能密切相关,而且这些 处理必须顺序执行,则称为顺序内聚。图4.6是一个顺序内聚的 例子。 顺序内聚模块中的各个部分在功能和执行顺序上都密切相
4.2.4模块独立性
(3)标记耦合 两个模块间传递的参数是数据结构变量,如高级语言中的 数组名、记录名和文件名等,模块间的这种联系称为标记耦合。 在设计时应尽量避免或采用其它方法消除这种耦合,但有 时因为其它功能的缘故,标记耦合是不可避免的。
4.2.4模块独立性
(4)控制耦合 两个模块间传递的是控制信息,如开关量、标志和名字等, 则这两个模块之间的耦合称为控制耦合。
相关文档
最新文档