《软件工程完整教程课件.ppt》由会员分享,可在线阅读,更多相关《软件工程完整教程课件.ppt(706页珍藏版)》请在三一办公上搜索。
1、软件工程完整教程,软件工程完整教程软件工程完整教程第1章:软件工程学概述1.1 软件危机 60年代中期以前:通用硬件相当普遍,软件却是为某个具体的应用而编写的。60年代中到70年代中:软件作坊。,书籍能培养我们的道德情操,给我们巨大的精神力量,鼓舞我们前进,第1章:软件工程学概述,1.1 软件危机 60年代中期以前:通用硬件相当普遍,软件却是为某个具体的应用而编写的。60年代中到70年代中:软件作坊。,软件危机:计算机软件的开发和维护过程中所遇到的一系列严重问题。(正常、不正常运行软件都具有这种问题),1.1.1 软件危机的介绍,1)对软件开发成本和进度的估计常常很不准确;2)用户对完成的软件
2、系统不满意的现象经常发生;3)软件产品的质量往往靠不住;,软件危机的典型表现:,4)软件常常是不可维护的;5)软件通常没有适当的文档资料;6)软件成本在计算机系统总成本中所占的比例逐年上升;7)软件开发生产率提高的速度跟不上计算机应用的发展趋势。,1.1.2 产生软件危机的原因,1)软件本身特点造成;2)软件开发与维护的方法不正确。,主要表现:(a)忽视软件需求分析;(b)认为软件开发就是写程序并使之运行;(c)轻视软件维护;,在软件开发的不同阶段进行修改需要付出的代价很不相同:,1)推广使用在实践中总结出来的开发软件的成功技术和方法,并研究探索更有效的技术和方法;2)开发和使用更好的软件工具
3、;3)良好的组织管理措施。,1.1.3 解决软件危机的途径,为了解决软件危机产生的问题,软件工程与方法学逐渐形成,然后出现了两个相互相承又各有侧重的学科:1)软件工程学:主要应用工程的方法和技术研究软件开发与维护的方法、工具和管理的一门交叉学科。2)程序设计方法学:主要应用数学的方法研究程序的性质以与程序设计的理论和方法的学科。,1.2 软件工程,1.2.1 软件工程的介绍,1968年NATO会议:软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。,1993年IEEE:软件工程是(1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程;(2
4、)研究(1)中提到的途径。,1.软件工程关注于大型程序的构造;2.软件工程的中心课题是控制复杂性;3.软件经常变化;4.开发软件的效率非常重要;5.和谐地合作是软件开发的关键;6.软件必须有效地支持它的用户;7.在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品。,软件工程的本质特性:,1.2.2 软件工程的基本原理,1.用分阶段的生命周期计划严格管理;2.坚持进行阶段评审;3.实行严格的产品控制;4.采用现代程序设计技术;5.结果能清楚地审查;6.开发小组的人员应该少而精;7.承认不断改进软件工程实践的必要性。,1.2.3 软件工程方法学 通常把在软件生命周期全过程中使
5、用的一整套技术方法的集合称为方法学(Methodology),也称为范型(Paradigm)。软件工程方法学的3要素:方法、工具和过程,1.传统方法学 也称为生命周期方法学或结构化范型。结构化方法(Structure Method)有:1)结构化设计方法(SD);2)结构化分析方法(SA);3)结构化分析与设计技术(SADT)4)JACKSON方法 5)WARNIER方法,2.面向对象方法学 把数据和对数据的操作紧密结合起来的方法,模拟人类认识世界解决问题的方法和过程。面向对象的方法=对象(属性与服务的封装)+分类+继承+通过消息的通讯,1)适用于实时事物处理系统的有限状态机方法(FSM);2
6、)适用于并发软件系统的PETRI网方法;3)以数学概念和理论为基础的形式化方法,如 SDC公司的形式化开发方法FDM:(Formal Development Methodology)IBM公司的维也纳开发方法VDM:(Vienna Development Method),3.其他开发方法,1.3 软件生命周期,软件生命周期:指软件从提出到最终被淘汰的这个存在期。,软件生命周期组成:1)软件定义;A.问题定义 B.可行性研究 C.需求分析 2)软件开发;D.总体设计 E.详细设计 F.编码和单元测试 G.综合测试 3)运行维护。,1.问题定义;2.可行性研究;3.需求分析;4.总体设计(概要设计
7、);5.详细设计;6.编码与单元测试;7.综合测试;8.维护。,软件生命周期各个阶段:,1.4 软件过程,软件过程:为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。软件过程(ISO9000):使用资源将输入转化为输出的活动所构成的系统。输入:如软件需求输出:如软件产品,1.4.1 瀑布模型,1.阶段间具有顺序性和依赖性2.推迟实现的观点3.质量保证的观点,优点:采用规范的方法;严格规定每个阶段提交的文档;要求每个阶段交出的产品必须经过验证。,1.4.2 快速原型模型优点:不带反馈环,基本上是线性顺序进行。,1.4.3 增量模型,优点:能较短时间内提交可完成部分工
8、作的产品;可以使用户有充裕的时间学习和适应新产品。,一种风险更大的增量模型:,1.4.4 螺旋模型 可把它看作在每个阶段之前都增加风险分析的快速原型模型。,1.4.5 喷泉模型,典型的面向对象软件开发过程模型之一。,1.4.6 Rational 统一过程,1.RUP软件开发经验(1)迭代式开发(2)管理需求(3)使用基于构件的体系结构(4)可视化建模(5)贯穿于开发过程的软件质量验证(6)控制软件变更,1.4.7 敏捷过程与极限编程,1.敏捷过程 具有高效、快速响应变化的开发过程。(1)个体和交互胜过过程和工具;(2)可以工作的软件胜过面面俱到的文档;(3)客户合作胜过合同谈判;(4)响应变化
9、胜过遵循计划。2.极限编程 敏捷过程中最著名的一种,指把好的开发实践运用到极致,多应用于软件需求模糊的场合。,1.4.8 微软过程,1.微软过程准则2.微软软件生命周期(1)规划阶段(2)设计阶段(3)开发阶段(4)稳定阶段(5)发布阶段3.微软过程模型,问题定义就是要确定为用户建立什么样的软件系统,软件叫什么样的名称等等。“问题”是指软件最基本的问题,如:软件的总体目标什么?有什么用途?为那些用户设计?,1.5 问题定义阶段,问题定义报告的内容包括:1)软件项目标题;2)软件目标;3)软件用户对象;4)软件规模。,问题定义是软件生命周期中时间最短的阶段,一般都比较简单,因此在实际开发中它是最
10、容易被忽视的一个阶段。这一阶段工作主要由系统分析员来完成,系统分析员要尽可能从较高的角度概括软件所要做的工作,而不用写明问题的实现细节。,第2章:可行性研究,可行性研究就是要回答“所定义的问题有可行的解决办法吗?”。可行性研究的目的是:用最小的代价在尽可能短的时间内确定问题是否有解,以与是否值得去解。,2.1 可行性研究的任务,可行性研究所需的时间取决于工程的规模,所需要的成本要占工程总成本的5%10%。,可行性研究的内容:1)技术可行性技术可行性要分析各种技术因素,例如:使用现有的技术能否实现这个系统?是否有胜任开发该项目的熟练技术人员?能否按期得到开发该项目所需的软件、硬件资源?,2)经济
11、可行性 对经济合理性进行评价,所要考虑的问题是:这个系统的经济效益能否超过它的开发成本?这就需要对项目进行价格/利益分析,即“投入/产出”分析。由于利益分析取决于软件系统的特点,因此在软件开发之前,很难对新系统产生的效益作出精确的定量描述,所以往往采用一些估算方法。,3)操作可行性 操作可行性评价系统运行后会引起的各方面变化,如:对组织机构管理模式、用户工作环境等产生的影响。,4)社会可行性 社会可行性主要讨论法律方面和使用方面的可行性。例如,被开发软件的权利归属问题、软件所使用的技术是否会造成侵权等问题。,2.2 可行性研究的步骤,1)复查系统规模和目标;2)研究目前正在使用的系统;3)导出
12、新系统的高层逻辑模型(数据流图、数据字典);4)重新定义问题;,5)导出和评价供选择的解法(物理解决方案);6)推荐行动方案;7)草拟开发计划;8)书写文档提交审查。,2.2 可行性研究的步骤,2.3 系统流程图(描绘物理系统的工具),2.3.1 符号,2.3.2 例子,2.4 数据流图(描绘数据在系统中流动的逻辑过程),2.4.1 符号,注意:“处理”可表示:单个程序、一系列程序、程序的一个模块、人工处理过程等等;“数据存储”可表示:一个文件、文件的一部分、数据库记录等等;数据流图忽略出错处理、打开文件、关闭文件。,2.4.2 绘制数据流图的例子,2.4.2 绘制数据流图的例子,仓库管理员,
13、采购员,定货系统,事务,定货报表,图2.5 定货系统的基本系统模型,2.4.2 绘制数据流图的例子,库存清单,仓库管理员,采购员,事务,定货报表,图2.6 定货系统的功能级数据流图,定货信息,定货信息,组成该例子的数据流图的元素,上述数据流图所描述的功能够详细了吗?,2.4.2 绘制数据流图的例子,1)为数据流(或数据存储)命名 A名字应该代表整个数据流(或数据存储)的内容;B不要使用空洞的、缺乏具体含义的名字(如“数据”、“输入”);,2.4.3 命名,C如果为某个数据流(或数据存储)起名字时遇到困难,则很可能是因为对数据流图的分解不恰当造成的,应该试试重新分解数据流图;,2)为处理命名 A
14、通常先为数据流命名,然后再为与之相关联的处理命名;B名字应该反映整个处理的功能;C应该尽量避免空洞笼统的动词做名字,如“处理”、“加工”;,D通常用一个动词命名,如果必须用两个动词才能描述整个处理的功能,则可能要把这个处理分解成两个处理更恰当;E如果在为某个处理命名时遇到困难,则很可能是发现了分解不当的情况,应考虑重新分解。,通常,为“数据源点/终点”命名时,采用它们在问题域中习惯使用的名字(如“仓库管理员”、“采购员”)。,1)利用它作为交流信息的工具;2)作为软件分析和设计的工具。,2.4.4 数据流图的用途,2.4.4 数据流图的用途,图2.8 对应的物理实现硬件方案,2.4.4 数据流
15、图的用途,图2.9 对应的物理实现硬件方案,数据字典:对数据流图中包含的所有元素的定义的集合;可行性研究阶段,数据流图与数据字典共同构成系统的逻辑模型。,2.5 数据字典,2.5.1 数据字典的内容数据字典应该对下列元素进行定义:1)数据流;2)数据元素(数据流分量);3)数据存储;4)处理。,1)数据元素字典定义其定义的基本内容有:A数据元素编号、名称与其含义;B数据类型和长度;C合理取值;D其他内容,如它与其它数据的逻辑关系等。,2.5.2 定义数据的方法,数据元素字典定义实例:,2)数据流字典定义其定义的基本内容有:A数据流编号与名称;B数据流来源;C数据流去处;D数据流的组成;E流通量
16、;F峰值。,数据流字典定义实例:,3)数据存储字典定义其定义的基本内容有:A数据存储编号与名称;B数据存储的组成;C其它要求。,4)数据处理字典定义其定义的基本内容有:A数据处理编号与名称;B简单描述;C输入/输出;D功能描述;E有关数据存储。,数据处理字典定义实例:,5)组成数据项的表示方法=表示“等价于”或“定义为”+表示“与”与|表示“或”表示重复()表示可选项 通讯录=通讯地址 通讯地址=姓名+邮编+省|直辖市|自治区+市|县+街道+门牌号+(电话),1.作为分析阶段的重要工具;2.数据元素的控制信息非常有用;3.有助于开发数据库。,2.5.3 数据字典的用途,实现数据字典:1)程序处
17、理;2)卡片式人工书写;,2.5.4 数据字典的实现,2.6 成本/效益分析,1)代码行技术 软件成本=每行代码的平均成本估计的源代码总行数,2.6.1 成本估计,2)任务分解技术 软件开发项目分解为若干个相对独立的任务,分别估计每个单独任务的成本:单独任务成本=任务所需人力估计值每人每月平均工资;软件开发项目总成本估计=各个单独任务成本估计值之和。,常用的办法是按开发阶段划分任务,典型环境下各个开发阶段需要使用的人力百分比大致如下:,3)自动估计成本技术 采用自动估计成本的软件工具估计。,1)Putnam 模型 1978年Putnam提出的,一种动态多变量模型:,软件开发成本估算的经验模型:
18、,Ck为技术状态常数,它反映“妨碍开发进展的限制”,取值因开发环境而异,见下表:,2)COCOMO模型(constructive cost model)这是由TRW公司开发,Boehm提出的结构化成本估算模型,是一种精确的、易于使用的成本估算方法。基本COCOMO模型估算工作量和进度的公式如下:工 作 量:MM=r(KDSI)c(人月)开发时间:TDKV=a(MM)b(月)DSI:源指令条数,不包括注释,1KDSI=1000DSI MM:开发工作量(以人月计),1MM=19 人日=152 人时=1/12 人年 经验常数 r,c,a,b 取决于项目的总体类型,COCOMO模型中,考虑开发环境,软
19、件开发项目的类型可以分为3种:1)组织型(organic)相对较小、较简单的软件项目。开发人员对开发目标理解比较充分,与软件系统相关的工作经验丰富,对软件的使用环境很熟悉,受硬件的约束较小,程序的规模不是很大(50000行),2)嵌入型(embedded)要求在紧密联系的硬件、软件和操作的限制条件下运行,通常与某种复杂的硬件设备紧密结合在一起。对接口,数据结构,算法的要求高。软件规模任意。如大而复杂的事务处理系统,大型/超大型操作系统,航天用控制系统,大型指挥系统等。,3)半独立型(semidetached)介于上述两种软件之间。规模和复杂度都属于中等或更高。最大可达30万行。,COCOMO模
20、型按其详细程度可以分为三级:1)基本COCOMO模型 是一个静态单变量模型,它用一个以已估算出来的原代码行数(LOC)为自变量的经验函数计算软件开发工作量。,基本COCOMO模型通过统计63个历史项目的历史数据,得到如下计算公式:,2)中级COCOMO模型 在基本COCOMO模型的基础上,再用涉与产品、硬件、人员、项目等方面的影响因素调整工作量的估算。3)详细COCOMO模型 包括中级COCOMO模型的所有特性,但更进一步考虑了软件工程中每一步骤(如分析、设计)的影响。,1)货币的时间价值 假设年利率为i,如果现在存入P元钱,则n年以后可以得到的钱数为:反之,如果n年后能收入F元钱,那么这些钱
21、现在的价值是:,2.6.2 成本/效益分析,例:修改一个已有的库存管理系统,估计需要5000元,系统修改后使用5年,每年可节省2500元。请进行成本/效益分析。,表1:将来的收入折算成现在值,2)投资回收期 第一、第二年回收:4225元 第三年用于回收投资要:(5000-4225)/1779=0.44年 总的投资回收期=2.44年,3)纯收入 9011.94-5000=4011.94(元),4)投资回收率 其中:P是现在的投资额;Fi是第i年年底的效益(i=1,2,3,n);n是系统的使用寿命(一般假设n=5);j是投资回收率。上述修改系统的工程的投资回收率是41%-42%,第2章小结,可行性
22、分析报告 说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由。项目开发计划 为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员、开发的进度、开发经费的预算、所需的硬件与软件资源等。,第3章:需求分析,3.1.1 确定对系统的综合要求 1功能需求 2性能需求 如:相应时间(速度)、主存容量、磁盘容量、安全性、等。,3.1 需求分析的任务,3.可靠性和可用性需求4.出错处理需求 系统发现错误时采取的行动,主要在系统关键部分设置。5.接口需求 用户接口、硬件接口、软件接口、通信接口、等。6.约
23、束 精度、工具和语言、设计约束、硬件约束、标准,等。7.逆向需求 8.将来可能提出的要求,3.1.3 导出系统的逻辑模型 包括完善的数据流图、实体联系图、状态转换图、数据字典、主要的处理算法(IPO图)等。,3.1.2 分析系统的数据要求 通过建立数据模型来分析,如数据字典、层次方框图、Warnier图,并将数据结构规范化。,3.1.4 修正系统开发计划 修订前期制定的开发进度计划、等。,3.2 与用户沟通获取需求的方法,3.2.1 访谈,正式访谈:系统分析员提出事先准备好的问题。非正式访谈:提出一些用户可以自由回答的开放性问题,鼓励被访者说出自己的想法。需要访问大量人员时,利用调查表访问较佳
24、。,3.2.2 面向数据流自顶向下求精,借助数据流图、数据字典、IPO图等,细化、完善详细的数据流图,等到各处理环节对应的功能。,例:,分析销售趋势,统计功能,3.2.3 简易的应用规格说明技术,面向团队的需求收集法:(用户与开发者配合)1)初步访谈;2)开发者和用户分别写出“产品需求”;3)开会讨论,各自展示需求列表;4)得出一致意见,为需求列表制定小型规格说明;5)根据会议成果,起草完整的软件需求规格说明。,3.2.4 快速建立软件原型,快速建立能演示目标系统主要功能的程序。(1)第四代技术(2)可重用的软件构件(3)形式化规格说明和原型环境,3.3 分析建模与规格说明,3.3.1 分析建
25、模 为了开发复杂的系统,应从不同角度(模型)抽象出目标系统的特性(数据模型、功能模型、行为模型)。1)实体联系图:建立数据模型,描述数据对象与数据对象之间的关系;2)数据流图:建立功能模型的基础;3)状态转换图:描绘系统的状态和状态间转换的方式。,3.3.2 软件需求规格说明,3.4 实体联系图,数据对象可以是外部实体、事物、行为、事件、角色、单位、地点、结构等。,3.4.1 数据对象,3.4.2 属性 属性定义了数据对象的性质。,属性,3.4.3 联系(1)一对一联系(1:1)(2)一对多联系(1:N)(3)多对多联系(M:N)在ER图中,用菱形框表示联系。,联系,例子:,通常用范式定义消除
26、数据冗余的程度。1)第一范式 2)第二范式 3)第三范式,3.5 数据规范化,3.6 状态转换图,3.6.1 状态 状态是任何可以被观察到的系统行为模式,一个状态代表系统的一种行为模式。3.6.2 事件 事件是某个特定时刻发生的事情,它是引起系统做动作或状态转换的控制信息。,3.6.3 符号,3.6.4 例子,3.7 其他图形工具,层次方框图用树形结构的一系列多层次的矩形框描绘数据的层次结构。,3.7.1 层次方框图,Warnier图也用树形结构描绘信息,但是这种图形工具比层次方框图提供了更丰富的描绘手段。,3.7.2 Warnier图,IPO图是输入/处理/输出图。,3.7.3 IPO图,3
27、.8 验证软件需求,1)一致性2)完整性3)现实性4)有效性,3.8.1 验证软件需求的正确性,1)验证需求的一致性2)验证需求的现实性3)验证需求的完整性和有效性,3.8.2 验证软件需求的方法,用于需求分析的软件应该满足下列要求:1)必须有形式化的语法 2)使用这个软件工具能够导出详细的文档 3)必须提供分析规格说明书的不一致性和冗余性的手段 4)使用这个软件工具后,应该能够改进通信状况,3.8.3 用于需求分析的软件工具,RSL(需求陈述语言):信息集ASSMPASCAL模拟程序 PSL/PSA(问题陈述语言/问题陈述分析程序)系统,第3章小结,软件需求说明书(软件规格说明书)对所开发软
28、件的功能、性能、用户界面与运行环境等作出详细的说明。它是在用户与开发人员双方对软件需求取得共同理解并达成协议的条件下编写的,也是实施开发工作的基础。该说明书应给出数据逻辑和数据采集的各项要求,为生成和维护系统数据文件做好准备。,第4章:形式化说明技术,1.非形式化方法:自然语言描述2.半形式化方法:数据流图或实体联系图3.形式化方法:基于数学技术描述,4.1 概述,4.1.1 非形式化方法的缺点 自然语言书写的系统规格说明书可能存在:1)矛盾;2)二义性;如:“操作员标识由操作员姓名和密码组成,密码由6位数字构成,当操作员登陆系统时它被存储在注册文件中。”3)含糊性;4)不完整性;5)抽象层次
29、混乱。,4.1.2 形式化方法的优点(1)数学是理想的建模工具,适合于表示系统状态和描述系统需求;(2)用数学表达的需求可在不同开发阶段平滑过渡。,4.1.3 应用形式化方法的准则(1)选择合适的形式化方法;(2)需要形式化,但不能过渡形式化,不能放弃传统的需求表达方法;(3)应该有形式化方法的专家提供指导。,4.2 有穷状态机法(FSM),4.2.1 概念,锁的三个位置:1、2、3;转盘可向左(L)或右(R);锁密码:1L、3R、2L,一个有穷状态机包括5部分:1)状态集J:保险箱锁定,A,B,保险箱解锁,报警 2)输入集K:1L,1R,2L,2R,3L,3R 3)转换函数T,如表4.1 4
30、)初始状态S:保险箱锁定 5)终态集F:保险箱解锁,报警 更形式化的术语:一个有穷状态机可表示一个为5元组(J,K,T,S,F),状态转换形式:当前状态【菜单】事件【所选择的项】下个状态加入谓词集P,把系统扩展成一个6元组后:当前状态【菜单】事件【所选择的项】谓词下个状态,计算机系统中每个菜单驱动的用户界面都是一个有穷状态机的实现。,定义状态:(1)M(d,e,f):电梯e正沿d方向移动,即将到达第f层楼。(2)S(d,e,f):电梯e停在f层楼,将朝d方向移动(未关门)。(3)W(e,f):电梯e在f层等待(已关门)。(4)DC(e,f):电梯e在楼层f关上门。(5)ST(e,f):电梯e靠
31、近f层时触发传感器,电梯控制器决定在当前楼层是否停下。(6)RL:电梯按钮或楼层按钮被按下进入打开状态,4.2.2 例子:电梯的状态转换,电梯状态转换规则:S(U,e,f)+DC(e,f)=M(U,e,f+1);S(D,e,f)+DC(e,f)=M(D,e,f-1);S(N,e,f)+DC(e,f)=W(e,f),4.2.3 评价 有穷状态机描述规格说明:当前状态事件谓词=下个状态 易于书写、验证、转变成设计或程序代码。,有穷状态机方法比数据流图技术更精确,一样易于理解。但不能处理定时需求。,4.3 Petri网,4.3.1 概念,Petri网包含4种元素:1)一组位置P,上例 PP1,P2,
32、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),权标向量(1,2,0,1),权标向量(2,1,0,0),权标向量(2,0,2,0),更形式化地:标记 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 楼层向上按钮;FBfd 第
33、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 设计原理,如果一个大型程序仅由一个模块组成,很难被人
34、理解。设函数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 模块化,5.2.2 抽象,5.2.3 逐步求精,模块的独立性很重要,因为:1)有效的模块化的软件比较容易开发出来;2)独立的模块比较容易测试和维护。,5.2.4 信息隐蔽和局部化,5.2.5 模块独立,一、耦合,耦合:指软件结构内不同模块彼此之间相互依赖(连接)的紧密程度。,模块独立程度可以由两个定性
35、标准度量:耦合与内聚。,模块的偶合分四类:1)数据耦合 两个模块之间只是通过参数交换信息,而且交换的信息仅仅是数据。数据耦合是最低程度的耦合。,2)控制耦合 两个模块之间所交换的信息包含控制信息。控制耦合是中等程度的耦合。,图中模块A的内部处理程序判断是执行C还是执行D,要取决于模块B传来的信息状态(Status)。,3)公用耦合 两个或多个模块通过一个公共区相互作用时的耦合。公共区可以是:全程数据区、共享通信区、内存公共覆盖区、任何介质上的文件、物理设备等。软件结构中存在大量的公用耦合时会给诊断错误带来困难。,图中存在公用耦合,假设模块A、C、E都存取全程数据区(如公用一个磁盘文件)中的一个
36、数据项。如果A模块读取该项数据,然后调用C模块对该项重新计算,并进行数据更新。,如果此时C模块错误地更新了该项数据,在往下的处理中模块E读该数据项时出现错误。表面上看,问题由模块E产生,实际上由模块C引起。,4)内容耦合 一个模块与另一个模块的内容直接发生联系。内容耦合对维护会带来严重的困难。,程序中如果一个模块直接把程序转移到另一个模块中,或一个模块使用另一个模块内部的数据,都会产生内容耦合。内容耦合是最高程度的耦合,应该避免采用。,软件设计应追求尽可能松散耦合,避免强耦合,这样模块间的联系就越小,模块的独立性就越强,对模块的测试、维护就越容易。因此建议:尽量使用数据耦合,少用控制耦合,限制
37、公用耦合,完全不用内容偶合。,二、内聚,内聚:一个模块内部各个元素彼此结合的紧密程度。它是衡量一个模块内部组成部分间整体统一性的度量。常见的内聚有七类。,1)功能内聚(Functional Cohesion)如果一个模块内所有处理元素完成一个,而且仅完成一个功能,则称为功能内聚。功能内聚是最高程度的内聚。但在软件结构中,并不是每个模块都能设计成一个功能内聚模块。,2)顺序内聚(Sequential Cohesion)如果一个模块内处理元素和同一个功能密切相关,而且这些处理元素必须顺序执行,则称为顺序内聚。,如图,一个求一元二次方程根的模块由三个处理元素组成,该模块中存在顺序内聚。通常,顺序内聚
38、中一个处理元素的输出是另一个处理元素的输入。,3)通信内聚(Communicational Cohesion)如果一个模块中所有处理元素都使用同一个输入数据和(或)产生同一个输出数据,称为通信内聚。,如图,模块A的处理单元将根据同一个数据文件FILE的数据产生不同的表格,因此它存在通信内聚。通信内聚有时也称为数据内聚。,4)过程内聚(Procedural Cohesion)如果一个模块内的处理元素是相关的,而且必须以特定的次序执行,称为过程内聚。过程内聚与顺序内聚的区别是:顺序内聚中是数据流从一个处理单元流到另一个处理单元,而过程内聚是控制流从一个动作流向另一个动作。,5)时间内聚(Tempo
39、ral Cohesion)如果一个模块包含的任务必须在同一段时间内执行,称为时间内聚。也称为瞬时内聚。,例如,完成各种初始化工作的模块,或者处理故障的模块都存在时间内聚。如图,在“紧急故障处理模块”中,“关闭文件”、“报警”、“保留现场”等任务都必须无中断地同时处理。,6)逻辑内聚(Logical Cohesion)如果模块完成的任务在逻辑上属于相同或相似的一类,称为逻辑内聚。,如图,A、B、C模块合并成ABC模块之后,ABC模块就是逻辑内聚模块。,对逻辑内聚模块的调用,常常需要有一个功能开关,由上层调用模块向它发出一个控制信号,在多个关联性功能中选择执行某一个功能。这种内聚较差,增加了模块之
40、间的联系,不易修改。,7)偶然内聚(Coincidental Cohesion)如果一个模块由完成若干毫无关系的功能处理元素偶然组合在一起的,就叫偶然内聚。,偶然内聚是最差的一种内聚。常犯这种错误的一种情况是:有时在写完程序后,发现一组语句在多处出现,于是为了节省空间而将这些语句作为一个模块设计,就出现偶然内聚。,如图,模块A、B、C出现公共代码段W,于是将W独立成一个模块,而W中这些语句并没有任何联系。如果在测试中发现模块A不需要做“X=Y+Z”,而应该做“X=Y*Z”,此时对W的维护就很困难了。,软件设计中应该:力求做到高内聚,尽量少用中内聚,不用低内聚。,5.3 启发式规则,1.改进软件
41、结构提高模块独立性2.模块规模应该适中,3.深度、宽度、扇出和扇入都应适当 深度:软件结构中控制的层数;宽度:软件结构内同一个层次上的模块总数的最大值;扇出:一个模块直接控制(调用)其它模块的数目;扇入:一个模块被其它模块调用的数目。,对扇出、扇入过大的改进:,4.模块的作用域应该在控制域之内,作用域:受该模块内一个判定影响的所有模块的集合。控制域:模块本身以与所有从属于它的模块的集合。,如:QUAD-ROOT(TBL,X)求一元二次方程的根的模块,其中TBL,X都为数组,分别代表方程的系数和方程的根。应该使接口更简单,如:QUAD-ROOT(A,B,C,ROOT1,ROOT2)A、B、C是方
42、程的系数,ROOT1,ROOT2是方程的根。,5.力争降低模块接口的复杂度,6.设计单入口、单出口的模块,7.模块功能应该可以预测,5.4 图形工具5.4.1 层次图和HIPO图,HIPO图是:“层次图输入/处理/输出图”,5.4.2 结构图,5.5 面向数据流的设计方法,面向数据流设计(Data Flow-Oriented Design,DFOD)是与数据流分析(DFA)对应的结构化软件设计技术。面向数据流的设计将得到以数据流图为基础的软件模块结构图。,数据流可以分为两种类型:1)变换型数据流 2)事务型数据流,5.5.1 变换流与事务流,一、变换流 具有较明确的输入、变换(或称主加工)和输
43、出界面的数据流图称为变换型数据流图。如图所示,该变换中心可以理解为数据的加工和处理程序。,事务型数据流图中存在一个事务中心(也就是数据处理、加工中心),它将输入分离成若干个发散的数据流,形成许多活动路径,并根据输入值选择其中一条路径。,二、事务流,通常,一个实际系统的数据流图是变换型和事务型两种类型的混合体。如图所示,中间的子块属事务型数据流,如果把中间子块视为一个处理整体的话,整个程序属变换型程序。,面向数据流设计软件结构的基本步骤有七步:1)复审并精化数据流图;2)确定数据处理流图的类型;3)确定变换中心或事务中心;,5.5.2 面向数据流设计的步骤,4)将数据流图映射成软件模块结构图,设
44、计出该数据流图对应的第一层模块结构;5)基于数据流图逐步分解,设计下层模块;6)运用模块设计和优化准则优化软件结构;7)描述模块的接口。,变换设计就是从变换型数据流图映射出软件模块结构的过程,也称以变换为中心的设计。,5.5.3 变换设计,变换设计的基本方法有两步:1)分解第一层模块结构 就是把整个变换分解成输入控制模块Ci、输出控制模块Co和变换中心控制模块Ct,由主控模块控制。,2)分别设计输入、输出和处理的下层模块结构 方法是:从变换中心边界向两侧移动,分别把输入通路和输出通路的每个处理映射成输入控制模块Ci和输出控制模块Co的下属模块。变换中心的下层模块,是把每个处理映射成变换中心控制
45、模块Ct的一个直接下属模块。,事务设计就是从事务型数据流图映射出软件模块结构的过程,也称为以事务为中心的设计。,5.5.4 事务设计,事务设计的基本方法有两步:1)建立主控模块、接收输入类型分析模块和事务调度模块;,2)分别设计输入类型分析模块和调度模块的下层模块结构。方法是:将输出的每条通路作为调度模块的一个判断分支,而输入类型分析模块的下层模块与变换设计类似。,第5章小结,概要设计说明书 该说明书是概要实际阶段的工作成果,它应说明功能分配、模块划分、程序的总体结构、输入输出以与接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。,第6章:详细设计,目标:确定如何具体实现所
46、要求的系统。不是具体编写程序,而是设计程序的“蓝图”。详细设计的结果决定最终程序代码的质量。,E.W.Dijkstra 最早提出结构程序设计:程序质量与程序中包含的Goto语句的数量成反比(1965)。1966,Bohm,Jacopini,证明了只用“顺序”、“选择”、“循环”控制结构就能实现任何单入口单出口程序。,6.1 结构程序设计,理论上,最基本的控制结构只有两种:顺序、循环结构(选择结构可由其两者构造)。学界认识到,不是简单去掉Goto语句的问题,而是要创立一种新的程序设计方法。结构化程序设计(IBM率先成功运用)。,结构程序设计:一种设计程序的技术,它采用自顶向下逐步求精的设计方法和
47、单入口单出口的控制结构。,使用结构程序设计技术的好处:1)提高软件开发工程的成功率和生产率;2)系统有清晰的层次结构,容易阅读理解;3)单入口单出口的控制结构,容易诊断纠正;4)模块化可以使得软件可以重用;5)程序逻辑结构清晰,有利于程序正确性证明。,经典的结构程序设计:只允许使用顺序、IF_THEN_ELSE选择和DO_WHILE循环;,扩展的结构程序设计:除了三种基本控制结构,还使用DO_CASE和DO_UNTIL循环;,修正的结构程序设计:除了三种基本控制结构和两种扩充结构,还使用BREAK等结构。,流程图通常由三种结点组成:1)函数结点 如果一个结点有一个入口线和一个出口线,则称为函数
48、结点。,由于函数结点一般对应于赋值语句,所以 F 也表示了这一个结点对应的函数关系。,6.1.1 结构化程序6.1.1.1 控制结构,2)谓词结点 如果一个结点有一个入口线和两个出口线,而且它不改变程序的数据项的值,则称为谓词结点。,P是一个谓词,根据P的逻辑值(T或F),结点有不同的出口。,3)汇点 如果一个结点有两个或多个入口线和一个出口线,而且它不执行任何运算,则称为汇点。,1)顺序结构:相当于“A、B”,2.三种基本控制结构,2)选择结构 相当于“If exp then A else B endif”,3)循环结构:相当于“While exp do A”,1)多分支结构 相当于“Cas
49、e I of I=1:C1;I=2:C2;I=3:C3;I=n:Cn”,3.扩充两种控制结构,2)UNTIL循环结构 相当于“Repeat A Until exp”,6.1.1.2 正规程序 定义1:一个流程图程序如果满足下面两个条件,称为正规程序:1)具有一个入口线和一个出口线;2)对每一个结点,都有一条从入口线到出口线的通路通过该结点。,由于正规程序有一个入口线和一个出口线,因而一个正规程序总可以抽象为一个函数结点。,定义2:如果一个正规程序的某个部分仍然是正规程序,那么称它为该正规程序的正规子程序。,先给出一个概念:封闭结构定义3:流程图中,两个结点之间所有没有重复结点的通路组成的结构称
50、为封闭结构。,6.1.1.3 基本程序,如图:封闭结构为 a-b1-b2-b3;c1-c2;d1-d2-d3;e-f,1)不包括多于一个结点的正规子程序,即它是一种不可再分解的正规程序;(程序自身不可视为正规子程序)2)如果存在封闭结构,封闭结构都是正规程序。,6.1.1.3 基本程序,定义4:一个正规程序,如果满足以下两个条件,则称之为基本程序:,基本程序形式有多种,前面提到的三种基本控制结构(顺序结构、选择结构、循环结构)和两个扩充控制结构(多分支结构、UNTIL循环结构)都是基本程序。,定义5:用以构造程序的基本程序的集合称为基集合。如:顺序,if-then-else,while do