软件工程概要数据库原理课程补充知识背景软件危机–软件开发周期大大超过规定日期–软件开发成本严重超标–软件质量难于保证软件的发展大体上经历了三个阶段:程序设计阶段、软件阶段、软件工程阶段。程序设计时代名称程序生产方式个人质量取决于个人水平设计对象以硬件为中心开发工具无维护无设计方法无以技巧为主软件时代软件项目组取决于小集团水平硬件/软件为中心无系统工具,工具为个人所有由开发者进行维护,在设计中不重视维护设计问题自顶向下有质量保证问题和持续性问题软件工程时代软件产品软件组织软件生产管理以软件为中心软件生成器设计与制作过程中均考虑维护问题,维护成本占很大比重结构化设计、原型设计从程序设计到软件工程时代软件工程的定义IEEE【IEE93】定义:“将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中。”软件工程是应用计算机科学、数学及管理科学等原理开发软件的工程。它借鉴传统工程的原则、方法,以提高质量,降低成本为目的。两种软件工程方法传统软件工程–软件分析→总体设计→详细设计→面向过程的编码→测试面向对象软件工程–软件分析与对象抽取→对象详细设计→面向对象的编码→测试结构化分析模型的组成结构数据流图(DFD)E-R图状态变迁图(STD图)加工说明控制说明数据对象说明数据字典(DD)面向对象分析模型的组成结构对象-关系模型类/对象模型对象-行为模型使用实例(UseCase)操作、对象模型动态模型功能模型传统软件工程中的瀑布模型可行性研究与计划需求分析总体|详细设计编码运行维护测试定义阶段开发阶段维护阶段1.问题定义关键问题:“要解决的问题是什么?”主要结果:提出关于问题的性质、工程目标和规模的书面报告。内容及步骤(一)系统任务的提出(二)初步调查(三)系统目标的确定2可行性研究可行性、可行性研究的含义•可行性的含义包括可能性、必要性。•可行性分析的对象是系统目标。评价总体方案(系统目标)的可能性、必要性。•可行性研究目的:•用最小的代价在尽可能短的时间内确定问题是否能够解决,是否有必要去解决。可行性研究的内容1.技术上的可行性2.经济上的可行性3.操作可行性4.时间可行性5.组织与管理上可行性6.社会、政策允许的可行性3.需求分析的任务准确地定义未来系统的目标,确定为了满足用户的需求系统必须做什么。用需求规格说明书规范的形式准确地表达用户的需求。基本任务:准确地回答“系统必须做什么?”需求分析的具体任务1.确定对系统的综合需求:(1)系统功能要求(2)系统性能要求(3)运行要求(4)将来可能提出的要求2.分析系统的数据要求:采用建立“概念模型”的方法,并辅助图形工具,如:层次方框图、Warnier图等。3.导出系统的逻辑模型:数据流程图、数据字典、主要算法4.修正系统开发计划5.开发原型系统4.总体设计的过程设想供选择的方案选取合理的方案推荐最佳方案功能分解设计软件结构数据库设计制定测试计划书写文档审查和复审5.详细设计的基本任务回答的关键问题:“怎样具体地实现这个系统”主要任务是设计出程序的“蓝图”,供程序员日后根据这个蓝图编写出实际的程序代码。–注意:设计程序的蓝图,不是具体地编写程序。–设计程序主要采用结构化的程序设计方法。详细设计主要任务:编写详细设计说明书为此,设计人员应:(1)确定每个模块的算法,用工具表达算法的过程,写出模块的详细过程性描述。(2)确定每一模块的数据结构。(3)确定模块接口细节。详细设计是编码的先导。详细设计具体任务–确定模块如何实现–编写详细设计说明书–制定单元测试计划–详细设计评审6.编码程序写作风格程序设计方法论–自顶向下的程序设计方法–自底向上的程序设计方法程序设计自动化程序设计工具7.测试软件测试是为了发现错误而执行程序的过程。•软件测试是根据软件开发阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入的数据及其预期的输出结果),并利用这些用例去运行程序,以发现程序错误的过程。软件测试的目的测试是程序的执行过程,目的在于发现错误;一个好的测试用例在于能发现至今未发现的错误;一个成功的测试是发现了至今未发现的错误的测试。测试设计中需要考虑的22种测试类型•黑盒测试•白盒测试•单元测试•累计综合测试•集成测试•功能测试•系统测试•端到端测试•健全测试•衰竭测试•接受测试•负载测试•强迫测试•性能测试•可用性测试•安装/卸载测试•恢复测试•兼容测试•安全测试•比较测试•Alpha测试•Beta测试8.运行维护本质上是修改和压缩了的软件定义和开发过程分析设计编码测试验收配置复审可靠性可移植性可用性可理解性可修改性可测试性可理解性可修改性可移植性效率可靠性效率完整性一致性可理解性几种典型的开发方法:•模块化方法(modularmethod)•结构化方法•面向数据结构方法•面向对象方法软件开发方法结构程序设计结构程序设计是一种设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。逐步求精的含义总体设计阶段逐步求精的含义–把一个复杂问题的解法分解和细化成一个由许多模块组成的层次结构的软件系统。详细设计阶段逐步求精的含义–把一个模块的功能逐步分解细化为一系列具体的处理步骤或某种高级语言的语句。结构程序设计优越性自顶向下逐步求精的方法符合人类解决复杂问题的普遍规律,因此可以显著提高软件开发工程的成功率和生产率。用先全局后局部、先整体后细节、先抽象后具体的逐步求精过程开发出的程序有清晰的层次结构,因此容易阅读和理解。不使用GOTO语句,仅使用单入口单出口的控制结构,使得程序的静态结构和它的动态执行情况比较一致,易于阅读和理解。……传统方法学的缺点瀑布模型的缺点:僵化瀑布模型要求:生命周期各阶段间遵守严格的顺序。实际情况是:软件开发往往在反复实践中完成。瀑布模型要求:预先定义并“冻结”软件需求。实际情况是:某些系统的需求的一个逐渐明确的过程,且预先定义的需求到软件完成时可能已经过时。结构化技术的缺点(SA-SD-SP)本质上是功能分解,以实现功能的过程为中心。而用户的需求变化主要是针对功能的。这就使基于过程的设计不易被理解;且功能变化往往引起结构变化较大,稳定性不好。系统有明确的边界定义,且系统结构依赖于系统边界的定义,这样的系统不易扩充和修改。数据与操作分开处理,可能造成软构件对具体应用环境的依赖,可重用性(reusability)较差.软件工程的新途径之一:快速原型法适用于用户驱动的系统(即需求模糊或随时间变化的系统)建造/修改原型用户测试运行原型听取用户意见传统方法和面向对象方法的比较传统方法系统是过程的集合过程与数据实体交互过程接受输入并产生输出面向对象方法系统是交互对象的集合对象与人或其它对象交互对象发送与响应消息传统方法数据与过程是分离的过程1输入输出过程2过程3数据实体属于该对象的数据对象处理数据的方法消息消息对象把数据和处理数据的方法封状成一个单元为什么对面向对象方法感兴趣?面向对象方法的主要优点:自然性:追求软件系统对现实系统的直接模拟,尽量实现将现实世界中的事物直接映射到软件系统的解空间中。软件复用:可复用性(可重用性)可扩展性可管理性面向对象分析面向对象分析的关键:识别出问题域内的对象,并分析它们相互间的关系,最终建立起问题域的简洁、精确、可理解的正确模型。面向对象方法最基本的原则:按照人们习惯的思维方式,用面向对象观点建立问题域的模型,开发出尽可能自然地表现求解方法的软件。面向对象建模用面向对象方法开发软件,通常需要建立三种形式的模型:–对象模型:描述系统数据结构–动态模型:描述系统控制结构–功能模型:描述系统功能一些具体工具介绍ARoomhierarchybasedonaninteriordesigner’sperspectiveRoomRoomwithlightsRoomwithwindowsGarageBasementKitchenBathroomRoomwithFurnitureLivingRoomFamilyRoomBedRoomDiningRoom层次方框图数据流程图DFD是结构化系统分析的主要工具,它表示了系统内部信息的流向,并表示了系统的逻辑处理的功能数据流程图的特性(1)抽象性:具体的组织机构、工作场所、物质流等等都去掉,仅剩下信息和数据存储、流动、使用以及加工的情况。(2)概括性:它把系统对各种业务的处理过程联系起来考虑,形成一个总体,具有概括性。(3)数据流程图描述的主体是抽象出来的数据。(4)数据流程图具有层次性,一个系统将有许多层次的流程图。数据流程图的用途–系统分析员用这种工具可以自顶向下分析系统信息流程–可在图上画出需要计算机处理的部分–根据数据存贮,进一步作数据分析,向数据库设计过渡–根据数据流向,定出存取方式–对应一个处理过程,用相应的语言、判定表等工具表达处理方法程序流程图、伪码、盒图、问题分析图开始PGQandP停止FFdefkx2de123Whilex3cx21cDo-Whilex323dek:PROCEDUREspell_checkISBEGINSplitdocumentintosinglewordsLookupwordsindictionaryDisplaywordswhicharenotindictionaryCreateanewdictionaryENDspell_check几种表示工具比较流程图伪码PDL盒图N-S问题分析图PAD结构化差中优优逻辑表达中良良良易转换代码良优良优直观性中中良良使用频率优优中中判定表–判定表能够清晰地表示复杂的条件组合与应做的动作之间的对应关系,而其它的工具不易表示。–一张判定表由四部分组成,左上部列出所有条件,左下部是所有可能做的动作,右上部是表示各种条件组合的一个矩阵,右下部是和每种条件组合相对应的动作。–判定表的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作。例子:航空行李托运费的算法按规定:重量不超过30公斤的行李可免费托运。重量超过30公斤时,对超运部分,头等舱国内乘客收4元/公斤;其它舱位国内乘客收6元/公斤;外国乘客收费为国内乘客的2倍;残疾乘客的收费为正常乘客的1/2。123456789国内乘客TTTTFFFF头等舱TFTFTFTF残疾乘客FFTTFFTT行李重量W30TFFFFFFFF免费(W-30)2(W-30)3(W-30)4(W-30)6(W-30)8(W-30)12用判定表表示计算行李费的算法RulesRulenumbersConditionrowsActionrows行李费算法行李重量W30行李重量W30免费国内乘客外国乘客头等舱其他舱残疾乘客正常乘客(W-30)2(W-30)4残疾乘客正常乘客(W-30)3(W-30)6头等舱其他舱残疾乘客正常乘客(W-30)4(W-30)8残疾乘客正常乘客(W-30)6(W-30)12用判定树表示计算行李费的算法注:判定表与判定树并不适用于作为一种通用的设计工具,通常将之用于辅助测试判定树表示法参考书籍张海藩,《软件工程导论》第三版,清华大学出版社第七学期课程