软件工程一、绪论软件工程的产生(1)“软件”即计算机程序及其说明程序的各种文档。
是一种逻辑产品,1946-1956)个体手工劳动,,产,使用数据库、开发工具、开发环境、网络、分布式、面向对象技术。
开发技术进步,但软件费用上升,并没有摆脱软件危机。
(2)软件危机。
复杂的、大型的软件开发项目被提出,但软件开发技术未能满足发展的要求,这矛盾积累起来,形成软件危机。
表现为:经费高和完成时间长、开发的软件未能满足客户要求、可维护性差、可靠性差。
(3)软件工程是用科学知识和技术原理来定义、开发、维护软件的一门综合性的交叉学科,其目标是成功的建造一个大型软件系统,内容有软件开发和开发管理两个方面,面临的问题有软件费用、可靠性、可维护性、生产率、软件重用等。
软件的生存周期(1)软件工程过程包含7个过程:获取过程、供应、开发、操作、维护、管理、支持;(2)软件生存周期是指一个软件从提出开发要求开始知道该软件报废为止的整个时期。
包括:①可行性分析和开发计划。
明确问题的性质、目标、规模和求解方法;②需求分析。
明确软件系统的功能;③概要设计。
划分模块,设计软件结构;④详细设计。
为每个模块完整功能进行描述;⑤编码。
把模块的控制结构编成计算机可接受的程序代码;⑥测试。
包括模块测试、组装测试、确认测试。
是保证软件质量的重要手段;⑦维护。
是软件生存周期最长的阶段。
软件生存周期模型-描述软件开发过程中各种活动如何执行的模型(1)瀑布模型。
将软件生存周期各活动规定为依线性顺序连接的若干阶段。
以文档作为驱动,适合于需求很明确的项目开发的模型。
它强调每一阶段的严格性,是一种整体开发模型;(2)增量模型。
是一种非整体开发模型,软件是“逐渐”被开发出来的。
适合需求不明确、设计方案有一定风险的项目;(3)螺旋模型。
将瀑布模型和增量模型结合起来。
是一种风险驱动的模型。
可分为几个螺旋周期,每一周期包括制定计划、风险分析、开发实施、用户评价4个步骤。
(4)喷泉模型。
开发过程具有迭代性和无间隙性。
以用户需求为动力;(5)基于知识的模型-智能模型。
将瀑布模型和专家系统结合;(6)变换模型。
适合于形式化的开发方法模型;(7)统一过程。
是基于统一建模语言的软件开发过程,用例驱动和风险驱动的、以构架为中心的、采用迭代和增量的软件开发过程。
是软件开发的主流过程。
软件开发方法(1面向数据流。
总的思想是自顶向下、逐步求精,基本原则是功能的分析与抽象。
是软件工程最早的开发方法,也是应用广、成熟的方法;(2)Jachson方法-面向数据结构;(3)维也纳开发方法VDM-基于模型的方法,主要思想是将软件系统当作模型来给予描述,具体说就是把软件的输入/输出看作模型对象,借助于描述工具语言Meta-IV;(4)面向对象开发方法,包括面向对象分析、面向对象设计、面向对象实现。
一、软件要求定义可行性研究(1)技术可行性、经济可行性、社会可行性;(2)步骤:确定项目规模和目标、研究现有系统、建立新系统的高层逻辑模型、导出和评价各种方案、推荐可行的方案编写可行性研究报告;(3)系统流程图,描述物理系统的工具。
符号如下表:软件需求分析(1)需求分析就是开发人员要准确理解用户的要求,进行细致的调查分析,将用户非形式的需求陈述转化为完整的需求定义,再由需求定义转换道响应的形式功能规约的过程;(2)难点:问题复杂性、交流障碍、不完备性和不一致性、需求易变性;(3)原则:必须表达和理解问题的数据域和功能域;可以把复杂问题按功能进行分解并可逐层细化;建模;(4)基本任务是准确的定义新系统的目标,具体有问题识别、分析与综合,导出软件的逻辑模型、编写文档;(5)方法:功能分解方法-本质是用过程抽象的观点来看待系统需求、结构化方法、信息建模方法、面向对象的分析;IDEF方法(1)1981,在结构化分析与设计的基础上提出的。
是集成化计算机辅助制造设计的缩写Integrated Computer Aided Manufacturing(ICAM)Definition。
包括三个部分:①IDEF0。
用来描述系统的功能活动及其联系,建立系统的功能模型;②IDEF1。
用来描述系统的信息及其联系,建立系统的信息模型;③IDEF2。
用来进行系统模拟,建立系统动态模型。
(2)IDEF0的特点:采用方框/箭头等简单图形符号描述系统的活动和数据流,描述活动所受到的约束条件及实现机制,IDEF0图宜做正式文档;采用严格的自上向下、逐层分解的方式建立系统功能模型。
每张图至少3个、最多6个方框。
二、软件设计软件概要设计(1)基本任务:设计软件系统结构-以模块为基础;数据结构及数据库设计-数据库的设计包括概念设计、逻辑设计、物理设计三个方面;编写概要设计文档;评审;(2)概要设计说明书的主要内容:引言-目的背景等;总体设计-需求规定、运行环境等;接口设计-用户接口外部接口内部接口;运行设计-控制、时间;系统数据结构设计;系统出错处理设计;(3)软件设计原则:①模块化。
自顶向下把软件系统划分成若干模块,是解决复杂问题的手段,复杂性:C(P1+P2)>C(P1)+C(P2);②抽象。
③信息隐蔽。
通过信息隐蔽,可以定义和实施对模块的过程细节和局部数据结构的存取限制;④模块独立性。
两聚-通信内聚-顺序内聚-功能内聚。
模块内元素尽量强内聚。
软件结构准则(1)软件结构图。
Structure Chart-SC。
结构图包括模块(方框表示)、模块间的联系(箭头表示)、模块间信息传递(带注释的箭头,带空心园表示传递数据,带实心圆表示传递控制信息)、两个附加符号-选择调用(小三角)和循环调用(环形箭头);(2)结构图结构特征:深度-结构图的控制层次;宽度-一层中最大的模块个数;扇入-一个模块直接上属模块个数;扇出-一个模块直接下属模块个数。
在结构图中,同一名字的模块仅出现一次,调用关系只能从上到下。
(3)结构设计优化准则:①模块独立性准则-高内聚、低耦合;②控制范围与作用范围的准则-作用范围应在控制范围之内,且条件判定所在的模块应与受其影响的模块在层次上尽量靠近;③形态特征准则-深度、宽度、扇入扇出应适当;一般顶层扇出数高些,中间层扇出低些,底层扇入数高些;④模块大小准则。
在50~150条语句之间;⑤模块接口准则。
简单、清晰、含义明确、易于理解、实现、测试和维护。
(4)HIPO图(Hierarchy Plus Input/Processing/Output)。
是IBM公司开发的表示软件系统结构的工具,既可描述软件总的模块层次结构-H图-层次图,矩形框表示一个模块,框间直线表示模块间调用关系;也可描述每个模块输入/输出数据、处理功能及模块调用的详细情况-IPO图-未说明模块间的信息传递和模块内部处理;基于IDEF0图的设计方法,是结构化设计技术之一,以系统的功能模型和信息结构为基础设计系统的软件结构。
软件详细设计(1)主要确定每个模块具体执行过程,故也称“过程设计”。
并不是具体编程,二是细化成很容易从中产生程序的图纸。
(2)基本任务:算法设计、数据结构设计、物理设计、其他设计(代码、I/O、人机对话设计)、编写详细设计说明书、评审(3)方法:采用结构化程序设计,要点为:①采用自顶向下、逐步求精的程序设计方法;②使用三种基本控制结构构造程序-顺序、选择、重复;③主程序员的组织形式-最先由IBM公司实施。
(4)软件详细表示法。
采用三种工具-图形、表格和语言。
①程序流程图-直观清晰、易于理解,但容易造成非结构化的程序结构,不能反映逐步求精的过程,不易表示数据结构;②问题分析图PAD图-由左往右展开的二维树型结构。
流程为自上向下、从左往右执行,层次关系清晰,支持逐步求精方法,易读易写,支持结构化的程序设计原理,可自动生成程序;③过程设计语言PDL,是在伪码基础上扩充了模块的定义和调用、数据定义和I/O而形成的。
PDL外语法同响应程序语言一致,内语法使用自然语言,易写易懂;提供的机制较图形全面,利于保障质量;可嵌入注释,利于维护;可自动生成程序代码。
三、软件编码程序设计语言特性(1)心理特性-影响程序员心理的语言特性。
表现为:歧义性、简洁性、局部性和顺序性;(2)工程特性,对程序编码要求有:可移植性、开发工具的可利用性、软件的可重用性、可维护性;(3)技术特性。
程序设计语言的选择(1)项目的应用领域-选择语言的关键因素。
有5种类型:①科学工程计算:FORTRAN、Pascal、C、PL/1;②数据处理与数据库应用:Cobol、SQL、4GL;③实时处理:汇编语言、Ada;④系统软件:汇编、C、Pascal等;⑤人工智能:Lisp、Prolog。
(2)软件开发的方法:C++、Java;(3)软件执行的环境:Visual BASIC、Visual C、Visual FoxPro、Delphi等;(4)算法和数据结构的复杂性;(5)软件开发人员的知识。
4GL语言:称为第四代语言。
特征是:界面友好,操作简单;兼有过程性和非过程性双重特性;高效的程序代码;完备的数据库;应用程序生成器,提供一些常用的程序来完成文件维护、查询等,提高了效率。
目前Fox公司的FoxPro、Uniface公司的Uniface、Powersoft 公司的Power Builder、Informix公司的Informix_4GL以及扩充版的SQL都不同程度具有上述特性。
程序设计风格-一个人编制程序时表现出来的特点、习惯及逻辑思路等;影响因素有:(1)源程序文档化-原则有:标识符按意取名;程序加以注释;(2)数据说明-原则:数据说明顺序规范;加以注释;(3)语句构造;(4)输入和输出;(5)效率。
四、软件测试测试原则:①测试用例由输入数据和预期输出数据组成;②测试用例应包含合理和不合理的输入数据;③除了检查程序做了该做的事,还应该检查是否做了不该作的事;④制定测试计划并严格进行,排除任意性;⑤长期保留测试用例;⑥对发现错误多的程序,应深入进行测试;⑦程序员避免测试自己的程序。
测试方法:(1)①静态测试:指被测试程序不在机器上运行,而采用人工检测和计算机辅助静态分析的手段进行检测;②动态测试:指通过运行程序发现错误,一般采用。
有两种方法:一是测试产品功能,二是测试产品内部结构及处理过程,分别称为黑盒测试法和白盒测试法。
测试用例的设计:(1)白盒技术-属于结构测试,对象基本是源程序:①逻辑覆盖,包括语句覆盖-执行到每一语句、判定覆盖-每个判定条件至少获得一次真值盒假值、条件覆盖-每个条件各种可能值至少出现一次、判定/条件覆盖、条件组合覆盖、路径覆盖②循环覆盖;③基本路径测试-确保程序每条路径的执行;(2)黑盒技术-属于功能测试,一般有4种方法:①等价类划分-先划分等价类,再确定测试用例;②边界值分析;③错误推测;④因果图;⑤综合测试。