《软件工程结构化分析与设计》由会员分享,可在线阅读,更多相关《软件工程结构化分析与设计(94页珍藏版)》请在金锄头文库上搜索。
1、第三章 结构化分析与设计w需求分析w结构化系统分析w模块化设计思想w结构化系统设计w模块设计3.1 需求分析w准确、完整、规范化的软件需求是软件开发成功的关键w软件项目中40-60%的问题是在需求阶段埋下的祸根 让用户和开发者共同明确将要开发的是一个什么样(what)的系统w第一:建立分析模型 描述软件需求的一组模型,是形成需求说 明、进行软件设计的基础w第二:得到软件需求规格说明书 准确、一致、清晰、无二义、直观易读需求分析的任务w需求获取(调研) 形式:联合分析小组 手段:客户访谈、问答、原件收集 目标:功能、界面、质量.需求分析的步骤开发方用户方(代表)专家需求分析的步骤w需求提炼:分析
2、建模结构化分析面向对象分析数据流图实体关系图状态转换图控制流图.类图状态图活动图.用例图需求分析的步骤w需求描述:撰写软件需求规格说明书(Software Requirement Specification SRS) 在标准模板基础上剪裁w需求验证(复审) 组成复审小组:用户方+外来专家实例(教材购销系统)学生学生张秘书王会计李出纳赵保管购书购书购书申请证明发票领书单书学生学生审查有效性开发票开领书单发书购书购书购书申请证明发票领书单书学生学生审查并开发票开领书单发书购书购书申请发票领书单书学生学生审查并开发票开领书单购书申请发票领书单无效书单当前系统当前系统目目标标系系统统缺书单需求获取的常
3、用方法w常规需求获取方法 联合分析小组、客户访谈、问题分析与确认w快速原型法在需求分析中的应用 两个层次:联机屏幕、外部特征 过程:规格说明检查生成/修改原型用户评估 基础:快速开发技术和工具(4GT)分析建模w软件分析模型:信息(数据)模型、功能模型、行为模型w分类:结构化分析(SA)、面向对象分析(OOA)w方式:图形+自然语言3.2结构化系统分析DDE-RDFDCFD STD控制说明数据对象说明加工说明3.2.1结构化分析模型的组成w数据流图(DFD)w数据字典(DD)w加工说明(PSPEC)w实体关系图(E-R)(1)数据流图(DFD)加工或变换输入输出:加工:数据的源点或终点:数据的
4、流向:数据文件或数据库数据流图(DFD)wDFD不同于程序流程图。wDFD可以表现大到整个系统,小到一个模块w分层数据流图学生学生审查并开发票开领书单购书申请发票领书单无效书单各班学生用书表教材存量表(2)数据字典(DD)w对软件中的每个数据规定一个定义条目,以保持数据在系统中的一致性数据项:只含一个数据,又称为数据元素数据流:由多个相关数据项组成数据文件(数据库):符号:=、+、 、 、( )、* *数据流发票=(学号)+姓名+书号+单价+数量+总价+书费合计数据文件学生用书表= 系编号+专业和班编号+年级+书号系编号=2数字2数据项年级= F/M/J/S数据字典例题w请给出安徽汽车的车牌号
5、码的数据字典定义,如合肥的车牌是“皖A-23002”,芜湖的车牌是“皖B-00235”等,只考虑后面五位是数字的情况w某个航空售票系统需要保存所有的航班信息,每个航班的属性包括航班号、出发地、目的地、若干个中途停靠站、头等舱座位数量及价格(固定)、公务舱座位数量及价格、普通舱座位数量及价格。有些航班没有头等舱。采用数据字典描述航班信息 车牌号码车牌号码=皖皖A-Z-5数字数字5航班航班=航班号航班号+出发地出发地+目的地目的地+停靠站停靠站+(头等舱数量头等舱数量)+(头等舱价格头等舱价格)+公务舱数量公务舱数量+公务舱价格公务舱价格+普通普通例题w请给出购书申请的数据字典定义:一份申请对应一
6、个学生,内容包括学生的学号、姓名、班级和他(她)所领全部教材的书号、书名和数量。其中学号由阿拉伯数字组成,姓名可选。购书申请购书申请=学号学号+(姓名)(姓名)+书号书号+书名书名+数量数量学号学号=数字数字(3)加工说明(PSPEC)w三部分:输入数据、加工逻辑、输出数据w描述不宜过细,过细就变成了设计描述工具结构化语言判定表判定树结构化语言描述加工说明把学生学号和姓名写到发票上检索“学生用书表”,获得该生当年书单对购书单上每一个书号如果 书单上无此书号 则把书号写到无效书单上否则检索“教材存量表”,获得该书的单价和库存如果 库存10008%工资工资 奖金奖金10005%+30010005%
7、10006%+30010006%10004%+20010004%50%50%50%50%1000010000预收货款预收货款推销金额推销金额例题w一个加工用来完成商店促销活动中的金额计算,规定:消费不超过100元,享受8折;消费100-500,享受7折;消费超过500享受6折。且如果是会员则再减20。 用判定树描述该加工说明消费额消费额会员会员优惠优惠优惠策略优惠策略500是是否否是是否否是是否否8折折-208折折7折折-207折折6折折-206折折(4)E-R图备注:若关系没有属性,则可以省略E-R图向数据表的转换w一对一:两个实体可合并成一个表学生床铺1:10:1学生学号,姓名,床铺号,上
8、下,E-R图向数据表的转换w一对多:两个实体分别转换成两个表,在“多”的标中建立指向“1”的表中的外关键字部门员工1:n1:1部门编号,名称,职责,员工工号,姓名,性别,所在部门编号E-R图向数据表的转换w多对多:两个实体分别转换成两个表,另建立一个新表保存它们之间的关系,新表中应包括这两个表的关键字及关系的属性产品原材料1:n1:n产品产品编号,名称,价格,原材料原料编号,名称,价格,单耗产品编号,原料编号,单耗量,例题w以我校为例,画出学生、班级、课程、教师的E-R图3.2.2结构化分析方法w结构化分析(SA):一种面向数据流的分析方法w基本步骤:由顶向下对系统进行功能分解,画出分层数据流
9、图分层数据流图;由后向前定义系统的数据和加工,编制DD和和PSPEC;最终写出SRS。(1)画分层数据流图w从基本模型开始(整个系统是一个加工)w逐层分解w重复这种分解,直到加工足够简单(基本加工)由顶向下、逐步细化由顶向下、逐步细化(求精求精)顶层数据流图学生教材购销系统书库保管员购书单领书单缺书单进书通知外部项目标系统发票二层数据流图学生书库保管员购书单领书单缺书单进书通知1销售2采购进书通知F1教材存量表F2缺书登记表发票三层数据流图销售子系统学生学生1.1审查有效性1.2开发票1.3打印发票1.4登记售书打印领书单1.5登记缺书1.6产生补售书单采购F2缺书登记表F1教材存量表F4售书
10、登记表F3学生用书表购书单无效书单有效书单发票发票领书单进书通知补售书单暂缺书单三层数据流图采购子系统2.1按书号汇总2.2按出版社汇总2.3进书处理书库保管员销售F2缺书登记表F1教材存量表F5代购教材表F6教材一览表缺书单进书通知进书通知分层DFD的优点w便于实现 逐步细化,避免一次引入过多细节,有利于控制问题的复杂度w便于使用 便于阅读,有针对性(2)确定数据定义与加工策略w从数据的终点开始,由后向前领书单=学号+姓名+书号+数量发票=学号+姓名+书号+单价+数量+总价+书费合计1.4的PSPEC:从发票中提取数据生成领书单;登记售书售书登记表=领书单=学号+姓名+书号+数量确定数据定义
11、和加工策略有效购书单=学号+姓名+书号+数量教材存量表=书号+单价+数量1.2的PSPEC:核对存量;如果够则计算书费,并更新存量;如果不够则产生暂缺书单暂缺书单=学号+姓名+书号+数量补售书单=学号+姓名+书号+数量缺书登记表=学号+姓名+书号+数量(3)需求分析的复审w父图和子图的不平衡 父图和子图的输入数据和输出数据应分别保持一致,称为父子平衡。 可以有可以有“例外例外”w未区分局部文件和局部外部项 各层负责各层,保持图面简洁w分解速度太快 每次分解24个,一般不超过7个w不遵守加工编号规则思考题 分析一个网上购物系统,其过程是:用户首先输入待购买分析一个网上购物系统,其过程是:用户首先
12、输入待购买商品名称商品名称(如如:手机手机),然后在所有商品中选择自己中意的品,然后在所有商品中选择自己中意的品牌牌(如如:诺基亚诺基亚8210)和欲购买的数量,系统检查库存,如果和欲购买的数量,系统检查库存,如果库存不够则提示用户交易失败,如果够就接受交易,并将库存不够则提示用户交易失败,如果够就接受交易,并将订单显示给用户。订单显示给用户。 其中:其中: 订单订单=商品名称商品名称+品牌品牌+单价单价+数量数量+总价总价+交易时间交易时间 要求:要求: 1、画出分层数据流图、画出分层数据流图 2、描述、描述“接受交易接受交易”的加工说明的加工说明 3、给出、给出DFD中所有数据文件的数据定
13、义中所有数据文件的数据定义用用户户用用户户查询请求查询请求订单订单网上购网上购物系统物系统购买请求购买请求1查询查询商品商品2接受接受订购订购3检查检查库存库存4接受接受交易交易用用户户查询请求查询请求商品库存表商品库存表商品列表商品列表购买请求购买请求购买请求购买请求有效购买有效购买请求请求用用户户订单订单用用户户无效无效请求请求商品库存表商品库存表=商品名称商品名称+品牌型号品牌型号+单价单价+库存数量库存数量接受交易加工说明接受交易加工说明接受购买请求接受购买请求查询商品库存表中对应请求中的商品的单价查询商品库存表中对应请求中的商品的单价计算本次购买金额,查询系统时间,生成订单计算本次购
14、买金额,查询系统时间,生成订单更新库存表中的商品数量更新库存表中的商品数量3.3模块化设计思想w把大型软件按照规定的原则划分成一个个较小的、相对独立但又相互关联的模块,叫做模块化设计w分解w模块独立性w自顶向下与由底向上设计3.3.1模块独立性w模块独立性由内聚和耦合来度量w模块独立性越高,块内联系越强,块间联系越弱w高内聚、低耦合3.3.1模块独立性C(P1 + P2) C(P1) + C(P2)E(P1 + P2) E(P1) + E(P2)分解的模块数量不能过大、也不能过小3.3.2内聚偶然性内聚功能性内聚时间性内聚逻辑性内聚过程性内聚顺序性内聚通信性内聚弱强(1)偶然性内聚模块内各组成
15、成分在功能上互不相关,组合纯属偶然void m1() int i, j, k;i = 2;j = m3() +2;(2)逻辑性内聚由若干个逻辑功能相似的成分组成int calPoint(int flag) int ave, max, total, num; total = num = 0; FileReader fr = new FileReader(“c:/gradePoint.txt”); BufferedReader br = new BufferedReader(fr); String s = br.readLine(); while (br.ready() if (flag = 1)
16、 total += Integer.parseInt(s); num+; else max = max Integer.parseInt(s) ? max : Integer.parseInt(s); s = br.readLine(); return flag = 1 ? total/num : max(3)时间性内聚模块内成分有相同的执行时间联结到一起int calPoint(int flag) int ave, max, total, num; total = num = 0; FileReader fr = new FileReader(“c:/gradePoint.txt”); Bu
17、fferedReader br = new BufferedReader(fr); String s = br.readLine(); while (br.ready() if (flag = 1) total += Integer.parseInt(s); num+; else max = max Integer.parseInt(s) ? max : Integer.parseInt(s); s = br.readLine(); return flag = 1 ? total/num : maxBufferedReader initFile() FileReader fr = new Fi
18、leReader(“c:/gradePoint.txt”); BufferedReader br = new BufferedReader(fr); return br;int calPoint(int flag) int ave, max, total, num; total = num = 0; BufferedReader br = initFile(); (4)过程性内聚模块中包含一组任务必须按照某一特定的次序执行int calPoint(int flag) int ave, max, total, num; total = num = 0; FileReader fr = new F
19、ileReader(“c:/gradePoint.txt”); BufferedReader br = new BufferedReader(fr); String s = br.readLine(); while (br.ready() if (flag = 1) total += Integer.parseInt(s); num+; else max = max Integer.parseInt(s) ? max : Integer.parseInt(s); s = br.readLine(); return flag = 1 ? total/num : maxint calAvePoin
20、t() int ave, total, num; total = num = 0; BufferedReader br = initFile(); String s = br.readLine(); while (br.ready() total += Integer.parseInt(s); num+; s = br.readLine(); return total/num;int calMaxPoint() (5)通信性内聚模块内部各个成分都使用同一种输入数据,或者产生同一个输出数据。例如:Java里面的“类”(6)顺序性内聚各组成部分顺序执行void copyGradeFile() Fi
21、leReader fr = new FileReader(“c:/in.txt”); BufferedReader br = new BufferedReader(fr); FileWriter fw = new FileWriter(“c:/out.txt”); BufferedWriter bw = new BufferedWriter(fw); while (br.ready() String s = br.readLine(); bw.write(s); bw.newLine(); System.out.println(s); void copyLine(BufferedReader
22、br, BufferedWriter bw) String s = br.readLine(); bw.write(s); bw.newLine(); System.out.println(s);void copyGradeFile() while (br.ready() copyLine(br, bw); (7)功能性内聚完成一个单一的功能功能性内聚模块可以很好地进行软件复用例如:JDK中的各个类String Integer3.3.3耦合非直接耦合内容耦合特征耦合数据耦合控制耦合公共耦合外部耦合弱强3.3.3耦合w非直接耦合:模块间没有信息传递w数据耦合:模块间交换的都是简单变量w特征耦合:
23、模块间交换的是数据结构w控制耦合:模块间传递的是控制信号w外部耦合:模块间共享同一个全局变量w公共耦合:模块间共享同一个全局数据结构w内容耦合:一个模块可以直接调用另一个模块的数据,或者允许直接转移到另一个模块3.4结构化设计w结构化设计(SD):面向数据流。注意力集中在模块的合理划分,得出体系结构图。适用于概要设计从分析模型导出设计模型DDE-RDFDSTD控制说明数据对象说明加工说明过程设计接口设计体系结构设计数据设计中心任务:DFD SC涵盖体系结构设计和接口设计结构化设计方法3.4.1 SC图组成w组成符号:模块、调用关系、数据流w6种模块:XY传入XY传出变换XYx源X漏Yx控制SC
24、图中的模块调用ABCXYZABCXYZABCXYZ模块调用实例1.2开发票1.3打印发票1.4登记售书打印领书单发票发票领书单1.1审查有效性购书单无效书单有效书单开发票打印发票打印领书单发票发票发票领书单A有效书单无效书单购书单3.4.2 数据流图的类型与SD的步骤w变换型结构w事务型结构(1)变换型结构w由传入路径、变换中心、传出路径组成变换中心传入路径传出路径变换型实例2.1按书号汇总2.2按出版社汇总书库保管员F5代购教材表F6教材一览表缺书单F2缺书登记表F1教材存量表(2)事务型结构w由接受路径、事务中心、动作路径组成事务中心接受路径动作路径事务型实例2接受接受订购订购3检查检查库
25、存库存4接受接受交易交易商品库存表商品库存表购买请求购买请求有效购买有效购买请求请求用用户户无效无效请求请求同时存在两种结构传入事务传入变换传出接受传出传出分支的分辨方法w同时执行:变换w只执行一条:事务学生1.1审查有效性购书单无效书单1.2检查存量有效书单1.5登记缺书暂缺书单1.3开发票有效书单1.6打印发票1.7登记售书打印领书单发票发票SD方法的步骤w复审DFDw鉴别软件结构类型w把DFD转换成SC 变换型DFD:变换映射 事务型DFD:事务映射w优化SC初始SC3.4.3变换映射w划分DFD图的边界w建立初始SC图的框架w分解SC图的分支划分DFD图ABCDEPRQWUVabcde
26、qrwuv传入部分变换中心传出部分建立SC图框架MCMAMTMEc,ec,eu,wu,w第一级分解顶层第一层分解传入分支MACEBDAc,ecebadMAGet CGet EGet BRead Ac,ecebaB To CA To BabbcRead DdD To Ede优化优化分解传出分支MEWUVu,wwuvMEWrite WPut UwuU To VvWrite Vv优化优化u,wu分解中心加工分支MTQPRec,pru,wpr合成初始SC图MCMAGet CGet EGet BRead AB To CA To BRead D D To EMTQPRMEWrite WPut UU To
27、V Write V3.4.4事务映射w确定事务中心、接受部分和发送部分w建立初始SC图的框架w分解SC图的分支识别各部分事务传入变换传出接受接受部分事务中心发送部分abcdef画出SC图框架事务控制接受发送分解w根据各分支的特性进行变换映射或事务映射w动作分支可划分为处理层、事务层、操作层、细节层w大型系统往往变换型和事务型交织在一起的混合结构分解事务控制接受发送aa事务1变换变换传出beeffb3.4.5结构化设计的优化原则w模块分割、合并和变动调用关系的原则 高内聚 低耦合 控制模块大小 10100行 不必拘泥于和DFD图的对应结构化设计的优化原则w保持高扇入/低扇出的原则 扇入:被其他模
28、块调用数 扇出:调用其他模块数 高扇入:模块利用率高 低扇出:模块调用和控制的复杂度低 通过增加中间层降低扇出 瓮型结构3.4.6教材购销系统实例学生学生1.1审查有效性1.2开发票1.3打印发票1.4登记售书打印领书单1.5登记缺书1.6产生补售书单采购F2缺书登记表F1教材存量表F4售书登记表F3学生用书表购书单无效书单有效书单发票发票领书单进书通知补售书单暂缺书单教材购销系统实例2.1按书号汇总2.2按出版社汇总2.3进书处理书库保管员销售F2缺书登记表F1教材存量表F5代购教材表F6教材一览表缺书单进书通知进书通知实例复审并修改DFD学生学生1.1审查有效性1.2审查库存1.4打印发票
29、1.7打印领书单1.5登记缺书1.6产生补售书单采购F2缺书登记表F1教材存量表F4售书登记表F3学生用书表购书单无效书单有效书单发票领书单进书通知补售书单1.3登记售书1.8登记框架销售初售补售采购统计缺书 登记进书教材购销系统读命令判断销售子系统分界学生学生1.1审查有效性1.2审查库存1.4打印发票1.7打印领书单1.5登记缺书1.6产生补售书单采购F2缺书登记表F1教材存量表F4售书登记表F3学生用书表购书单无效书单有效书单发票领书单进书通知补售书单暂缺书单1.3登记售书1.8登记销售子系统销售初售补售登记缺书登记售书登记打印发票打印领书单产生补售书单读进书登记表审查有效性读购书单审查
30、库存无效提醒采购子系统(略)优化(略)3.5 模块设计(详细设计)w目的与任务w原则与方法w表达工具w实例3.5.1目的与任务w目的:为软件结构图中的每一个模块确定采用的算法算法和块内数据结构数据结构,用某种选定的表达工具给出更清晰地描述任务确定算法,写出详细过程性描述确定数据结构确定接口细节(内、外部接口,用户界面,接口数据等)编写过程设计说明书编写测试用例(输入数据,操作步骤,期望输出等)3.5.2过程设计的原则与方法w清晰第一 禁用GOTOw结构化的控制结构 3种基本结构 单入口、单出口w逐步细化3.5.3 常用表达工具w流程图和N-S图w伪代码和PDL语言例题int i = 1;int j = 1;while (i 100 & j 100) if (i j) i = i + 3; else j = j + 5; i+; j+printf(“i=%d,j=%d”, i, j);