资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,软件工程,(Software Engineering),第,1,章:软件工程学概述,1.1 软件危机,60年代中期以前:通用硬件相当普遍,软件却是为某个具体的应用而编写的。,60,年代中到,70,年代中:软件作坊。,软件危机,:计算机软件的开发和维护过程中所遇到的一系列严重问题。(正常、不正常运行软件都具有这种问题),1.1.1 软件危机的介绍,1,)对软件开发成本和进度的估计常常很不准确;,2,)用户对完成的软件系统不满意的现象经常发生;,3,)软件产品的质量往往靠不住;,软件危机的典型表现:,4,)软件常常是不可维护的;,5,)软件通常没有适当的文档资料;,6,)软件成本在计算机系统总成本中所占的比例逐年上升;,7,)软件开发生产率提高的速度跟不上计算机应用的发展趋势。,1.1.2,产生软件危机的原因,1)软件本身特点造成;,2)软件开发与维护的方法不正确。,主要表现:,(,a,)忽视软件需求分析;,(,b,)认为软件开发就是写程序并使之运行;,(,c,)轻视软件维护;,在软件开发的不同阶段进行修改需要付出的代价很不相同:,高,中,低,早期,中期,后期,软件开发时期,代价,引入同一修改的代价随时间变化的趋势,1,)推广使用在实践中总结出来的开发软件的成功技术和方法,并研究探索更有效的技术和方法;,2,)开发和使用更好的软件工具;,3,)良好的组织管理措施。,1.1.3 解决软件危机的途径,为了解决软件危机产生的问题,软件工程与方法学逐渐形成,然后出现了两个相互相承又各有侧重的学科:,1,),软件工程学,:主要应用工程的方法和技术研究软件开发与维护的方法、工具和管理的一门交叉学科。,2,),程序设计方法学,:主要应用数学的方法研究程序的性质以及程序设计的理论和方法的学科。,1.2,软件工程,1.2.1,软件工程的介绍,1968,年,NATO,会议:软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。,1993,年,IEEE,:软件工程是(,1,)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程;(,2,)研究(,1,)中提到的途径。,1.,软件工程关注于大型程序的构造;,2.,软件工程的中心课题是控制复杂性;,3.,软件经常变化;,4.,开发软件的效率非常重要;,5.,和谐地合作是软件开发的关键;,6.,软件必须有效地支持它的用户;,7.,在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品。,软件工程的本质特性:,1.2.2,软件工程的基本原理,1.,用分阶段的生命周期计划严格管理;,2,.,坚持进行阶段评审;,3,.,实行严格的产品控制;,4,.,采用现代程序设计技术;,5,.,结果能清楚地审查;,6,.,开发小组的人员应该少而精;,7,.,承认不断改进软件工程实践的必要性。,1.2.3,软件工程方法学,通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(,Methodology,),也称为范型(,Paradigm,)。,软件工程方法学的,3,要素:方法、工具和过程,1.,传统方法学,也称为生命周期方法学或结构化范型。,结构化方法(,Structure Method,),有:,1)结构化设计方法(,SD,);,2,),结构化分析方法(,SA,);,3)结构化分析与设计技术(,SADT,),4),JACKSON,方法,5),WARNIER,方法,2.,面向对象方法学,把数据和对数据的操作紧密结合起来的方法,模拟人类认识世界解决问题的方法和过程。,面向对象的方法,=对象(属性与服务的封装),+分类,+继承,+通过消息的通讯,1)适用于实时事物处理系统的有限状态机方法(,FSM,);,2,),适用于并发软件系统的,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.,总体设计(概要设计);,5.,详细设计;,6.,编码与单元测试;,7.,综合测试;,8.,维护。,软件生命周期各个阶段:,1.,4,软件过程,软件过程,:为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。,软件过程(,ISO9000,),:,使用资源将输入转化为输出的活动所构成的系统。,输入:如软件需求,输出:如软件产品,1.4.1,瀑布模型,1.,阶段间具有顺序性和依赖性,2.,推迟实现的观点,3.,质量保证的观点,优点,:采用规范的方法;严格规定每个阶段提交的文档;要求每个阶段交出的产品必须经过验证。,1.4.2,快速原型模型,优点,:不带反馈环,基本上是线性顺序进行。,1.4.3,增量模型,优点,:能较短时间内提交可完成部分工作的产品;可以使用户有充裕的时间学习和适应新产品。,一种风险更大的增量模型:,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,)响应变化胜过遵循计划。,2.,极限编程,敏捷过程中最著名的一种,指把好的开发实践运用到极致,多应用于软件需求模糊的场合。,1.4.8,微软过程,1.,微软过程准则,2.,微软软件生命周期,(,1,)规划阶段,(,2,)设计阶段,(,3,)开发阶段,(,4,)稳定阶段,(,5,)发布阶段,3.,微软过程模型,问题定义就是要确定为用户建立什么样的软件系统,软件叫什么样的名称等等。“问题”是指软件最基本的问题,如:,软件的总体目标什么?,有什么用途?,为那些用户设计?,1.5,问题定义阶段,问题定义报告的内容包括:,1,),软件项目标题;,2,),软件目标;,3,),软件用户对象;,4,),软件规模。,问题定义是软件生命周期中时间最短的阶段,一般都比较简单,因此在实际开发中它是最容易被忽视的一个阶段。,这一阶段工作主要由系统分析员来完成,系统分析员要尽可能从较高的角度概括软件所要做的工作,而不用写明问题的实现细节。,第,2,章:可行性研究,可行性研究就是要回答“所定义的问题有可行的解决办法吗?”。,可行性研究的目的是:用最小的代价在尽可能短的时间内确定问题是否有解,以及是否值得去解。,2.1 可行性研究的任务,可行性研究所需的时间取决于工程的规模,所需要的成本要占工程总成本的,5%10%,。,可行性研究的内容:,1,),技术可行性,技术可行性要分析各种技术因素,例如:,使用现有的技术能否实现这个系统?,是否有胜任开发该项目的熟练技术人员?,能否按期得到开发该项目所需的软件、硬件资源?,2,),经济可行性,对经济合理性进行评价,所要考虑的问题是:,这个系统的经济效益能否超过它的开发成本?,这就需要对项目进行价格,/,利益分析,即“投入,/,产出”分析。,由于利益分析取决于软件系统的特点,因此在软件开发之前,很难对新系统产生的效益作出精确的定量描述,所以往往采用一些估算方法。,3,),操作可行性,操作可行性评价系统运行后会引起的各方面变化,如:对组织机构管理模式、用户工作环境等产生的影响。,4,),社会可行性,社会可行性主要讨论法律方面和使用方面的可行性。,例如,被开发软件的权利归属问题、软件所使用的技术是否会造成侵权等问题。,2.2,可行性研究的步骤,1)复查系统规模和目标;,2)研究目前正在使用的系统;,3)导出新系统的高层逻辑模型(数据流图、数据字典);,4,),重新定义问题;,5,)导出和评价供选择的解法(物理解决方案);,6,)推荐行动方案;,7,)草拟开发计划;,8,)书写文档提交审查。,2.2,可行性研究的步骤,2.3,系统流程图(描绘物理系统的工具),2.3.1,符号,符号,名称,说明,处理,如:程序,处理机,人工加工,输入/输出,连接,换页连接,数据流,表示输入或输出,同一页上图的连接,不同页上图的连接,指明数据流动方向,图2.1 基本符号,符号,名称,说明,穿孔卡片,文档,磁带,联机存储,磁盘,磁鼓,显示,人工输入,人工操作,辅助操作,通信链路,穿孔卡片输入/输出,或穿孔卡片文件,打印输出,或打印终端输入数据,磁带输入/输出,或表示磁带文件,任何种类磁盘存储,如磁盘、磁鼓等,磁盘输入/输出,或磁盘上文件、数据库,磁鼓输入/输出,或磁鼓上文件、数据库,显示器部件,人工输入数据,如填写表格,人工完成的处理,使用辅助设备进行的脱机操作,通过远程通信线路传送数据,图2.2 系统符号,2.3.2,例子,事务,库存清单程序,报告生成程序,定货信息,定货报告,库存清单主文件,图2.3 库存清单系统的系统流程图,2.4,数据流图(描绘数据在系统中流动的逻辑过程),2.4.1,符号,或,或,或,数据源点或终点,变换数据的处理,数据存储,数据流,图2.4 基本符号的含义,T,A,B,C,*,T,A,B,C,*,附加符号,T,A,B,C,+,T,A,B,C,+,注意:,“处理”可表示:单个程序、一系列程序、程序的一个模块、人工处理过程等等;,“数据存储”可表示:一个文件、文件的一部分、数据库记录等等;,数据流图忽略出错处理、打开文件、关闭文件。,2.4.2,绘制数据流图的,例子,事务,库存清单程序,报告生成程序,定货信息,定货报告,库存清单主文件,图2.3 库存清单系统的系统流程图,2.4.2,绘制数据流图的,例子,仓库,管理员,采购员,定货系统,事务,定货报表,图2.5 定货系统的基本系统模型,2.4.2 绘制数据流图的例子,库存清单,仓库,管理员,采购员,事务,定货报表,图2.6 定货系统的功能级数据流图,处理事务,1,产生报表,2,D1,库存清单,D2,定货信息,定货信息,定货信息,组成该例子的数据流图的元素,源点,/,终点,处理,采购员,仓库管理员,产生报表,处理事务,数据流,数据存储,订货报表,零件编号,零件名称,订货数量,目前价格,主要供应商,次要供应商,事务,零件编号,事务类型,数量,订货信息,(见订货报表),库存清单,零件编号,库存量,库存量临界值,上述数据流图所描述的功能够详细了吗?,2.4.2 绘制数据流图的例子,仓库,管理员,采购员,事务,定货报表,图2.7 定货系统进一步分解后的数据流图,更新库存清单,1.2,产生报表,2,D1,库存清单,D2,定货信息,接收事务,1.1,处理定货,1.3,库存清单,定货信息,定货信息,1),为数据流(或数据存储)命名,A,名字应该代表整个数据流(或数据存储)的内容;,B,不要使用空洞的、缺乏具体含义的名字(如“数据”、“输入”);,2.4.3 命名,C,如果为某个数据流(或数据存储)起名字时遇到困难,则很可能是因为对数据流图的分解不恰当造成的,应该试试重新分解数据流图;,2),为处理命名,A,通常先为数据流命名,然后再为与之相关联的处理命名;,B,名字应该反映整个处理的功能;,C,应该尽量避免空洞笼统的动词做名字,如“处理”、“加工”;,D,通常用一个动词命名,如果必须用两个动词才能描述整个处理的功能,则可能要把这个处理分解成两个处理更恰当;,E,如果在为某个处理命名时遇到困难,则很可能是发现了分解不当的情况,应考虑重新分解。,通常,为“数据源点,/,终点”命名时,采用它们在问题域中习惯使用的名字(如“仓库管理员”、“采购员”)。,1,)利用它作为交流信息的工具;,2,)作为软件分析和设计的工具。,2.4.4,数据流图的用途,2.4.4 数据流图的用途,仓库,管理员,采购员,事务,定货报表,图2.,8,这种自动化边界建议以联机方式更新库存清单,更新库存清单,1.2,产生报表,2,D1,库存清单,D2,定货信息,接收事务,1.1,处理定货,1.3,库存清单,定货信息,定货信息,图,2.8,对应的物理实现硬件方案,2.4.4,数据流图的用途,仓库,管理员,采购员,事务,定货报表,图2.,9,这种自动化边界暗示以批量方式更新库存清单,更新库存清单,1.2,产生报表,2,D1,库存清单,D2,定货信息,接收事务,1.1,处理定货,1.3,库存清单,定货信息,定货信息,D3,事务,图,2.9,对应的物理实现硬件方案,数据字典,:对数据流图中包含的所有元素的定义的集合;,可行性研究阶段,数据流图与数据字典共同构成系统的,逻辑模型,。,2.5,数据字典,2.5.1,数据字典的内容,数据字典应该对下列元素进行定义:,1,)数据流;,2,)数据元素(数据流分量);,3,)数据存储;,4,)处理。,1),数据元素,字典,定义,其定义的基本内容有:,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,峰值。,数据流字典,定义实例:,数据流编号,:,DF001,数据流名称,:订票单,简述,:订票时填写的订票单,数据流来源,:外部实体“乘客”,数据流去处,:处理逻辑“预订机票”,数据流组成,:订单编号,日期,乘客号,航班号,状态,订单失效日期,流通量,:每天300份,高峰值流通量,:每天早上9:00,约160份,图2.11 数据流字典定义,3),数据存储,字典定义,其定义的基本内容有:,A,数据存储编号及名称;,B,数据存储的组成;,C,其它要求。,4),数据处理,字典定义,其定义的基本内容有:,A,数据处理编号及名称;,B,简单描述;,C,输入/输出;,D,功能描述;,E,有关数据存储。,数据处理,字典定义实例:,数据处理编号,:,DP001,数据处理名称,:编辑订票,简述,:接收从终端录入的订票单,检验是否正确,输入,:乘客订单,来源:外部实体“乘客”,输出,:1.合格订单,去处:处理逻辑“确定订票”,2.不及格订单,去处:外部实体“乘客”,功能描述:,(略),图2.12 数据处理字典定义,5,)组成数据项的表示方法,=,表示“等价于”或“定义为”,+,表示“与”,与,|,表示“或”,表示重复,(),表示可选项,通讯录,=,通讯地址,通讯地址,=,姓名,+,邮编,+,省,|,直辖市,|,自治区,+,市,|,县,+,街道,+,门牌号,+,(电话),1.,作为分析阶段的重要工具;,2.,数据元素的控制信息非常有用;,3.,有助于开发数据库。,2.5.3 数据字典的用途,实现数据字典:,1)程序处理;,2)卡片式人工书写;,2.5.4 数据字典的实现,2.6,成本,/,效益分析,1,),代码行技术,软件成本,=,每行代码的平均成本,估计的源代码总行数,2.6.1 成本估计,2),任务分解技术,软件开发项目分解为若干个相对独立的任务,分别估计每个单独任务的成本:,单独任务成本,=任务所需人力估计值每人每月平均工资;,软件开发项目总成本估计,=各个单独任务成本估计值之和。,常用的办法是按开发阶段划分任务,典型环境下各个开发阶段需要使用的人力百分比大致如下:,任务,人力(),可行性研究,需求分析,设计,编码与单元测试,综合测试,总计,5,10,25,20,40,100,3,),自动估计成本技术,采用自动估计成本的软件工具估计。,1,),Putnam,模型,1978,年,Putnam,提出的,一种动态多变量模型:,软件开发成本估算的经验模型:,Ck,为技术状态常数,它反映“妨碍开发进展的限制”,取值因开发环境而异,见下表:,Ck,的典型值,开发环境,开发环境举例,2000,差,没有系统的开发方法,缺乏文档和复审,8000,好,有合适的系统的开发方法,有充分的文档和复审,11000,优,有自动的开发工具和技术,2,),COCOMO,模型,(,constructive cost model),这是由,TRW,公司开发,,Boehm,提出的结构化成本估算模型,是一种精确的、易于使用的成本估算方法。,基本,COCOMO,模型估算工作量和进度的公式如下:,工 作 量:,MM=r,(KDSI),c,(,人月),开发时间:,TDKV=a,(MM),b,(,月),DSI,:,源指令条数,不包括注释,1,KDSI=1000DSI,MM,:,开发工作量(以人月计),1,MM=19,人日=152 人时=1/12 人年,经验常数,r,c,a,b,取决于项目的总体类型,COCOMO,模型中,考虑开发环境,软件开发项目的类型可以分为3种:,1),组织型,(,organic),相对较小、较简单的软件项目。开发人员对开发目标理解比较充分,与软件系统相关的工作经验丰富,对软件的使用环境很熟悉,受硬件的约束较小,程序的规模不是很大(下个状态,加入谓词集,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,靠近,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,,,上例,P,P1,P2,P3,P4,2,),一组转换,T,,,上例,T,t1,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,:,P,0,1,2,Petri,网成为一个5元组,(,P,,,T,,,I,,,O,,,M,),对,Petri,网的一个重要扩充是加入禁止线:,4.3.2,例子,1.,电梯按钮,EB,f,电梯中楼层,f,的按钮;,F,g,楼层,g,;,F,f,楼层,f,。,2.楼层按钮,FB,f,u,第,f,楼层向上按钮;,FB,f,d,第,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,设计原理,如果一个大型程序仅由一个模块组成,很难被人理解。,设函数,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 信息隐蔽和局部化,5.2.,5,模块独立,一、耦合,耦合,:指软件结构内不同模块彼此之间相互依赖(连接)的紧密程度。,模块独立程度可以由两个定性标准度量:,耦合,与,内聚,。,模块的偶合分四类:,1),数据耦合,两个模块之间只是通过参数交换信息,而且交换的信息仅仅是数据。,数据耦合是最低程度的耦合。,A,B,数据,(1)数据耦合,2,),控制耦合,两个模块之间所交换的信息包含控制信息。,控制耦合是中等程度的耦合。,图中模块,A,的内部处理程序判断是执行,C,还是执行,D,,,要取决于模块,B,传来的信息状态(,Status,)。,B,A,C,D,(2)控制耦合,a,status,3,),公用耦合,两个或多个模块通过一个公共区相互作用时的耦合。,公共区可以是:全程数据区、共享通信区、内存公共覆盖区、任何介质上的文件、物理设备等。,软件结构中存在大量的公用耦合时会给诊断错误带来困难。,图中存在公用耦合,假设模块,A,、,C,、,E,都存取全程数据区(如公用一个磁盘文件)中的一个数据项。,如果,A,模块读取该项数据,然后调用,C,模块对该项重新计算,并进行数据更新。,A,B,C,D,E,全程数据区,(3)公用耦合,如果此时,C,模块错误地更新了该项数据,在往下的处理中模块,E,读该数据项时出现错误。,表面上看,问题由模块,E,产生,实际上由模块,C,引起。,A,B,C,D,E,全程数据区,(3)公用耦合,4,),内容耦合,一个模块与另一个模块的内容直接发生联系。,内容耦合对维护会带来严重的困难。,模块,A,LAB,:,MOVE 1,模块,B,GOTO LAB,内容耦合,(4)内容耦合,程序中如果一个模块直接把程序转移到另一个模块中,或一个模块使用另一个模块内部的数据,都会产生内容耦合。内容耦合是最高程度的耦合,应该避免采用。,软件设计应追求尽可能松散耦合,避免强耦合,这样模块间的联系就越小,模块的独立性就越强,对模块的测试、维护就越容易。,因此建议:,尽量使用数据耦合,少用控制耦合,限制公用耦合,完全不用内容偶合,。,二、内聚,内聚,:一个模块内部各个元素彼此结合的紧密程度。,它是衡量一个模块内部组成部分间整体统一性的度量。,常见的内聚有七类。,1,),功能内聚,(,Functional Cohesion,),如果一个模块内所有处理元素完成一个,而且仅完成一个功能,则称为功能内聚。,功能内聚是最高程度的内聚。但在软件结构中,并不是每个模块都能设计成一个功能内聚模块。,2),顺序内聚,(,Sequential Cohesion,),如果一个模块内处理元素和同一个功能密切相关,而且这些处理元素必须顺序执行,则称为顺序内聚。,如图,一个求一元二次方程根的模块由三个处理元素组成,该模块中存在顺序内聚。,通常,顺序内聚中一个处理元素的输出是另一个处理元素的输入。,求一元二次方程根模块,1输入方程系数,2求解,3打印方程的解,顺序内聚示例,3),通信内聚,(,Communicational Cohesion,),如果一个模块中所有处理元素都使用同一个输入数据和(或)产生同一个输出数据,称为通信内聚。,如图,模块,A,的处理单元将根据同一个数据文件,FILE,的数据产生不同的表格,因此它存在通信内聚。,通信内聚有时也称为数据内聚。,A,从文件,FILE,中读出数据,1.由数据产生报表,A,2.由数据产生报表,B,通信内聚示例,4),过程内聚,(,Procedural Cohesion,),如果一个模块内的处理元素是相关的,而且必须以特定的次序执行,称为过程内聚。,过程内聚与顺序内聚的区别是:,顺序内聚中是数据流从一个处理单元流到另一个处理单元,而过程内聚是控制流从一个动作流向另一个动作。,5),时间内聚,(,Temporal Cohesion,),如果一个模块包含的任务必须在同一段时间内执行,称为时间内聚。也称为瞬时内聚。,例如,完成各种初始化工作的模块,或者处理故障的模块都存在时间内聚。,如图,在,“,紧急故障处理模块,”,中,,“,关闭文件,”,、,“,报警,”,、,“,保留现场,”,等任务都必须无中断地同时处理。,紧急故障处理模块,1关闭文件,2报警,3保留现场,时间内聚示例,6),逻辑内聚,(,Logical Cohesion,),如果模块完成的任务在逻辑上属于相同或相似的一类,称为逻辑内聚。,如图,,A,、,B,、,C,模块合并成,ABC,模块之后,,ABC,模块就是逻辑内聚模块。,X,Y,Z,A,B,C,X,Y,Z,ABC,合并,逻辑内聚示例,对逻辑内聚模块的调用,常常需要有一个功能开关,由上层调用模块向它发出一个控制信号,在多个关联性功能中选择执行某一个功能。,这种内聚较差,增加了模块之间的联系,不易修改。,7),偶然内聚,(,Coincidental Cohesion,),如果一个模块由完成若干毫无关系的功能处理元素偶然组合在一起的,就叫偶然内聚。,偶然内聚是最差的一种内聚。,常犯这种错误的一种情况是:有时在写完程序后,发现一组语句在多处出现,于是为了节省空间而将这些语句作为一个模块设计,就出现偶然内聚。,如图,模块,A,、,B,、,C,出现公共代码段,W,,,于是将,W,独立成一个模块,而,W,中这些语句并没有任何联系。,如果在测试中发现模块,A,不需要做“,X=Y+Z”,,,而应该做“,X=Y*Z”,,,此时对,W,的维护就很困难了。,A,B,C,W,模块,X=Y+Z,GET CARD,IF I=5 THEN E=0,偶然内聚示例,软件设计中应该:,力求做到高内聚,,,尽量少用中内聚,不用低内聚,。,5.3,启发式规则,1,.,改进软件结构提高模块独立性,2,.,模块规模应该适中,3,.,深度、宽度、扇出和扇入都应适当,深度,:软件结构中控制的层数;,宽度,:软件结构内同一个层次上的模块总数的最大值;,扇出,:一个模块直接控制(调用)其它模块的数目;,扇入,:一个模块被其它模块调用的数目。,正文加工系统,输入,输出,编辑,加标题,存储,检索,编目录,格式化,添加,删除,插入,修改,合并,列表,对扇出、扇入过大的改进:,(,a,),对扇入过大的改进,(,b,),对扇出过大的改进,4,.,模块的作用域应该在控制域之内,M,A,G,B,C,E,D,F,图5.2 模块的作用域和控制域,作用域:受该模块内一个判定影响的所有模块的集合。,控制域:模块本身以及所有从属于它的模块的集合。,如:,QUAD-ROOT,(,TBL,X,),求一元二次方程的根的模块,其中,TBL,,,X,都为数组,分别代表方程的系数和方程的根。,应该使接口更简单,如:,QUAD-ROOT,(,A,B,C,ROOT1,ROOT2,),A,、,B,、,C,是方程的系数,,ROOT1,,,ROOT2,是方程的根。,5,.,力争降低模块接口的复杂度,6,.,设计单入口、单出口的模块,7,.,模块功能应该可以预测,5.4,图形工具,5.4.1,层次图和,HIPO,图,正文加工系统,输入,输出,编辑,加标题,存储,检索,编目录,格式化,添加,删除,插入,修改,合并,列表,图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 结构图的例子产生最佳解的一般结构,M,A,B,图5.6 判定为真时调用,A,,,为假时调用,B,M,A,B,C,图5.7 模块,M,循环调用模块,A,、,B,、,C,5.5,面向数据流的设计方法,面向数据流设计(,Data Flow-Oriented Design,,,DFOD,),是与数据流分析(,DFA,),对应的结构化软件设计技术。,面向数据流的设计将得到以数据流图为基础的,软件模块结构图,。,数据流可以分为两种类型:,1,)变换型数据流,2,)事务型数据流,5.5.1 变换流与事务流,一、,变换流,具有较明确的输入、变换(或称主加工)和输出界面的数据流图称为变换型数据流图。,如图所示,该变换中心可以理解为数据的加工和处理程序。,读入原始数据,校验原始数据,计算最优结果,编辑打印最优结果,输入,变换中心,输出,事务型数据流图中存在一个事务中心(也就是数据处理、加工中心),它将输入分离成若干个发散的数据流,形成许多活动路径,并根据输入值选择其中一条路径。,要求类别处理,分房处理,调房处理,退房处理,住房要求,事务中心,活动路径,二、,事务流,通常,一个实际系统的数据流图是变换型和事务型两种类型的混合体。,如图所示,中间的子块属事务型数据流,如果把中间子块视为一个处理整体的话,整个程序属变换型程序。,A,(事务型,,A,为事务中心),变换中心,输入,输出,混合型数据流图,面向数据流设计软件结构的基本步骤有七步:,1,)复审并精化数据流图;,2,)确定数据处理流图的类型;,3,)确定变换中心或事务中心;,5.5.2 面向数据流设计的步骤,4,)将数据流图映射成软件模块结构图,设计出该数据流图对应的第一层模块结构;,5,)基于数据流图逐步分解,设计下层模块;,6,)运用模块设计和优化准则优化软件结构;,7,)描述模块的接口。,复查、精化数据流图,类型,找出事务中心,找出变换中心,映射成事务结构,映射成变换结构,优化软件模块结构,导出模块结构,复查,不满意,变换,事务,变换设计,事务设计,面向数据流的设计步骤,变换设计,就是从变换型数据流图映射出软件模块结构的过程,也称以变换为中心的设计。,5.5.3 变换设计,变换设计的基本方法有两步:,1)分解第一层模块结构,就是把整个变换分解成输入控制模块,Ci,、,输出控制模块,Co,和变换中心控制模块,Ct,,,由主控模块控制。,主控模块,输出控制模块,Co,变换中心控制模块,Ct,输入控制模块,Ci,2)分别设计输入、输出和处理的下层模块结构,方法是:,从变换中心边界向两侧移动,,分别把输入通路和输出通路的每个处理映射成输入控制模块,Ci,和输出控制模块,Co,的下属模块。,变换中心的下层模块,是把每个处理映射成变换中心控制模块,Ct,的一个直接下属模块。,A,B,C,D,F,E,G,H,I,J,K,变换中心,输入,输出,主控模块,输出控制模块,Co,变换中心控制模块,Ct,输入控制模块,Ci,D,C,B,A,E,F,G,I,H,J,K,事务设计,就是从事务型数据流图映射出软件模块结构的过程,也称为以事务为中心的设计。,5.5.4 事务设计,事务设计的基本方法有两步:,1,)建立主控模块、接收输入类型分析模块和事务调度模块;,主模块,调度,输入类型分析,2,)分别设计输入类型分析模块和调度模块的下层模块结构。,方法是:将输出的每条通路作为调度模块的一个判断分支,而输入类型分析模块的下层模块与变换设计类似。,I2,I3,I1,TC,A1,B1,C1,A2,B2,C2,事务中心,主模块,调度,输入类型分析,I1,I3,I2,A1,A2,B1,B2,C1,C2,第,5,章小结,概要设计说明书,该说明书是概要实际阶段的工作成果,它应说明功能分配、模块划分、程序的总体结构、输入输出以及接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。,第,6,章:详细设计,目标,:确定如何具体实现所要求的系统。,不是具体编写程序,而是设计程序的“蓝图”。,详细设计的结果决定最终程序代码的质量。,E.W.Dijkstra,最早提出结构程序设计:程序质量与程序中包含的,Goto,语句的数量成反比(,1965,)。,1966,,,Bohm,Jacopini,,证明了只用“顺序”、“选择”、“循环”控制结构就能实现任何单入口单出口程序。,6.1 结构程序设计,理论上,最基本的控制结构只有两种:顺序、循环结构(选择结构可由其两者构造)。,学界认识到,不是简单去掉,Goto,语句的问题,而是要创立一种新的程序设计方法。,结构化程序设计(,IBM,率先成功运用)。,结构程序设计,:,一种设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。,使用结构程序设计技术的好处,:,1,)提高软件开发工程的成功率和生产率;,2,)系统有清晰的层次结构,容易阅读理解;,3,)单入口单出口的控制结构,容易诊断纠正;,4,)模块化可以使得软件可以重用;,5,)程序逻辑结构清晰,有利于程序正确性证明。,经典的结构程序设计,:只允许使用顺序、,IF_THEN_ELSE,选择和,DO_WHILE,循环;,扩展的结构程序设计,:除了三种基本控制结构,还使用,DO_CASE,和,DO_UNTIL,循环;,修正的结构程序设计,:除了三种基本控制结构和两种扩充结构,还使用,BREAK,等结构。,流程图通常由三种结点组成:,1),函数结点,如果一个结点有一个入口线和一个出口线,则称为函数结点。,由于函数结点一般对应于赋值语句,所以,F,也表示了这一个结点对应的函数关系。,F,函数结点,6.1.1,结构化程序,6.1.1.1,控制结构,2,),谓词结点,如果一个结点有一个入口线和两个出口线,而且它不改变程序的数据项的值,则称为谓词结点。,P,是一个谓词,根据,P,的逻辑值(,T,或,F,),,结点有不同的出口。,P,谓词结点,3,),汇点,如果一个结点有两个或多个入口线和一个出口线,而且它不执行任何运算,则称为汇点,。,汇点 汇点的简略表示,1),顺序结构,:相当于“,A,、,B”,2.三种基本控制结构,A,B,(,a),顺序结
展开阅读全文