《软件工程-概要设计》由会员分享,可在线阅读,更多相关《软件工程-概要设计(7页珍藏版)》请在金锄头文库上搜索。
1、概要设计4.1概要设计的基本概念 把一个产品分成几部分进行设计:软件模块的划分,数据结构和数据库的设计4.1.1概要设计的任务 分解系统、细化系统:把产品分解成零件 1 模块划分 2 决定每个模块的功能 3 决定模块之间的调用关系 4 决定要传递的参数 5 设计主要的数据结构,包括数据库设计 6 设计每个模块的测试计划4.1.2应该提交的文档 1 概要设计说明书 2 数据库、数据结构设计说明书 3 模块测试计划4.1.3结构化(SD)设计方法与结构化的分析相对应自顶向下的设计过程 逐层分解的方法:接受结构图的方法进行描述4.1.4描述方法表示反复调用模块A1、A2、A3a31a11AA1A2A
2、3a12a22a21a32表示有条件地调用模块A2结构图:描述模块之间的关系结构表:用表描述各模块之间的调用关系、输入、输出数据流模块名输入输出A1a11a12A2a21a22A3a31a324.1.5模块划分标准 没有肯定的标准,但是有划分原则:每个模块相对独立。即:具有自己独特的功能,与上下模块有联系、但与同层的模块之间应该极少联系。模块之间的联系通过调用参数和返回值进行,各模块可以独立调试,全局变量尽量不用。数据文件、数据库文件要职责分明。例如,有的模块只能读文件,有的模块只能修改某些数据等。模块内的联系尽可能:块内联系较大、块外联系较少信息隐蔽信息隐蔽是开发整体程序结构时使用的法则,即
3、将每个程序的成分隐蔽或封装在一个单一的设计模块中,定义每一个模块时尽可能少地显露其内部的处理。信息隐蔽原则对提高软件的可修改性、可测试性和可移植性都有重要的作用。模块独立模块独立是指每个模块完成一个相对独立的子功能,并且与其他模块之间的联系简洁。衡量模块独立程度的度量标准有两个:耦合和内聚。耦合是指模块之间联系的紧密程度。耦合度越高则模块的独立性越差。按耦合度从低到高依次有7种耦合方式。 非直接耦合(独立运行) 数据耦合(用参数表传递简洁数据) 标记耦合(传递数据结构或者一部分) 掌握耦合(传递的信息包括掌握模块的信息) 外部耦合(模块与软件之外的环境有关) 公共耦合(多个模块引用同一全局的数
4、据区) 内容耦合(访问内部数据,代码重叠或者多个入口)内聚是指模块内部各元素之间联系的紧密程度内聚度越低模块的独立性越差。按内聚度从低到高依次有7种内聚种类。 偶然内聚(模块完成的多个任务,任务之间的关系松散) 规律内聚(模块完成规律相关的一组任务) 瞬时内聚(模块的全部任务必须在同一时间间隔内执行) 过程内聚(模块的处理元素相关而且依据特定的次序执行) 通信内聚(模块的全部元素集中在一个数据结构区域上) 挨次内聚(模块的处理元素相关,必须挨次执行) 功能内聚(模块完成单一的功能,各个部分协调工作,而且不行缺少)4.2结构化设计的过程4.2.1 结构化程序设计的原则 结构化程序设计方法的主要原
5、则可以概括为自顶向下,逐步求精,模块化,限制使用goto语句。 1自顶向下:程序设计时,应先考虑总体,后考虑细节;先考虑全局目标,后考虑局部目标。不要一开头就过多追求众多的细节,先从最上层总目标开头设计,逐步使问题简略化。 2逐步求精:对简单问题,应设计一些子目标作为过渡,逐步细化。 3模块化:一个简单问题,肯定是由若干稍简洁的问题构成。模块化是把程序要解决的总目标分解为子目标,再进一步分解为简略的小目标,把每一个小目标称为一个模块。 4限制使用goto语句 结构化程序设计方法的起源来自对GOTO语句的生疏和争论。肯定的结论是,在块和进程的非正常出口处往往需要用GOTO语句,使用GOTO语句会
6、使程序执行效率较高;在合成程序目标时,GOTO语句往往是有用的,如返回语句用GOTO。否定的结论是,GOTO语句是有害的,是造成程序混乱的祸根,程序的质量与GOTO语句的数量呈反比,应该在全部高级程序设计语言中取消GOTO语句。取消GOTO语句后,程序易于理解、易于排错、容易维护,容易进行正确性证明。作为争论的结论,1974年Knuth发表了令人信服的总结,并证实了: (1)GOTO语句确实有害,应当尽量避开; (2)完全避开使用GOTO语句也并非是个明智的方法,有些地方使用GOTO语句,会使程序流程更清晰、效率更高。 (3)争论的焦点不应该放在是否取消GOTO语句上,而应该放在用什么样的程序
7、结构上。其中最关键的是,应在以提高程序清晰性为目标的结构化方法中限制使用GOTO语句。 与结构化的分层数据流图一一对应4.2.2从数据流图导出初始结构图变换结构和事务结构变换型结构:可以从规律上划分成3个部分: 输入部分把输入A变换成所需要的B 加工部分把B加工成C 输出部分输出D输入加工输出ABCD具有3部分的数据流图称为变换型结构A3A2A1A事务分类事务型结构:具有事务加工的并行模块 事务进入后有事务分类的加工过程,然后分给不同的模块去处理对事务型的流图,用事务分析处理对变换型的流图,用变换分析处理变换分析 对变换型的结构图中的每个处理划为一个模块CCBDDCBABA变换系统输入加工输出
8、D把C变D主加工把A变B接受输入输出加工第一层的结构:事务分析 首先确定事务的分类确定事务中心、输入、发送部分(有很多条出口的地方就是事务中心) 再将上述结构图中的三部分对应成三个模块:输入、分类、输出模块A2A3A11A事务分类输入X1X2X2 然后再细化机票订票号订票号要求订票航班票价操作员顾客航班维护票价维护订票处理库存客户信息出票处理订票文件票价输入: 加工: 输出:4.2.3开始结构图的步骤 1 确定数据流图是具有变换特征还是事务特征航空订票系统具有变换型特征,进行变换型分析把全面讲的航空数据流图改成上面讲的画法可以分成具有输入、主加工、输出的变换型结构图 2 确定主加工或事务中心
9、主加工:订票和出票 确定输入、输出部分A数据准备BAB航空订票系统订票、售票输出信息处理 3 依据对应的分析方法映射成对应的结构图,完成第一层的映射A:订票号、库存、票价B:客户订票信息4 完成其次层的分解:把数据流图中的每一个加工都映射成一个软件模块航班号输入订票信息票价订票信息 订票号数据准备航班维护票价维护输入订票号机票、修改库存订票处理票价、订票号、订票信息订票信息 订票号、修改库存客户信息订票、售票出票处理5 依据分层数据流图逐步细化每一个模块、直到每一模块都成为基本加工的航班信息输入航班维护把航班信息与机号,座位号对应 例:4.2.4上面所做的不肯定符合程序设计的要求,应该作优化
10、1 模块大小 检查每一个模块的大小:一般10100行程序,在一张纸上为好 (事实上,如果语句行数大于30行,则程序的可读性立刻下降) 对特别大的模块:进一步进行分割成若干个较小的模块 2 优化模块的扇入、扇出 扇入:调用本模块的模块数,即有多少个模块调用本模块 扇出:本模块调用其他模块数航班信息输入航班维护把航班信息转换成座位号扇出为2 例: 要求:高扇入、较低扇出 扇出大:说明模块简单,可以增加中间层(一般不大于7) 如果一个模块D被多个模块调用,可起假名d,以简化结构图(用圆圈表示) 例如:B1AB2B3B4C1.1.1 D ddd 3 作用范围和掌握范围概念:掌握范围:以本模块为根接点的
11、全部子树上的全部模块作用范围:一个模块中有个规律推断,受这个规律推断影响的全部模块作用范围 / 掌握范围的原则;一般,作用范围总是要求落在其掌握范围之内。不在掌握范围内:模块之间联系增加,在别的模块中还要作重复推断当作用范围落在掌握范围外时:进行模块调整(功能划分上的调整)4.3设计的其他工作数据库和数据结构的设计 数据库设计自有其一套设计方法:数据库原理需求 / 模块交叉表 为检查本设计是否把全部的用户要求都包含进来? 模块需求模块1模块2模块n需求1需求m 即:某功能是通过哪些模块实现的?如果某个功能没有模块调用,则功能遗漏测试计划需求分析时讲的测试计划是针对某个功能的概要设计时讲的测试计划是针对某个模块的即:各个模块如何测试概要设计回顾 概要设计:确定多少模块?模块之间的关系? 请专家进行评审编写概要设计报告 概要设计已经把产品分成各个零件,而每个零件如何实现则属于简略设计的任务 /