1、现代软件工程,第一部分 软件工程的基本问题综述,从软件到软件工程:进入一个新的境界-1 生命周期:软件工程的基本思路-2 技术与方法:软件工程的基本过程-3 软件企业的现代软件工程实践-4,第一章 现代软件工程概述,第一部分 现代软件工程的基本概念,第三章 软件工程的技术与方法面向过程的分析和设计方法-3.1 面向数据的分析和设计方法-3.2 面向对象的分析和设计方法-3.3 软件工程的工具和环境-3.4,软件开发方法是软件工程的一个组成部分,在软件工程早期,是软件工程的核心内容 软件开发方法主要指: 开发步骤(每一步相应的目标、要求和结果) 开发工具和技术(采用的分析和设计工具和技术) 开发
2、的结果与形式(使用的文档和符号) 开发过程和方案的评价标准 软件开发方法的提出和逐步完善,是软件从作坊到“工程化”生产的重要转变 传统软件工程经历了以下一些开发方法的演变: 面向过程的分析和设计方法 面向数据的分析和设计方法 面向对象的分析和设计方法,3.1 面向过程的分析和设计方法,结构化程序的特征: 控制结构仅由顺序、选择和重复(或称为迭代)等结构复合而成; 可以自底向上地逐步抽象,最终抽象成一个函数型结点; 每个结点(控制流程图中的一个结点)都有单一入口与单一的出口,从出口到入口,都存在一条经过该结点的路径。 所以,结构化程序的编写,是抽象问题的逐步展开过程,结构化程序的阅读,是问题的逐
3、步抽象的过程,结构化程序设计倡导的原则: 遵行结构化程序设计的约定; 保持良好的程序书写风格; 按照一定的书写格式(如:缩进、排列、注解等)。,结构化分析与设计的来源:结构化程序设计 结构化程序设计的一个直接的研究结果,是要开发“模块化(函数过程)”的系统,从而导致面向过程的系统分析、设计方法的产生。 模块化系统设计: 模块化的主要思想,是对整个系统进行分解,分解成若干功能独立、能分别设计、编程和测试的模块,程序员可分工完成; 开发一个模块,并不需要知道其他模块的内部结构和编程细节; 模块之间的接口应尽量简洁、明确,模块应尽可能彼此隔离。 对模块的要求: 具有相对独立性,对系统的修改可限制在对
4、个别模块的修改上,而不会影响系统的其他模块、也不会影响系统的质量; 具有可读性,每个模块的含义、职责是明确的、接口关系是清晰的、从而降低了系统的复杂性,阅读和理解都比较方便; 具有易验证性,每个模块的正确实现,可以保证系统的正确。 模块化程序设计研究“内聚与偶合度”问题,有7种内聚和7种偶合。,3.1 面向过程的分析和设计方法,程序的模块化,很自然的导致对系统结构的结构化要求:系统结构是指:系统内各组成要素之间的相互联系、相互作用的框架。 结构化方法就是:强调系统结构的合理性。 结构化设计方法的原则是: 分解和抽样; 模块的独立性; 信息屏蔽等。 针对系统不同阶段,结构化方法有: 结构化设计
5、结构化编程 结构化测试等,3.1 面向过程的分析和设计方法,Parnas方法最早的软件开发方法是由D. Parnas在1972年提出的。由于当时软件在可维护性和可靠性方面存在着严重问题,因此Parnas提出的方法是针对这两个问题的。首先,Parnas提出了信息隐蔽原则:在概要设计时列出将来可能发生变化的因素,并在模块划分时将这些因素放到个别模块的内部。这样,在将来由于这些因素变化而需修改软件时,只需修改这些个别的模块,其它模块不受影响。信息隐蔽技术不仅提高了软件的可维护性,而且也避免了错误的蔓延,改善了软件的可靠性。 Yourdon方法 1978年,E.Yourdon和L.L.Constan-
6、tine提出了结构化方法,即SASD方法,也可称为面向功能的软件开发方法或面向数据流的软件开发方法。1979年Tom DeMarco对此方法作了进一步的完善。 Yourdon方法是80年代使用最广泛的软件开发方法。它首先用结构化分析(SA)对软件进行需求分析,然后用结构化设计(SD)方法进行总体设计,最后是结构化编程(SP)。这一方法不仅开发步骤明确,SA、SD、SP相辅相成,一气呵成,而且给出了两类典型的软件结构(变换型和事务型),便于参照,使软件开发的成功率大大提高,从而深受软件开发人员的青睐。,3.1 面向过程的分析和设计方法,传统软件工程把软件的生命周期定义为6个阶段:问题定义与可行性
7、研究、需求分析、软件设计、编码、测试、运行与维护问题定义与可行性研究 是指系统分析员通过对系统实际用户、使用管理部门、相关部门及人员进行的实际调查,搞清楚“问题”的背景、目的是什么?然后,据此提出关于“问题”的性质、工程目标、规模、相关联系等项目的基本情况,进行可行性分析,编制开发计划。在问题定义和分析阶段,结构化分析方法为系统分析人员,给出了一组帮助分析以产生功能规约的原理和技术。这组技术最早是从IBM的输入-加工-输出(IPO)开始、以后发展为层次IPO(HIPO),是80年代最流行的方法。,3.1 面向过程的分析和设计方法,结构化分析的主要技术有: 数据流图和控制流图技术:层次方框图、W
8、arnier图、IPO图 数据字典 结构化语言PDL(过程设计语言) 判定表和判定树等结构化分析的步骤是: 分析当前情况,做出反映当前物理模型的数据流图; 推导出等价的逻辑模型的数据流图; 设计新的逻辑系统,生成数据字典和基元描述; 建立人机接口界面,提出可供选择的目标系统的物理模型数据流图; 确定各种方案的成本和风险,据此对各种方案进行分析; 选择一种方案; 建立完整的需求规约。,3.1 面向过程的分析和设计方法,层次化模型结构图,3.1 面向过程的分析和设计方法,描述工具:结构化英语 由简单的陈述句,判断语句,循环语句复合而成。 可使用IFENDIF、DO CASEENDCASE、DO W
9、HILEENDDO等关键字。,IF customer does more than $50,000 buesinessTHEN IF the customer wasnt in debt to us the last 3 monthsTHEN discount is 15%ELSE (was in debt to us)IF customer has been with us for more than 20 yearsTHEN discount is 10%ELSE (20 year OR less) SO discount is 5%ELSE (customer dose $ 50,000
10、 OR less) SO discount is nil,3.1 面向过程的分析和设计方法,描述工具:决策树 用图形方式(树型)描述加工逻辑。通常用来描述根据不同条件及其取值来选择的处理过程。,3.1 面向过程的分析和设计方法,判断表 变量表判断表,3.1 面向过程的分析和设计方法,算法描述语言方法 流程图 伪码,3.1 面向过程的分析和设计方法,软件设计包括概要设计和详细设计二个阶段: 在概要设计(总体设计)阶段,开发人员要回答需求分析中获得的系统目标,如何去实现,这个问题。(1)概要设计要体现对需求的完整实现; (2)概要设计要保证与需求的一致性;(3)概要设计能够达到向需求的反向可追踪;
11、(4)概要设计关注对系统结构设计的逻辑性、合理性和可扩展性;传统软件工程提出了很多设计方法,最主要的的面向结构的设计方法结构设计(SD)等。在详细设计阶段,是对概要设计进行细化,回答如何具体实现系统目标的问题。详细设计是面向具体程序编码,重点是编码规范。传统软件工程开发了HIPO(层次图加输入/输出处理)、结构图、PDL(过程设计语言)等工具。,3.1 面向过程的分析和设计方法,结构化设计给出一组帮助设计人员在模块层次上区分设计质量的原理与技术,它通常与结构化分析衔接起来使用。 结构化设计以数据流图为基础,得到软件模块结构 结构化设计方法适用于变换型和事务型结构的目标系统 在整个设计过程中,从
12、程序的结构出发,利用模块结构图表达程序模块之间的关系 构成模块结构图的主要成分有: 模块 调用和数据(参数) 结构化设计的主要步骤是: 评审和细化数据流图 确定数据流图的类型 把数据流图映射到软件模块结构,设计出模块结构的上层 基于数据流图逐步分解高层模块,设计中下层模块 对软件模块结构进行优化,得到更为合理的软件结构 描述模块接口,3.1 面向过程的分析和设计方法,1.Jackson方法 1975年,M.A.Jackson提出了一类至今仍广泛使用的软件开发方法。这一方法从目标系统的输入、输出数据结构入手,导出程序框架结构,再补充其它细节,就可得到完整的程序结构图。这一方法对输入、输出数据结构
13、明确的中小型系统特别有效,如商业应用中的文件表格处理。该方法也可与其它方法结合,用于模块的详细设计。 Jackson方法有时也称为面向数据结构的软件设计方法。 2.Warnier方法 1974年,J.D.Warnier提出的软件开发方法与Jackson方法类似。差别有三点:一是它们使用的图形工具不同,分别使用Warnier图和Jackson图;另一个差别是使用的伪码不同;最主要的差别是在构造程序框架时,Warnier方法仅考虑输入数据结构,而Jackson方法不仅考虑输入数据结构,而且还考虑输出数据结构。,3.1 面向过程的分析和设计方法,面向过程的系统分析和设计的例子,业务需求描述: 开发一
14、个银行的活期存取款业务的处理系统:储户将填好的存/取款单和存折交给银行工作人员,然后由系统作以下处理; (1)业务分类处理:系统首先根据储户所填的存/取款单,确定本次业务的性质,并将存/取款单和存折交下一步处理; (2)存款处理:系统将存款单上的存款金额分别记录在存折和帐目文件中,并将现金存入现金库;最后将存折还给储户; (3)取款处理:系统将取款单上的取款金额分别记录在存折和帐目文件中,并从现金库提取现金;最后将现金和存折还给储户。 要求:绘制该系统的数据流图和软件结构图。,顶层图,面向过程的系统分析和设计的例子,一层图,面向过程的系统分析和设计的例子,二层图,面向过程的系统分析和设计的例子
15、,软件结构图,面向过程的系统分析和设计的例子,小结: 结构化方法的指导思想: 围绕业务抽象和功能分解、以处理功能的实现,来构造软件系统 系统是一些功能的相互联系、相互作用而构成的 结构化方法的主要内容: 结构化分析(SA) 结构化设计(SD) 结构化程序设计(SP) 结构化方法的核心要点: 自定向下 逐步求精 单入/出口 评价: 优点:简单实用、技术成熟、应用广泛 缺点:对大型复杂的项目、不适用,难于解决需求变化、维护复杂的项目、不利于软件复用,3.1 面向过程的分析和设计方法,从面向过程,转换为面向数据 面向数据的分析和设计方法,是面向结构方法的变形 面向数据的重点,是面向数据结构,而不是数
16、据流 侧重点以分析信息流(信息流指信息内容和信息结构)为主。 因此,面向数据的分析是从信息结构进行分析,产生数据结构图,再在此基础上,进行需求分析,导出软件的结构面向数据流的设计方法的基本思路1、变换流2、事务流3、设计过程,3.2 面向数据的分析和设计方法,数据库系统设计过程,概念数据库设计过程,概念数据库设计过程,概念数据库设计过程,实例:为医院建E-R图,包括病人和医生,病人有病历记录,E-R模型向关系模式的转换,E-R模型向关系模式的转换,实体 关系 属性 关系的属性,3.3 面向对象的分析和设计方法,一、发展概述 面向对象并非是一个新的概念,实际上它已有30多年的历史。寻其根源可追溯
17、到60年代的挪威,当时挪威计算中心的Kristen Nygaard和Ole-Johan Dahl开发了一种称作Simula67的语言。Simula67首次引入了类、协同程序和子类的概念,这很象今天的面向对象语言。 70年代中期,Xerox Palo Alto研究中心的研究人员设计了Smalltalk语言,该语言的每个元素都被当作一个对象来实现,其程序设计环境及相关的各个方面都是面向对象的。,但是,面向对象的推广很慢。例如:Samlltalk的成果直到1981年8月因Byte杂志的介绍才为外界所知,许多软件开发人员了解Samlltalk时,都把它看作是一个窗口系统,而不是程序设计技术的一次革命。
18、 80年代,C成为很受欢迎的程序设计语言,它不仅可用在微机上,还可用在多种结构的系统和环境中。80年代早期,AT&T贝尔实验室的Bjarne Stroustrup把C语言扩展为支持面向对象程序设计的C+。在C+中,程序员可以在其熟悉的语言环境下学习掌握面向对象的程序设计技术,而不必去探究一种新的语言和环境。,3.3 面向对象的分析和设计方法,二、研究领域 目前国内外关于面向对象的研究领域主要在以下几个方面: 1.理论:包括方法、面向对象设计的本质以及语义模型的研究。 2.语言:包括现有面向对象的程序设计语言的研究、设计新的面向对象的程序语言,将面向对象的设计思想引入其它语言(如Ada,Prol
19、og,Lisp,C,Pascal,Foxpro等) 3.实现:包括体系结构的支撑、编译与解释、其它特殊技术等。 4.环境:包括面向对象的软件开发环境的设计与实现。,3.3 面向对象的分析和设计方法,5.重用:为了实现重用,需要研究对象的规格说明等。 6.原型:面向对象的设计方法如何用于实现快速原型。 7.应用:将面向对象的设计方法用于商业、教育及科学等实际问题的处理中。 8.其它方面:将面向对象的设计方法用到数据库、操作系统、知识工程、人工智能、自然语言处理等其它领域。,3.3 面向对象的分析和设计方法,三、方法要点: 出发点和基本原则是尽可能地模拟人类的思维习惯 使问题描述空间与计算机的解空
20、间尽可能保持一致。面向对象方法的要点是: (1)客观世界是由对象组成的、简单对象可以组合成更复杂的对象。 (2)所有的对象都可以归为类,每个类都定义了一组数据和方法。数据是对象的静态属性、方法是对象可执行的操作,既类能提供的服务。 (3)按照子类、父类的关系,可以把若干个类组成一个层次结构的系统,下层的类具有继承上层类的特性。 (4)对象之间只能通过传递信息进行通信。,3.3 面向对象的分析和设计方法,四、特点: 已经形成了面向对象的开发方法: 面向对象分析(OOA) 面向对象设计(OOD) 面向对象程序设计(OOP) 软件开发阶段比较模糊。通常在分析、设计与实现阶段进行多次迭代 对象与功能相
21、比,更易于被人们理解、接受和掌握 定义更稳定、修改更容易 主要方法有: Coad/Yourdon Booch OMT OOSE 90年代提出了UML,3.3 面向对象的分析和设计方法,面向对象与传统方法的比较,3.4 软件工程的工具和环境,工具(按功能分):1、软件开发工具 需求分析工具 设计工具 测试工具2、软件维护工具 版本控制 文档分析 逆向工程 再工程3、软件管理与支持 项目管理 开发信息库 配置管理 软件评价,3.4 软件工程的工具和环境,按解决的问题分类 程序设计环境 系统合成环境 项目管理环境 按现有的软件开发环境的演变趋向分类 以语言为中心的环境 面向结构的环境 工具箱环境 基
22、于方法的环境 按集成化程度划分 第一代 第二代 第三代,3.4 软件工程的工具和环境,环境:计算机辅助软件工程(Computer Aided Software Engineering,CASE)CASE的集成机制包括: 数据集成工具间可交换数据 界面集成工具具有相同的界面风格和交互方式 控制集成工具激活后能控制其他工具的操作 过程集成系统嵌入了有关软件过程的知识,根据软件过程模型辅助用户启动各种软件开发活动 平台集成工具运行在相同的硬件/软件操作系统下,3.4 软件工程的工具和环境,CASE工具的四个发展阶段: 80年代软件自动化工具“孤立”发展,重点是自动生成,如:文档自动生成、报表自动生成
23、等; 80中期引入系统信息中心库(Repository),孤立的信息有了交互环境,推动了分析、设计等上游阶段 开发工具的一体化,既:上游工具的集成; 80后期应用程序开发和维护自动化工具与项目管理工具的结合; 90年代确定了“统一使用开发支持工具、实现软件开发全过程的自动化”的目标,展开了全面的攻关: 信息一致性:引入“百科全书(Encyclopedia)的概念; 结构可视性:图形开发工具 软件工程化:引入人工智能(AI)工具,3.4 软件工程的工具和环境,软件开发环境的参考模型(ECMA,90年初提出): 数据存储服务用于命名和管理实体,建立它们之间的联系,通常由对象管理系统实现; 数据集成服务扩展了数据存储服务,包括:版本管理、配置管理、查询服务、状态控制、数据交 换等服务,以适应于软件开发; 任务管理服务完成任务定义、任务执行、事务恢复、事件监视、角色管理以及任务历史信息管理 等工作; 信息服务 提供软件工具与软件环境间的通信服务,包括:消息传递、工具注册; 用户界面服务支持用户界面的集成国内CASE的例子北大青鸟:数据集成/界面集成/控制集成 今后软件工程的发现:方法学+CASE工具,3.4 软件工程的工具和环境,计算机辅助开发方法(CIS),休 息,本章结束,谢谢大家! 下章介绍:软件企业的现代软件工程实践,