软件工程导论——第五章——总体设计
文章目录
1、总体设计的概念
(1)定义
总体设计的基本目的就是回答“系统应该如何实现”这个问题,总体设计又称为概要设计或初步设计。
(2)主要任务
- 划分出组成系统的物理元素程序、文件、数据库、人工过程或文档等。但是每个物理院士仍然处于黑盒子级,这些黑盒子里的具体内容将在以后仔细设计。
- 设计软件的结构,也就是确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。
(3)步骤
- 寻找实现目标系统的各种不同的方案,需求分析阶段得到的数据流图是设想各种可能方案的基础。
- 分析员从这些供选择的方案中选取若干个合理的方案,为每个合理的方案都准备一份系统流程图,列出组成系统的所有物理元素,进行成本/效益分析,并且制定实现这个方案的进度计划。
- 进行必要的数据库设计,确定测试要求并且制定测试计划。
(4)必要性
- 可以站在全局高度上,花较少的成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低的成本开发出高质量的软件系统。
2、设计过程
总体设计过程通常有两个阶段组成:系统设计阶段,确定系统的具体实现方案;结构化设计阶段,确定软件结构.典型的总体设计过程包括下述9个步骤:
- 设想供选择的方案
- 选取合理的方案(每个合理的方案都应该具备下列4种材料)
- 系统流程图
- 组成系统的物理清单元素
- 成本/效益分析
- 实现这个系统的进度计划
- 推荐最佳方案
- 功能分解
- 设计软件结构
- 设计数据库
- 制定测试计划
- 书写文档(文档内容主要包括)
- 系统说明
- 用户手册
- 测试计划
- 详细的实现计划
- 数据库设计结果
- 复查和复审
3、设计原理
(1)模块化
- 模块
模块是由边界元素限定的相邻程序元素的序列,而且有一个总体标识符代表它。模块式构成程序的基本构件。过程、函数、子程序和宏等,都可以作为模块。面向对象方法学中的对象是模块,对象内的方法也是模块。模块是构成程序的基本构件。 - 模块化
模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。模块化就是为了使一个复杂的大型程序能被人的智力所管理,是软件应该具备的唯一属性。 - 优点
- 使软件结构清晰,不仅容易设计也容易阅读和理解
- 使软件容易测试和调试,有助于提高软件的可靠性
- 提高软件的可修改性
- 有助于软件开发工程的组织管理
(2)抽象
- 定义
把在现实世界中的一定事物、状态或过程之间的共性集中或概括起来,暂时忽略它们之间的差异,这就是抽象或者说抽象就是抽出事物的本质特性而暂时不考虑其他细节。抽象是人类在认识复杂现象的过程中使用的最强的有力的思维工具 - 原理:
处理复杂系统的唯一有效的方法是用层次的方式构造和分析它。一个复杂的动态系统先可以用一些高级的抽象概念构造和理解,这些高级概念又可以用一些较低级的概念构造和理解,不断循环进行下去,直至最低层次的具体元素。 - 层次分析:
- 在抽象的最高层次使用问题环境的语言,以概况的方式叙述问题的解法;
- 在较低抽象层次采用更过程化的方法,把面向问题的术语和面向实现的术语结合起来叙述问题的解法;
- 在最低的抽象层次用可以直接实现的方式叙述问题的解法;
- 在软件工程中的应用(软件工程过程的每一步都是对软件解法的抽象层次的一次精化)
- 在可行性研究阶段,软件作为系统的一个完整部件
- 在需求分析阶段,软件解法是使用在问题环境内熟悉的方式描述的;
- 由总体设计阶段向详细设计过渡时,抽象地程度也就随之减少了
- 源程序写出来以后,也就达到了抽象的最低层
- 优点:
- 简化了软件的设计与实现
- 提高了软件的可理解性和可测试性
- 使得软件更容易维护。
(3)逐步求精
- 定义:
逐步求精是软件工程技术的基础。可以吧逐步求精定义为:为了能集中精力解决主要问题而尽量推迟对问题细节的考虑,逐步求精是人类解决复杂问题时采用的基本方法。 - 要求:
逐步求精是一项把一个时期内必须解决的种种问题按优先级排序的技术。 - 原理:
- 逐步求精最初是一种自顶向下的设计策略。程序的体系结构是通过逐步精化处理过程的层次而设计出来的,通过逐步求精分解对功能的宏观陈述而开发出层次结构,直至最终得出用程序设计语言表达的程序。
- 求精实际上是细化过程。人们从高抽象级别定义的功能陈述开始,也就是说,该陈述仅仅概念性的描述了功能或信息,但是并没有提供功能的内部工作情况或信息的内部结构。
- 抽象与求精:
抽象与求精是一对互补的概念。抽象使得设计者能够说明过程和数据,同时却忽略的低层细节,求精则帮助设计者在设计过程中逐步揭示出低层细节,这两个概念都有助在设计眼花过程中创造出完整的设计模型。
(4)信息隐藏和局部化
- 定义:
信息隐藏原理是在设计和确定的模块中,使一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。 - 局部化与信息隐藏
- 局部化的概念和信息隐藏概念是密切相关的。局部化是指把一些关系密切的软件元素物理地放得彼此靠近。在模块中使用局部数据元素是局部化的一个例子,局部化有助于实现信息隐藏
- 隐藏意味着有效的模块化可以通过定义一组独立的模块而实现,这些独立的模块彼此间仅仅交换为了完成系统功能二必须交换的信息。
- 优点
绝大多数数据和过程对于软件的其他部分而言是隐藏的,在修改期间由于疏忽而引入的错误就很少可能传播到软件的其他部分。
(5)模块独立
- 定义:
开发具有独立功能而且和其他模块之间没有过多地相互作用的模块,就可以做到模块独立。使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单。模块独立的概念是模块化、抽象、信息隐藏和局部化概念的直接结果。 - 重要性:
- 具有独立的模块的软件比较容易开发出来
- 独立的模块比较容易测试和维护
4、耦合
(1)定义:
耦合是对一个软件结构内不同模块之间互连程度的度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点,以及通过接口的数据。模块间的耦合程度强烈影响着系统的可理解性、可测试性、可靠性和可维护性。耦合衡量不同模块彼此之间相互依赖(连接 )的紧密程度。
(2)分类:
-
完全独立:
如果两个模块中的每一个都能独立的工作而不需要另一个模块的存在,则称它们彼此完全独立,耦合程度最低,但是,一个软件系统中不可能所有的模块之间都没有任何连接。 -
数据耦合:
如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据,则称它们是数据耦合,数据耦合是低耦合,系统中至少必须存在这种耦合。 -
控制耦合:
如果两个模块彼此间通过参数交换信息,并且传递的信息包含控制信息(这种控制信息可以以数据的形式出现),则称它们是控制耦合。控制耦合是中等程度的耦合,它增加了系统的复杂程度。控制耦合往往是多余的,可以用数据耦合代替它。 -
特征耦合:
如果整个数据结构作为参数传递而被调用的模块只需要使用其中一部分的数据元素,则称它们是特征耦合。在这种情况下,被调用的模块可以使用的数据多于它确实需要的数据,这将导致对数据的访问失去控制,从而给计算机犯罪提供了机会。 -
公共环境耦合:
如果两个或多个模块通过一个公共数据环境相互作用,则称它们是公共环境耦合。公共环境耦合的复杂度随耦合的模块个数增加而增加。
如果只有两个模块有公共环境,那么这种耦合有下面两种情况- 一个模块往公共环境送数据,另一个模块从公共环境取数据,属于数据耦合的一种形式,是比较松散的耦合。
- 两个模块都既往公共环境送数据又从里面取数据,这种耦合比较紧密,介于数据耦合和控制耦合和之间。
-
内容耦合:
内容耦合是最高程度的耦合,当出现下列情况之一时,就发生了内容耦合:- 一个模块访问另一个模块的内部数据。
- 一个模块不通过正常入口而转到另一个模块的内部。
- 两个模块有一部分代码重叠。
- 一个模块有多个入口。
(3)设计原则
耦合是影响软件负责程度的一个重要因素,在设计时应追求尽可能松散耦合的系统,力求做到低耦合,尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。
5、内聚
(1)定义
内聚标志着一个模块内各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展,即理想内聚的模块只做一件事情。设计时应该力求做到高内聚,内聚衡量一个模块内部各个元素彼此结合的紧密程度。
(2)内聚和耦合的关系
- 内聚和耦合是密切相关的,模块的高内聚往往意味着模块间的松耦合。
- 内聚合耦合都是进行模块化设计的工具,但内聚更重要,应该把更多的注意力集中到提高模块的内聚程度上。
(3)分类:
- 低内聚:
- 偶然内聚:
如果一个模块完成一组任务,这些任务彼此间即使有关系,关系也是松散的,就叫做偶然内聚。有时在写完一个程序之后,发现一组语句在两处或多处出现,于是这些语句就作为一个模块以节省内存,这样就出现了偶然内聚的模块。 - 逻辑内聚:
如果一个模块完成的任务在逻辑上属于相同或类似的一类,则称为逻辑内聚。 - 时间内聚:
如果一个模块包含的任务必须在同一段时间内执行,这就叫时间内聚。时间关系在一定程度上反映了程序的某些实质,所以时间内聚比逻辑内聚好一些。
- 偶然内聚:
- 中内聚:
- 过程内聚:
如果一个模块内的处理元素是相关的,而且必须以特定的次序执行,则称为过程内聚,使用程序流程图作为工具设计软件时,往往得到的是过程内聚的模块。 - 通信内聚:
如果模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据,则称为通信内聚。
- 过程内聚:
- 高内聚:
- 顺序内聚:
如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行,则称为顺序内聚。根据数据流图划分模块时,通常得到顺序内聚的模块 - 功能内聚:
如果模块内所有处理元素属于一个整体,完成一个单一的功能,则称为功能内聚。功能内聚是最高程度的内聚。
- 顺序内聚:
6、启发规则
- 改进软件结构提高模块独立性
- 模块规模应该适中
- 过大的模块往往由于分解不充分,但是进一步分解必须符合问题结构,分解后不应该降低模块独立性。
- 过小的模块开销大于有效操作,而且模块数目过多将使系统接口复杂。因此过小的模块有时不值得单独存在。
- 深度、宽度、扇出和扇入都应该适当
- 深度:深度表示软件结构中控制的层数,能粗略得标志一个系统的大小和复杂程度。深度和程序的长度之间应该有粗略的对应关系,当然这个对应关系是在一定范围内变化的。如果层数过多这应该考虑是否有许多管理模块过分简单了,能否适当合并。
- 宽度:宽度是软件结构内同一个层次的模块总数的最大值。宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出
- 扇出:扇出是一个模块直接控制的模块的数目。在设计时应该注意:
- 扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块,扇出太大一般是因为缺乏中间层次,应适当增加中间层次的控制模块。
- 扇出过小可把下级模块分解成若干个子功能模块,或合并到它的上级模块中去。分解模块或合并模块必须符合问题结构,不能违背模块独立原理。
- 一个设计的好的典型系统的平均扇出通常是3或4
- 扇入:扇入表明有多少个上级模块直接调用它,扇入越大则共享该模块的上级模块数目越多。但是,不能违背模块独立原理单纯追求高扇入
- 模块的作用域应该在控制域之内
- 定义
- 模块的作用域定义为受该模块内的一个判定影响的所有模块的集合
- 模块的控制域是这个模块本身以及所有直接或间接从属于它的模块的集合。
- 规则:
在一个设计的很好的系统中,所有受判定影响的模块应该都从属于做出判定的那个模块,最好局限于做出判定的那个模块本身及它的直属下级模块 - 修改方法
- 把做判定的点往上移
- 把在作用域内但不在控制域内的模块移动到控制域内
- 定义
- 力争降低模块接口的复杂程度
- 设计单入口单出口的模块
- 模块功能应该可以预测
7、层次图
(1)定义:
层次图用来描绘软件的层次结构。层次图中的一个矩形框代表一个模块,方框间的连线表示调用关系而不像层次方框图那样表示组成关系如下图:
(2)适用性:
层次图很适于自顶向下设计软件的过程中使用。通常用层次图作为描绘软件结构的文档。
8、HIPO图
(1)定义:
HIPO图是“层次图加输入/处理/输出图”的缩写。如下图:
(2)特征:
- HIPO图和层次图中每个方框相对应,应有一张IPO图描绘这个方框代表的模块的处理过程
- HIPO图中的每张IPO图内都应该明显地标出它所描绘的模块在H图中的编号。
9、结构图
(1)定义:
结构图是进行软件结构设计的一个有力工具,和层次图类似,也是描绘软件结构的图形工具。
(2)基本符号:
- 结构图中的一个方框代表一个模块,框内注明模块的名字或主要功能;
- 方框之间的箭头(或 直线)表示模块的调用关系
- 尾部是空心圆表示传递的是数据,实心圆表示传递是控制信息。
(3)特殊符号
-
表示当模块M中某个判定为真时调用模块A,为假时调用模块B;如图
-
表示模块M循环调用模块A、B、C,如图:
(4)与层次图的共性:
- 层次图与结构图不严格表示模块的调用次序
- 层次图和结构图不指明什么时候调用下层模块
- 层次图和结构图只表名模块调用那些模块,至于模块内有没有其他成分则没有表示。
(5)适用性:
利用IPO图或数据字典中的信息得到模块调用时传递的信息,从而由层次图导出结构图的过程,是检查设计正确性和评价模块独立性的好方法
10、面向数据流的设计方法
(1)定义:
面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。
(2)目标:
面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径
(3)信息流的类型:
-
变换流:
- 信息沿输入通路进入系统,同时由外部形式变换成内部形式;
- 进入系统的信息通过变换中心,经过加工处理后沿输出通路变成外部形式离开软件系统。
-
事务流
事务流“是以事务为中心的”数据流,即数据沿着输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。图中T为事务中心。它完成下述任务:
- 接收输入数据
- 分析每个事务以确定它的类型
- 根据事务类型选取一条活动通路
第五章课后习题
1、为每种类型的模块耦合举一个具体的例子
- 数据耦合:计算机网络属于松耦合系统
- 控制耦合:遥控器与电器
- 公共环境耦合:多机系统
- 内容耦合:汇编程序模块
为中心的”数据流,即数据沿着输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。图中T为事务中心。它完成下述任务:
- 接收输入数据
- 分析每个事务以确定它的类型
- 根据事务类型选取一条活动通路
[外链图片转存中…(img-Z9Wv1Di6-1656386090513)]
第五章课后习题
1、为每种类型的模块耦合举一个具体的例子
- 数据耦合:计算机网络属于松耦合系统
- 控制耦合:遥控器与电器
- 公共环境耦合:多机系统
- 内容耦合:汇编程序模块
今天的文章软件工程总体设计基本原理_软件工程的基本原理分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/82162.html