1、软件工程导论软件工程导论(第五第五版版)全册配套课件全册配套课件POWER POINT( Software Engineering )第第1 1章:软件工程学概述章:软件工程学概述1.1 软件危机 60年代中期以前:通用硬件相当普遍,软件却是为某个具体的应用而编写的。 60年代中到70年代中:软件作坊。1.1.1 软件危机的介绍软件危机的典型表现:1.1.2 产生软件危机的原因1)软件本身特点造成;2)软件开发与维护的方法不正确。主要表现: (a)忽视软件需求分析; (b)认为软件开发就是写程序并使之运行; (c)轻视软件维护; 在软件开发的不同阶段进行修改需要付出的代价很不相同:高中低早期中
2、期后期软件开发时期代价引入同一修改的代价随时间变化的趋势1)推广使用在实践中总结出来的开发软件的成功技术和方法,并研究探索更有效的技术和方法;2)开发和使用更好的软件工具;3)良好的组织管理措施。 1.1.3 解决软件危机的途径 为了解决软件危机产生的问题,软件工程与方法学逐渐形成,然后出现了两个相互相承又各有侧重的学科: 1)软件工程学:主要应用工程的方法和技术研究软件开发与维护的方法、工具和管理的一门交叉学科。 2)程序设计方法学:主要应用数学的方法研究程序的性质以及程序设计的理论和方法的学科。 1.2 1.2 软件工软件工程程1.2.1 软件工程的介绍1968年NATO会议:软件工程就是
3、为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。1993年IEEE:软件工程是(1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程;(2)研究(1)中提到的途径。 1. 软件工程关注于大型程序的构造; 2. 软件工程的中心课题是控制复杂性; 3. 软件经常变化; 4. 开发软件的效率非常重要; 5. 和谐地合作是软件开发的关键; 6. 软件必须有效地支持它的用户; 7. 在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品。软件工程的本质特性:1.2.2 软件工程的基本原理1. 用分阶段的生命周期计划严格管理;2. 坚持进行阶
4、段评审;3. 实行严格的产品控制;4. 采用现代程序设计技术;5. 结果能清楚地审查;6. 开发小组的人员应该少而精;7. 承认不断改进软件工程实践的必要性。1.2.3 软件工程方法学 通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(Methodology),也称为范型(Paradigm)。 软件工程方法学的3要素:方法、工具和过程1. 传统方法学 也称为生命周期方法学或结构化范型。 结构化方法(Structure Method)有: 1)结构化设计方法(SD); 2)结构化分析方法(SA); 3)结构化分析与设计技术(SADT) 4)JACKSON方法 5)WARNIER方
5、法2. 面向对象方法学 把数据和对数据的操作紧密结合起来的方法,模拟人类认识世界解决问题的方法和过程。 面向对象的方法 =对象(属性与服务的封装) +分类 +继承 +通过消息的通讯1)适用于实时事物处理系统的有限状态机方法(FSM);2)适用于并发软件系统的PETRI网方法;3)以数学概念和理论为基础的形式化方法,如 SDC公司的形式化开发方法FDM: ( F o r m a l D e v e l o p m e n t Methodology) IBM公司的维也纳开发方法VDM: (Vienna Development Method ) 3. 其他开发方法 1.3 1.3 软件生命周期软件
6、生命周期软件生命周期:指软件从提出到最终被淘汰的这个存在期。 软件生命周期组成: 1)软件定义; A.问题定义 B.可行性研究 C.需求分析 2)软件开发; D.总体设计 E.详细设计 F.编码和单元测试 G.综合测试 3)运行维护。 1.问题定义; 2.可行性研究; 3.需求分析; 4.总体设计(概要设计); 5.详细设计; 6.编码与单元测试; 7.综合测试; 8.维护。软件生命周期各个阶段:1.4 1.4 软件过程软件过程软件过程:为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。软件过程(ISO9000):使用资源将输入转化为输出的活动所构成的系统。输入:
7、如软件需求输出:如软件产品1.4.1 瀑布模型1. 阶段间具有顺序性和依赖性2. 推迟实现的观点3. 质量保证的观点优点:采用规范的方法;严格规定每个阶段提交的文档;要求每个阶段交出的产品必须经过验证。1.4.2 快速原型模型优点:不带反馈环,基本上是线性顺序进行。1.4.3 增量模型优点:能较短时间内提交可完成部分工作的产品;可以使用户有充裕的时间学习和适应新产品。一种风险更大的增量模型:1.4.4 螺旋模型 可把它看作在每个阶段之前都增加风险分析的快速原型模型。1.4.5 喷泉模型 典型的面向对象软件开发过程模型之一。1.4.6 Rational 1.4.6 Rational 统一过统一过
8、程程1. RUP软件开发经验(1)迭代式开发(2)管理需求(3)使用基于构件的体系结构(4)可视化建模(5)贯穿于开发过程的软件质量验证(6)控制软件变更1.4.7 1.4.7 敏捷过程与极限编程敏捷过程与极限编程1.敏捷过程 具有高效、快速响应变化的开发过程。(1)个体和交互胜过过程和工具;(2)可以工作的软件胜过面面俱到的文档;(3)客户合作胜过合同谈判;(4)响应变化胜过遵循计划。2.极限编程 敏捷过程中最著名的一种,指把好的开发实践运用到极致,多应用于软件需求模糊的场合。1.4.8 1.4.8 微软过程微软过程1.微软过程准则2.微软软件生命周期(1)规划阶段(2)设计阶段(3)开发阶
9、段(4)稳定阶段(5)发布阶段3.微软过程模型 问题定义就是要确定为用户建立什么样的软件系统,软件叫什么样的名称等等。“问题”是指软件最基本的问题,如: 软件的总体目标什么? 有什么用途? 为那些用户设计? 1.5 1.5 问题定义阶段问题定义阶段问题定义报告的内容包括: 1)软件项目标题; 2)软件目标; 3)软件用户对象; 4)软件规模。 问题定义是软件生命周期中时间最短的阶段,一般都比较简单,因此在实际开发中它是最容易被忽视的一个阶段。 这一阶段工作主要由系统分析员来完成,系统分析员要尽可能从较高的角度概括软件所要做的工作,而不用写明问题的实现细节。 第第2 2章:可行性研究章:可行性研
10、究 可行性研究就是要回答“所定义的问题有可行的解决办法吗?”。 可行性研究的目的是:用最小的代价在尽可能短的时间内确定问题是否有解,以及是否值得去解。2.1 可行性研究的任务 可行性研究所需的时间取决于工程的规模,所需要的成本要占工程总成本的5%10%。可行性研究的内容:1)技术可行性技术可行性要分析各种技术因素,例如: 使用现有的技术能否实现这个系统? 是否有胜任开发该项目的熟练技术人员? 能否按期得到开发该项目所需的软件、硬件资源?2)经济可行性 对经济合理性进行评价,所要考虑的问题是: 这个系统的经济效益能否超过它的开发成本? 这就需要对项目进行价格/利益分析,即“投入/产出”分析。 由
11、于利益分析取决于软件系统的特点,因此在软件开发之前,很难对新系统产生的效益作出精确的定量描述,所以往往采用一些估算方法。3)操作可行性 操作可行性评价系统运行后会引起的各方面变化,如:对组织机构管理模式、用户工作环境等产生的影响。 4)社会可行性 社会可行性主要讨论法律方面和使用方面的可行性。 例如,被开发软件的权利归属问题、软件所使用的技术是否会造成侵权等问题。2.2 2.2 可行性研究的步可行性研究的步骤骤 1)复查系统规模和目标;2)研究目前正在使用的系统;3)导出新系统的高层逻辑模型(数据流图、数据字典);4)重新定义问题; 5)导出和评价供选择的解法(物理解决方案);6)推荐行动方案
12、;7)草拟开发计划;8)书写文档提交审查。 2.2 2.2 可行性研究的步可行性研究的步骤骤 2.3 2.3 系统流程图系统流程图 (描绘物理系统的工(描绘物理系统的工具)具)2.3.1 符号 符号名称说明处理如:程序,处理机,人工加工输入/输出连接换页连接数据流表示输入或输出同一页上图的连接不同页上图的连接指明数据流动方向图2.1 基本符号符号名称说明穿孔卡片文档磁带联机存储磁盘磁鼓显示人工输入人工操作辅助操作通信链路穿孔卡片输入/输出,或穿孔卡片文件打印输出,或打印终端输入数据磁带输入/输出,或表示磁带文件任何种类磁盘存储,如磁盘、磁鼓等磁盘输入/输出,或磁盘上文件、数据库磁鼓输入/输出,
13、或磁鼓上文件、数据库显示器部件人工输入数据,如填写表格人工完成的处理使用辅助设备进行的脱机操作通过远程通信线路传送数据图2.2 系统符号2.3.2 例子 事务库存清单程序报告生成程序定货信息定货报告库存清单主文件图2.3 库存清单系统的系统流程图2.4 2.4 数据流图(描绘数据在系统中流动的逻辑过数据流图(描绘数据在系统中流动的逻辑过程)程)2.4.1 符号 或或或数据源点或终点变换数据的处理数据存储数据流图2.4 基本符号的含义TABC*TABC*附加符号TABC+TABC+2.4.2 绘制数据流图的例子 事务库存清单程序报告生成程序定货信息定货报告库存清单主文件图2.3 库存清单系统的系
14、统流程图2.4.2 绘制数据流图的例子 仓库管理员采购员定货系统事务定货报表图2.5 定货系统的基本系统模型2.4.2 绘制数据流图的例子 库存清单仓库管理员采购员事务定货报表图2.6 定货系统的功能级数据流图处理事务1产生报表2D1 库存清单D2 定货信息定货信息定货信息组成该例子的数据流图的元素源点/终点处理 采购员 仓库管理员 产生报表 处理事务数据流数据存储 订货报表 零件编号 零件名称 订货数量 目前价格 主要供应商 次要供应商 事务 零件编号 事务类型 数量 订货信息 (见订货报表) 库存清单 零件编号 库存量 库存量临界值2.4.2 绘制数据流图的例子 仓库管理员采购员事务定货报
15、表图2.7 定货系统进一步分解后的数据流图更新库存清单1.2产生报表2D1 库存清单D2 定货信息接收事务1.1处理定货1.3库存清单定货信息定货信息1)为数据流(或数据存储)命名 A名字应该代表整个数据流(或数据存储)的内容; B不要使用空洞的、缺乏具体含义的名字(如“数据”、“输入”); 2.4.3 命名 C如果为某个数据流(或数据存储)起名字时遇到困难,则很可能是因为对数据流图的分解不恰当造成的,应该试试重新分解数据流图; 2)为处理命名 A通常先为数据流命名,然后再为与之相关联的处理命名; B名字应该反映整个处理的功能; C应该尽量避免空洞笼统的动词做名字,如“处理”、“加工”; D通
16、常用一个动词命名,如果必须用两个动词才能描述整个处理的功能,则可能要把这个处理分解成两个处理更恰当; E如果在为某个处理命名时遇到困难,则很可能是发现了分解不当的情况,应考虑重新分解。 通常,为“数据源点/终点”命名时,采用它们在问题域中习惯使用的名字(如“仓库管理员”、“采购员”)。1)利用它作为交流信息的工具;2)作为软件分析和设计的工具。2.4.4 数据流图的用途 2.4.4 数据流图的用途 仓库管理员采购员事务定货报表图2.8 这种自动化边界建议以联机方式更新库存清单更新库存清单1 .2产生报表2D1库存清单D2定货信息接收事务1 .1处理定货1 .3库存清单定货信息定货信息图2.8
17、对应的物理实现硬件方案2.4.4 数据流图的用途 仓库管理员采购员事务定货报表图2.9 这种自动化边界暗示以批量方式更新库存清单更新库存清单1 .2产生报表2D1 库存清单D2定货信息接收事务1 .1处理定货1 .3库存清单定货信息定货信息D3 事务图2.9 对应的物理实现硬件方案 数据字典:对数据流图中包含的所有元素的定义的集合; 可行性研究阶段,数据流图与数据字典共同构成系统的逻辑模型。2.5 2.5 数据字典数据字典 2.5.1 数据字典的内容数据字典应该对下列元素进行定义: 1)数据流; 2)数据元素(数据流分量); 3)数据存储; 4)处理。 1)数据元素字典定义其定义的基本内容有:
18、 A数据元素编号、名称及其含义; B数据类型和长度; C合理取值; D其他内容,如它与其它数据的逻辑关系等。2.5.2 定义数据的方法数据元素字典定义实例:数据元素编号:DC001数据元素名称:考试成绩别名:成绩、分数简述:学生考试成绩,分五个等级类型/长度:两个字节,字符类型取值/含义:优 90-100 良 80-89 中 70-79 及格 60-69 不及格 0-59有关数据项或结构:学生成绩档案有关处理逻辑:计算成绩 图2.10 数据元素字典定义2)数据流字典定义其定义的基本内容有: A数据流编号及名称; B数据流来源; C数据流去处; D数据流的组成; E流通量; F峰值。数据流字典定
19、义实例:数据流编号:DF001数据流名称:订票单简述:订票时填写的订票单数据流来源:外部实体“乘客”数据流去处:处理逻辑“预订机票”数据流组成:订单编号 日期 乘客号 航班号 状态 订单失效日期流通量:每天300份高峰值流通量:每天早上9:00,约160份图2.11 数据流字典定义3)数据存储字典定义其定义的基本内容有: A数据存储编号及名称; B数据存储的组成; C其它要求。4)数据处理字典定义其定义的基本内容有: A数据处理编号及名称; B简单描述; C输入/输出; D功能描述; E有关数据存储。 数据处理字典定义实例:数据处理编号:DP001数据处理名称:编辑订票简述:接收从终端录入的订
20、票单,检验是否正确输入:乘客订单,来源:外部实体“乘客”输出:1.合格订单,去处:处理逻辑“确定订票” 2.不及格订单,去处:外部实体“乘客”功能描述:(略)图2.12 数据处理字典定义5)组成数据项的表示方法 = 表示“等价于”或“定义为” + 表示“与” 与 | 表示“或” 表示重复 ( ) 表示可选项 通讯录=通讯地址 通讯地址=姓名+邮编+省|直辖市|自治区+市|县+街道+门牌号+(电话) 1. 作为分析阶段的重要工具;2. 数据元素的控制信息非常有用;3. 有助于开发数据库。2.5.3 数据字典的用途实现数据字典: 1)程序处理; 2)卡片式人工书写;2.5.4 数据字典的实现2.6
21、 2.6 成本成本/ /效益分效益分析析 1)代码行技术 软件成本 = 每行代码的平均成本估计的源代码总行数 2.6.1 成本估计2)任务分解技术 软件开发项目分解为若干个相对独立的任务,分别估计每个单独任务的成本: 单独任务成本 = 任务所需人力估计值每人每月平均工资; 软件开发项目总成本估计 = 各个单独任务成本估计值之和。 常用的办法是按开发阶段划分任务,典型环境下各个开发阶段需要使用的人力百分比大致如下:任务人力()可行性研究需求分析设计编码与单元测试综合测试总计5102520401003)自动估计成本技术 采用自动估计成本的软件工具估计。 1)Putnam 模型 1978年Putna
22、m提出的,一种动态多变量模型:软件开发成本估算的经验模型: Ck为技术状态常数,它反映“妨碍开发进展的限制”,取值因开发环境而异,见下表:Ck的典型值开发环境开发环境举例2000差没有系统的开发方法,缺乏文档和复审8000好有合适的系统的开发方法,有充分的文档和复审11000优有自动的开发工具和技术2)COCOMO模型(constructive cost model) 这是由TRW公司开发,Boehm提出的结构化成本估算模型,是一种精确的、易于使用的成本估算方法。 基本COCOMO模型估算工作量和进度的公式如下: 工 作 量: MM = r(KDSI)c (人月) 开发时间: TDKV = a
23、(MM)b (月) DSI:源指令条数,不包括注释,1KDSI = 1000DSI MM:开发工作量(以人月计),1MM = 19 人日 = 152 人时 =1/12 人年 经验常数 r, c, a, b 取决于项目的总体类型 COCOMO模型中,考虑开发环境,软件开发项目的类型可以分为3种:1)组织型(organic) 相对较小、较简单的软件项目。开发人员对开发目标理解比较充分,与软件系统相关的工作经验丰富,对软件的使用环境很熟悉,受硬件的约束较小,程序的规模不是很大(下个状态加入谓词集P,把系统扩展成一个6元组后: 当前状态【菜单】事件【所选择的项】谓词下个状态 计算机系统中每个菜单驱动的
24、用户界面都是一个有穷状态机的实现。(5)ST(e,f):电梯e靠近f层时触发传感器,电梯控制器决定在当前楼层是否停下。(6)RL:电梯按钮或楼层按钮被按下进入打开状态4.2.2 例子:电梯的状态转换电梯状态转换规则:S(U,e,f)+DC(e,f)=M(U,e,f+1);S ( D ,e,f) + D C (e,f) = M ( D ,e,f- 1 ) ; S(N,e,f)+DC(e,f)=W(e,f)4.2.3 评价 有穷状态机描述规格说明: 当前状态事件谓词=下个状态 易于书写、验证、转变成设计或程序代码。有穷状态机方法比数据流图技术更精确,一样易于理解。但不能处理定时需求。4.3 Pet
25、ri4.3 Petri网网4.3.1 概念Petri网包含4种元素: 1)一组位置P,上例 PP1,P2,P3,P4 2)一组转换T,上例 Tt1,t2 3)输入函数I,上例 I(t1)=P2,P4 I(t2)=P2 4)输出函数O,上例O(t1)=P1 O(t2)=P3,P3更形式化的Petri网结构,是一个4元组(P,T,I,O)更形式化地:标记 M:P0,1,2,Petri网成为一个5元组(P,T,I,O,M)对Petri网的一个重要扩充是加入禁止线:4.3.2 例子1. 电梯按钮EBf 电梯中楼层 f 的按钮;Fg 楼层g;Ff 楼层 f。2. 楼层按钮FBfu 第 f 楼层向上按钮;
26、 FBfd 第 f 楼层向下按钮;小结 基于数学的形式化说明技术,目前还没有在软件产业界广泛应用; 应该把形式化方法与传统方法有机结合。第5章:总体设计 5.1 设计过程 1.设想供选择的方案 2.选择合理的方案 对每个合理的方案要提供: A系统流程图 B组成系统的物理元素清单 C成本/效益分析 D实现这个系统的进度计划 3.推荐最佳方案4.功能分解5.设计软件结构6.数据库设计 A模式设计 B子模式设计 C完整性和安全性设计 D优化 7.制定测试计划8.书写文档 A系统说明 B用户手册 C测试计划 D详细的实现计划 E数据库设计结果9.审查和复审 5.2 5.2 设计原理设计原理 如果一个大
27、型程序仅由一个模块组成,很难被人理解。 设函数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.2.1 模块化模块数目接口成本成本/模块软件总成本M最小成本区成本图5.1 模块化与软件成本5.2.2 抽象 5.2.3 逐步求精模块的独立性很重要,因为: 1)有效的模块化的软件比较容易开发出来; 2)独立的模块比较容易测试和维护。 5.2.4 信息隐蔽和局部化
28、5.2.5 模块独立一、耦合 耦合:指软件结构内不同模块彼此之间相互依赖(连接)的紧密程度。 模块独立程度可以由两个定性标准度量:耦合与内聚。模块的偶合分四类:1)数据耦合 两个模块之间只是通过参数交换信息,而且交换的信息仅仅是数据。 数据耦合是最低程度的耦合。 AB数据(1)数据耦合2)控制耦合 两个模块之间所交换的信息包含控制信息。 控制耦合是中等程度的耦合。 图中模块A的内部处理程序判断是执行C还是执行D,要取决于模块B传来的信息状态(Status)。BACD(2)控制耦合astatus3)公用耦合 两个或多个模块通过一个公共区相互作用时的耦合。 公共区可以是:全程数据区、共享通信区、内
29、存公共覆盖区、任何介质上的文件、物理设备等。 软件结构中存在大量的公用耦合时会给诊断错误带来困难。 图中存在公用耦合,假设模块A、C、E都存取全程数据区(如公用一个磁盘文件)中的一个数据项。 如果A模块读取该项数据,然后调用C模块对该项重新计算,并进行数据更新。ABCDE全程数据区(3)公用耦合 如果此时C模块错误地更新了该项数据,在往下的处理中模块E读该数据项时出现错误。 表面上看,问题由模块E产生,实际上由模块C引起。ABCDE全程数据区(3)公用耦合4)内容耦合 一个模块与另一个模块的内容直接发生联系。 内容耦合对维护会带来严重的困难。 模块ALAB:MOVE 1模块BGOTO LAB内
30、容耦合(4)内容耦合 程序中如果一个模块直接把程序转移到另一个模块中,或一个模块使用另一个模块内部的数据,都会产生内容耦合。内容耦合是最高程度的耦合,应该避免采用。 软件设计应追求尽可能松散耦合,避免强耦合,这样模块间的联系就越小,模块的独立性就越强,对模块的测试、维护就越容易。 因此建议:尽量使用数据耦合,少用控制耦合,限制公用耦合,完全不用内容偶合。 二、内聚 内聚:一个模块内部各个元素彼此结合的紧密程度。 它是衡量一个模块内部组成部分间整体统一性的度量。 常见的内聚有七类。 1)功能内聚(Functional Cohesion) 如果一个模块内所有处理元素完成一个,而且仅完成一个功能,则
31、称为功能内聚。 功能内聚是最高程度的内聚。但在软件结构中,并不是每个模块都能设计成一个功能内聚模块。2)顺序内聚(Sequential Cohesion) 如果一个模块内处理元素和同一个功能密切相关,而且这些处理元素必须顺序执行,则称为顺序内聚。 如图,一个求一元二次方程根的模块由三个处理元素组成,该模块中存在顺序内聚。 通常,顺序内聚中一个处理元素的输出是另一个处理元素的输入。 求一元二次方程根模块1输入方程系数2求解3打印方程的解顺序内聚示例3 ) 通 信 内 聚 ( C o m m u n i c a t i o n a l Cohesion) 如果一个模块中所有处理元素都使用同一个输入
32、数据和(或)产生同一个输出数据,称为通信内聚。 如图,模块A的处理单元将根据同一个数据文件FILE的数据产生不同的表格,因此它存在通信内聚。 通信内聚有时也称为数据内聚。A从文件FILE中读出数据1.由数据产生报表A2.由数据产生报表B通信内聚示例4)过程内聚(Procedural Cohesion) 如果一个模块内的处理元素是相关的,而且必须以特定的次序执行,称为过程内聚。 过程内聚与顺序内聚的区别是: 顺序内聚中是数据流从一个处理单元流到另一个处理单元,而过程内聚是控制流从一个动作流向另一个动作。 5)时间内聚(Temporal Cohesion) 如果一个模块包含的任务必须在同一段时间内
33、执行,称为时间内聚。也称为瞬时内聚。 例如,完成各种初始化工作的模块,或者处理故障的模块都存在时间内聚。 如图,在“紧急故障处理模块”中,“关闭文件”、“报警”、“保留现场”等任务都必须无中断地同时处理。紧急故障处理模块1关闭文件2报警3保留现场时间内聚示例6)逻辑内聚(Logical Cohesion) 如果模块完成的任务在逻辑上属于相同或相似的一类,称为逻辑内聚。 如图,A、B、C模块合并成ABC模块之后,ABC模块就是逻辑内聚模块。 XYZABCXYZABC合并逻辑内聚示例 对逻辑内聚模块的调用,常常需要有一个功能开关,由上层调用模块向它发出一个控制信号,在多个关联性功能中选择执行某一个
34、功能。 这种内聚较差,增加了模块之间的联系,不易修改。 7)偶然内聚(Coincidental Cohesion) 如果一个模块由完成若干毫无关系的功能处理元素偶然组合在一起的,就叫偶然内聚。 偶然内聚是最差的一种内聚。 常犯这种错误的一种情况是:有时在写完程序后,发现一组语句在多处出现,于是为了节省空间而将这些语句作为一个模块设计,就出现偶然内聚。 如图,模块A、B、C出现公共代码段W,于是将W独立成一个模块,而W中这些语句并没有任何联系。 如果在测试中发现模块A不需要做“X=Y+Z”,而应该做“X=Y*Z”,此时对W的维护就很困难了。ABCW模块X=Y+ZGET CARDI F I = 5
35、 T H E N E=0偶然内聚示例 软件设计中应该:力求做到高内聚,尽量少用中内聚,不用低内聚。 5.3 5.3 启发式规则启发式规则 1. 改进软件结构提高模块独立性2.模块规模应该适中 3. 深度、宽度、扇出和扇入都应适当 深度:软件结构中控制的层数; 宽度:软件结构内同一个层次上的模块总数的最大值; 扇出:一个模块直接控制(调用)其它模块的数目; 扇入:一个模块被其它模块调用的数目。 正文加工系统输入输出编辑加标题存储检索编目录格式化添加删除插入修改合并列表对扇出、扇入过大的改进: (a)对扇入过大的改进(b)对扇出过大的改进4. 模块的作用域应该在控制域之内 MAGBCEDF图5.2
36、 模块的作用域和控制域作用域:受该模块内一个判定影响的所有模块的集合。控制域:模块本身以及所有从属于它的模块的集合。 如:QUAD-ROOT(TBL,X) 求一元二次方程的根的模块,其中TBL,X都为数组,分别代表方程的系数和方程的根。 应该使接口更简单,如: QUAD-ROOT(A,B,C,ROOT1,ROOT2) A 、 B 、 C 是 方 程 的 系 数 , R O OT 1 ,ROOT2是方程的根。 5. 力争降低模块接口的复杂度6.设计单入口、单出口的模块 7.模块功能应该可以预测 5.4 图形工具5.4.1 层次图和HIPO图 正文加工系统输入输出编辑加标题存储检索编目录格式化添加
37、删除插入修改合并列表图5.3 正文加工系统的层次图正文加工系统输入1.0输出2.0编辑3.0加标题4.0存储5.0检索6.0编目录7.0格式化8.0添加3.1删除3.2插入3.3修改3.4合并3.5列表3.6图5.4 带编号的层次图(H图)HIPO图是:“层次图输入/处理/输出图”5.4.2 结构图 产生最佳解得到好输入计算最佳解输出结果读输入编辑输入结果格式化显示结果图4.5 结构图的例子产生最佳解的一般结构MAB图5.6 判定为真时调用A,为假时调用BMABC图5.7 模块M循环调用模块A、B、C5.5 5.5 面向数据流的设计方法面向数据流的设计方法 面向数据流设计(Data Flow-
38、Oriented Design,DFOD)是与数据流分析(DFA)对应的结构化软件设计技术。 面向数据流的设计将得到以数据流图为基础的软件模块结构图。 数据流可以分为两种类型: 1)变换型数据流 2)事务型数据流 5.5.1 变换流与事务流一、变换流 具有较明确的输入、变换(或称主加工)和输出界面的数据流图称为变换型数据流图。 如图所示,该变换中心可以理解为数据的加工和处理程序。 读入原始数据校验原始数据计算最优结果编辑打印最优结果输入变换中心输出 事务型数据流图中存在一个事务中心(也就是数据处理、加工中心),它将输入分离成若干个发散的数据流,形成许多活动路径,并根据输入值选择其中一条路径。要
39、求类别处理分房处理调房处理退房处理住房要求事务中心活动路径 二、事务流 通常,一个实际系统的数据流图是变换型和事务型两种类型的混合体。 如图所示,中间的子块属事务型数据流,如果把中间子块视为一个处理整体的话,整个程序属变换型程序。 A(事务型,A为事务中心)变换中心输入输出混合型数据流图面向数据流设计软件结构的基本步骤有七步: 1)复审并精化数据流图; 2)确定数据处理流图的类型; 3)确定变换中心或事务中心; 5.5.2 面向数据流设计的步骤4)将数据流图映射成软件模块结构图,设计出该数据流图对应的第一层模块结构;5)基于数据流图逐步分解,设计下层模块;6)运用模块设计和优化准则优化软件结构
40、;7)描述模块的接口。复查、精化数据流图类型找出事务中心找出变换中心映射成事务结构映射成变换结构优化软件模块结构导出模块结构复查不满意变换事务变换设计事务设计面向数据流的设计步骤 变换设计就是从变换型数据流图映射出软件模块结构的过程,也称以变换为中心的设计。 5.5.3 变换设计变换设计的基本方法有两步:1)分解第一层模块结构 就是把整个变换分解成输入控制模块Ci、输出控制模块Co和变换中心控制模块Ct,由主控模块控制。 主控模块输出控制模块Co变换中心控制模块Ct输入控制模块Ci2)分别设计输入、输出和处理的下层模块结构 方法是: 从变换中心边界向两侧移动,分别把输入通路和输出通路的每个处理
41、映射成输入控制模块Ci和输出控制模块Co的下属模块。 变换中心的下层模块,是把每个处理映射成变换中心控制模块Ct的一个直接下属模块。 ABCDFEGHIJK变换中心输入输出主控模块输出控制模块Co变换中心控制模块Ct输入控制模块CiDCBAEFGIHJK 事务设计就是从事务型数据流图映射出软件模块结构的过程,也称为以事务为中心的设计。 5.5.4 事务设计事务设计的基本方法有两步: 1)建立主控模块、接收输入类型分析模块和事务调度模块;主模块调度输入类型分析2)分别设计输入类型分析模块和调度模块的下层模块结构。 方法是:将输出的每条通路作为调度模块的一个判断分支,而输入类型分析模块的下层模块与
42、变换设计类似。 I2I3I1TCA1B1C1A2B2C2事务中心主模块调度输入类型分析I1I3I2A1A2B1B2C1C2第第5 5章小结章小结 概要设计说明书 该说明书是概要实际阶段的工作成果,它应说明功能分配、模块划分、程序的总体结构、输入输出以及接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。第第6 6章:详细设计章:详细设计 目标:确定如何具体实现所要求的系统。 不是具体编写程序,而是设计程序的“蓝图”。 详细设计的结果决定最终程序代码的质量。 E.W.Dijkstra 最早提出结构程序设计:程序质量与程序中包含的Goto语句的数量成反比(1965)。 1966
43、,Bohm, Jacopini ,证明了只用“顺序”、“选择”、“循环”控制结构就能实现任何单入口单出口程序。6.1 6.1 结构程序设计结构程序设计 理论上,最基本的控制结构只有两种:顺序、循环结构(选择结构可由其两者构造)。 学界认识到,不是简单去掉Goto语句的问题,而是要创立一种新的程序设计方法。 结构化程序设计(IBM率先成功运用)。结构程序设计: 一种设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。 使用结构程序设计技术的好处:1)提高软件开发工程的成功率和生产率;2)系统有清晰的层次结构,容易阅读理解;3)单入口单出口的控制结构,容易诊断纠正;4)模块化
44、可以使得软件可以重用;5)程序逻辑结构清晰,有利于程序正确性证明。经典的结构程序设计:只允许使用顺序、IF_THEN_ELSE选择和DO_WHILE循环;扩展的结构程序设计:除了三种基本控制结构,还使用DO_CASE和DO_UNTIL循环;修正的结构程序设计:除了三种基本控制结构和两种扩充结构,还使用BREAK等结构。 流程图通常由三种结点组成:1)函数结点 如果一个结点有一个入口线和一个出口线,则称为函数结点。 由于函数结点一般对应于赋值语句,所以 F 也表示了这一个结点对应的函数关系。 F函数结点6.1.1 结构化程序6.1.1.1 控制结构2)谓词结点 如果一个结点有一个入口线和两个出口
45、线,而且它不改变程序的数据项的值,则称为谓词结点。 P是一个谓词,根据P的逻辑值(T或F),结点有不同的出口。 P谓词结点3)汇点 如果一个结点有两个或多个入口线和一个出口线,而且它不执行任何运算,则称为汇点 。汇点 汇点的简略表示1)顺序结构:相当于“A、B” 2. 三种基本控制结构AB(a)顺序结构2)选择结构 相当于“If exp then A else B endif ” ABexp(b)选择结构3)循环结构:相当于“While exp do A” A(c)循环结构exp1)多分支结构 相当于“Case I of I=1:C1; I=2:C2; I=3:C3; ; I=n:Cn” 3.
46、 扩充两种控制结构 CnC3C1C2(d)多分支结构I=?2)UNTIL循环结构 相当于“Repeat A Until exp” A(e)UNTIL循环exp6.1.1.2 正规程序 定义1:一个流程图程序如果满足下面两个条件,称为正规程序: 1)具有一个入口线和一个出口线; 2)对每一个结点,都有一条从入口线到出口线的通路通过该结点。 由于正规程序有一个入口线和一个出口线,因而一个正规程序总可以抽象为一个函数结点。 F函数结点定义2:如果一个正规程序的某个部分仍然是正规程序,那么称它为该正规程序的正规子程序。 先给出一个概念:封闭结构定义3:流程图中,两个结点之间所有没有重复结点的通路组成的
47、结构称为封闭结构。6.1.1.3 基本程序 如图:封闭结构为 a - b1 - b2 - b3 ; c1 - c2 ; d1 - d2 - d3 ; e - f ab1b2b3c2c1d1d2d3ef1)不包括多于一个结点的正规子程序,即它是一种不可再分解的正规程序;(程序自身不可视为正规子程序) 2)如果存在封闭结构,封闭结构都是正规程序。 6.1.1.3 基本程序 定义4:一个正规程序,如果满足以下两个条件,则称之为基本程序: 基本程序形式有多种,前面提到的三种基本控制结构(顺序结构、选择结构、循环结构)和两个扩充控制结构(多分支结构、UNTIL循环结构)都是基本程序。 定义5: 用以构造
48、程序的基本程序的集合称为基集合。 如:顺序,if-then-else,while do 顺序,if-then-else,repeat-until 都是基集合。 定义6:如果一个基本程序的函数结点用另一个基本函数程序替换,产生的新的正规程序称为复合程序。 A复合程序expBexpA: 循环结构的A函数结点用另一循环结构代替,即嵌套循环,就产生了复合程序。 由于复合程序是由一些基本程序组成,因此,无论从总体上看或是从每个组成部分看,都满足“一个入口,一个出口”的原则,这样的程序就是通常说的好结构程序,或者结构化程序。 定义7:由基本程序的一个固定的基集合构造出的复合程序,称为结构化程序。结构化定理
49、:任一正规程序都可以函数等价于一个由基集合顺序,If-else-then,While-do产生的结构化程序。 实际上,只要能证明可以将任一正规程序转换成等价的结构化程序就可以证明这个结构化定理。 6.1.2 结构化定理证明:(分三步进行结构化程序的转换)步骤一:从程序入口处开始给程序的函数结点和谓词结点编号:1,2,3,n,同时,将每个函数和谓词结点的出口线用它后面的结点的号码进行编号,如果出口线后面没有结点,也就是说该结点的出口线与程序的出口线相连时,出口线编号为0。 步骤二:对原程序中每一个编号为i, 出口线编号为j的函数结点H,构造一个新的序列程序Gi,如图: HGi =HL:= jii
50、j 类似地,对于每个编号为i,出口线分别为j和k的谓词结点,构造一个新的选择程序Gi,如图: PjkiGi =PiL := jL := k步骤三:利用已经得到的一些Gi程序(i=1,2,3,n),按下图的形式构造一个While-do循环。 图中的循环体是一个对L从1到n的嵌套选择(if-then-else)程序,转换后的程序与原程序是等价的,是由基集合顺序、选择、循环 所复合成的结构化程序。L:=1L0L=1L=nL=2GnL:=0G2G1TTTTFFFF 这种方法并不是唯一的把程序转变为结构化程序的方法,所得的程序也不一定是最好的。 它的目的是为了证明结构化定理。例1:把图示的非结构化程序转