第4章总体设计

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

19
模块独立 – 耦合
数据耦合 :如果两个模块彼此间通过参数交 换信息,而且交换的信息仅仅是数据,那么这种 耦合称为数据耦合。
控制耦合:如果传递的信息中有控制信息,则 这种耦合称为控制耦合。 数据耦合是低耦合。系统必须存在这种耦合, 因为只有当某些模块的输出数据作为另一些模块 的输入数据时,系统才能完成有价值的功能。
33
描绘软件结构的图形工具--层次图和HIPO图
层次图:描述软件的层次结构(H图)。
层次图中每个矩形框代表一个模块,矩形框之间的 连线表示模块调用关系。
层次图适合用来描绘软件的层次结构。
HIPO图:层次图+IPO图 对H图的每个方框,都有一张IPO图与之对应,来描 述方框所代表的模块的处理过程。并且对每个IPO图都对 应H图中方框相同的标记和编号,便于追踪。
8
软件设计原理
主 要 内 容
抽象 求精 模块化 信息隐蔽(和局部化) 模块独立
9


在现实世界中,一定事物、状态或过程之间 总存在着某些相似的方面(共性)。把这些相似 的方面集中和概括起来,暂时忽略它们之间的差 异,这就是抽象。抽出事物的本质特征而暂不考 虑它们的细节。 解决复杂问题的唯一有效的方法就是运用抽 象的思维方式,首先用一些高级的抽象概念构造 和理解它;这些高级概念又可以用一些较低级的 概念构造和理解,如此进行下去,直到最低层次 的具体元素。
1、将系统划分成相互联系的逻辑单元--总体上应该怎样 做---总体设计、概要设计、初步设计。
2、逻辑单元实现的设计--具体应该怎样做--详细设计。
2
总体设计过程
一、系统体系结构设计 二、软件结构设计 三、数据库设计 四、制定测试计划 五、书写文档 六、审核和复审
3
软件结构设计
软件结构:以模块为单位的层次结构。即: 上层模块调用它的下层模块以实现程序的完整功能; 每个下层模块再调用更下层模块完成程序的一个子功能; 最下层的模块完成最具体的功能。 方法:根据数据流图的层次关系导出软件结构。 任务: 划分程序模块 确定模块间的逻辑关系及接口参数 如果数据流图设计得好,数据流图和软件结构具有极 强的对应关系。
23
模块独立 – 内聚
过程内聚:模块内的处理元素是相关的,并 且需要按特定顺序执行。 通信内聚: 模块中所有元素都使用同一个 输入数据或产生同一个输出数据。
顺序内聚: 一个模块中多个处理元素均与 同一功能相关,且必须顺序执行(一个处理单元 的输出是另一个处理单元的输入)。
功能内聚: 模块中所有处理元素属于一个 整体,共同完成同一功能。
11
模块化
模块:一组有序操作的总称,它可以单独的名字存在, 单独编译,可以通过名字来访问。一个函数、一个过程就 是一个模块。 模块基本属性: (1)功能:模块做什么; (2)逻辑:描述模块内部怎么做; (3)状态:模块使用时的环境和条件。 模块的外部属性: 模块名 功能 参数(输入参数和输出参数)。 模块的内部特性:完成模块功能的代码和局部数据。
25
启发式规则
主 要 内 容
改进软件结构提高模块独立性 模块规模应该适中 深度、宽度、扇出和扇入应适当 模块的作用域应在控制域之内 尽量降低模块接口的复杂程度 设计单入口出口的模块 模块功能应该可以预测
前一页
26
改进软件结构提高模块独立性
模块独立性主要体现在低耦合、高内聚。可 以通过分解或合并来提高模块独立性。 分解:把几个模块中相同部分(相同的子功 能)分解出来建立一个新的模块。 合并:把几个模块合并成一个模块,减少对 控制信息的传递,以及对全程数据的引用,降低 接口的复杂程度,降低块间耦合度。
27
模块规模应该适中
在保证模块功能独立性的前提下,尽可能使模 块中的语句数少。 50~100行。 美国空军部:5~500行 目的:可理解性、可读性好。 为了保证模块独立性,少数模块可以大一些。 模块过小,系统开销大于有效操作。 对大模块的分解不应降低独立性。 面向对象技术,模块的大小无实际意义。
28
20
模块独立 – 耦合
公共环境耦合:当两个或多个模块通过一个公 共数据环境(全程变量、数据文件等)相互作用时, 它们之间的耦合称为公共环境耦合。 内容耦合:一个模块直接引用另一个模块内部 的内容。例如:一个模块直接访问另一个模块的内 部数据;一个模块不通过正常入口转到另一个模块 的内部;两个模块有一部分代码重叠。最高程度的 耦合是内容耦合。 原则:尽量使用数据耦合,少用控制耦合,限 制公共环境耦合的范围,完全不用内容耦合 。
软件工程概论
第五章 总体设计
1
总体设计
需求分析解决“系统必须做什么(what)”的问题,软件设 计解决“怎样做(how)”,即从技术角度考虑如何实现用户需 求。需求解决“做正确的事”,设计解决“正确地做事”。 软件设计是把软件需求变换成软件表示的过程。最初这 种表示只是描述出软件的总框架,然后进一步细化,在此框 架中填入细节,把它加工成在程序细节上非常接近于源程序 的表示。因此软件设计分两步进行:
12
模块化
模块化:以模块作为程序设计的基本单位,把程序
划分成若干个模块,每个模块完成一个子功能,把这些 模块集成起来,并通过模块间的调用关系把它们组成一 个完整的整体,完成指定的功能。
13
采用模块化的依据
容易被理解。 使问题复杂度降低,容易被实现。 设函数C(x)定义问题x的复杂程度,函数E(x) 确定解决问题x需要的工作量(时间),对于两个问题 p1和p2,如果 C(p1)> C(p2) 则: E(p1)> E(p2) 规律: C(p1+p2)> C(P1) + C(p2) 必有: E(p1+p2)> E(p1)+ E(p2)
5
制定测试计划 确定对各模块和系统联调的测试方案。 在软件开发的早期阶段考虑测试问题, 能促使软件设计人员在设计时注意提高 软件的可测试性 。
6
书写文档
1.系统说明:概要设计说明书
2.用户手册
3.测试计划 4.详细的实现计划 5.数据库设计结果
7
审核和复审 最后应该对总体设计的结果进 行严格的技术审查,通过之后再由 使用部门从管理角度进行复审。
24பைடு நூலகம்
模块独立 – 内聚
低内聚:偶然内聚、逻辑内聚和时间内聚
中内聚:过程内聚、通信内聚
高内聚:顺序内聚、功能内聚 对内聚的参考评价:
功能内聚
顺序内聚 通信内聚
10分
9分 7分
时间内聚
逻辑内聚 偶然内聚
3分
1分 0分
过程内聚
5分
在软件软件中,尽可能构造高内聚的模块,辨认和避免 低内聚的模块,最好不用偶然内聚。
17
模块独立
模块独立(Independence)的概念是模块化、抽象、信息 隐蔽和局部化概念的直接结果。开发具有独立功能且与其他 模块之间没有过多的相互作用的模块,就可以做到模块独立。 第一,有效的模块化(即具有独立的模块)的软件比较容 易开发出来。 第二,独立的模块比较容易测试和维护。 模块的独立程度的度量标准:
4
数据结构设计
1、文件系统的数据结构设计 确定输入、输出文件的详细的数据结构。 确定算法所需的逻辑数据结构及其操作规则。 确定逻辑数据结构所涉及的程序模块 2、数据库设计 如果目标系统以数据库为基础,则要进行数据库设计。 总体设计阶段的数据库设计包括: 数据库管理系统的选择 模式设计:确定有那些基本表组成和每个表的结构。 子模式设计:具体应用所能看到的数据库内容。 物理模式设计:确定数据的存储结构和存取路径(存 储方式,建立索引)。 数据库完整性和安全性设计。
深度、宽度、扇出和扇入应适当
深度:软件层次结构的层数。 宽度:软件结构内同一层次上模块总数的最大值。 扇入:一个模块被调用的上级模块数量。扇入越大,表 示共享该模块的上级模块越多。 扇出:一个模块直接控制(调用)的模块个数。扇出影 响宽度。 扇出过大意味着模块过分复杂,需要控制和协调过多的 下级模块。 一个好的系统的平均扇出通常是3~4(上限是5~9) (7±2原理—心理学原理) 一个好的软件结构通常顶层扇出较大,中层扇出较低, 底层模块高扇入。软件结构的形状呈椭圆外形.
M
A B D C E F
30
G
尽量降低模块接口的复杂程度
模块接口设计原则:易理解,传递信息简单且与模块 功能一致。 例:求一元二次方程的根: Quad_Root(Tal,x); Tal--系数数组;
x--根数组
Quad_Root(a,b,c,Root1,Root2); 接口复杂或不一致,是紧耦合或低内聚的征兆。
内聚:衡量一个模块内部各个元素彼此结合的紧密程度;
耦合:衡量不同模块彼此间互相依赖(连接)的紧密程度。
18
模块独立 – 耦合
耦合是对一个软件结构内不同模块之间互联程度的度量。 耦合强弱取决于模块之间接口的复杂程度,调用模块的方式, 以及通过接口的数据。实际上,耦合是接口数据对模块独立 性的影响。
如果两个模块中的每一个都能独立地工作而不需要另一 个模块地存在,那么它们彼此完全独立,这意味着模块间无 任何连接,耦合程度最低。但一个软件系统中的模块之间是 彼此协同工作的,不可能所有模块间没有连结。
29
模块的作用域应在控制域之内
控制范围:指包含模块本身的所有下属模块。 作用域:模块内一个条件判断可能引起的的被执行模块。 设计得好的系统,模块的作用域应在模块的控制范围内。 例: A的控制范围为:A、B、C、D、E、F 若A的作用域也是A、B、C、D、E 、 F,则是合理的。 若A的判断要影响到G的执行过程,则应调整软件结构。
10


软件工程过程的每一步都是对软件解法的抽象层次 的一次求精。 软件开发的三种抽象形式: 1、过程抽象:对过程的任务采用逐步求精的解法; 2、数据抽象:通过层次结构来描述数据对象。 3、控制抽象:描述程序控制机制而无须规定内部细 节。 模块化就是一种程序设计的抽象机制。 抽象和求精是一对互补的概念。求精则是帮助设计者 逐步揭示出低层细节。这两个概念都有助于帮助设计者 在设计演化过程中构造出完整的设计模型。
尽可能不用全局变量是降低接口复杂性的一个方面。
31
设计单入口出口的模块
对模块的执行,通过模块调用语句 进入模块,模块执行完后应返回到模块
调用语句的下一个语句位臵。
前一页
32
模块功能应该可以预测
模块作为一个黑箱,只要输入数据相同就产生同样的 输出,这个模块的功能就是可预测的。 带有内部“存储器”(如某个标志状态)的模块的功 能是不可预测的,因为它的输出不仅取决于输入,而且还 取决于内部“存储器”的状态。这样的模块难理解、难测 试、难维护。全程变量使用不当或数组初始化不当会导致 这种情况。 以面向对象的类为模块,不能保证输入数据相同就能 产生相同的输出。
21
模块独立 – 内聚
内聚是一个模块内各个元素彼此结合的紧 密程度的度量。内聚是信息隐蔽功能的自然扩 展,是模块内部功能独立性的表现,理想内聚 的模块只做一件事情。 按程度分类:低内聚 中内聚 高内聚。
前一页
22
模块独立 – 内聚
偶然内聚 :模块中元素之间没有实质的联系。 模块内的语句难以定义其功能,它是把多个模块 共同的语句抽出来组成一个模块 逻辑内聚:模块完成的任务逻辑相关(如产 生各种类型的全部输出)。不同功能混在一起, 合用部分程序代码,局部修改会影响全局,导致 修改困难。 时间内聚:模块包含的任务必须在同一时间 内执行。
14
模块化与软件成本
15
模块化结论
1 、采用模块化,是使软件设计从 难到易的基本方法。 2 、模块分解应适度。模块规模太 小,完成每个模块的工作量很小,但 设计和调试模块间的接口工作量随之 增加。
16
信息的隐蔽和局部化
信息隐蔽:模块内部的信息(处理过程和数据),应对 不需要了解这些信息的模块隐蔽起来,使它们不能访问。 信息隐蔽是模块设计的基本原则。意味着在进行模块划 分时,应保证模块的独立性,使组成程序的模块之间只需交 换完成软件功能所必需的信息。 将信息隐蔽作为模块化设计标准,为软件测试和维护对 模块的修改带来了极大的方便,使得修改时无意引入的错误 不会被扩散到被修改模块以外的其它位臵。 局部化:指关系密切的软件元素物理地彼此靠近。局部 化是实现信息隐蔽的重要方法。如模块内使用的局部数据元 素,当模块被调用执行时发挥作用,退出后便失去意义。
相关文档
最新文档