软件工程基本概念
软件危机
软件的功能、规模及复杂性与日俱增,软件的复杂性达到了它的开发者难以控制的程度
这种情况导致了严重的后果: 软件可靠性下降 开发效率低下 维护极为困难
这使软件开发者陷入困境,人们称之为“软件危机”
解决软件危机
软件开发行业的研究
1. 程序设计方法学的研究
结构化程序设计方法
面向对象程序设计方法
2. 软件工程学的研究
用工程学的方法进行软件的开发与维护,并对软件生产过程进行工程化的管理
3. 其它方面
并发程序设计
数据结构与算法
编程语言 ……
软件工程的定义
概括地说,软件工程是指导计算机软件开发和维护的一门工程学科。采用工程化的方法来开发和维护软件,把经过时间考验而证明正确的工程管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
软件工程的内容
针对软件生命周期全过程及其每个具体阶段的工程方法、技术细则、文档规范、技术支持、管理制度、人员组织以及质量保证体系等。每个软件开发者必须按工程的统一要求行事,不能随意地自由发挥。每个开发阶段都要产生健全的、符合工程规范的文档。软件产品是这些文档的总合,而不仅仅是程序。
软件工程三要素
1. 方法:完成软件开发的各项任务的技术方法,为软件开发提供 “如何做” 的技术
2. 工具:为运用方法而提供的自动的或半自动的软件工程的支撑环境
3. 过程:为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤,如何将软件工程方法与软件工具相结合,合理、及时地进行软件开发
我们在项目中采用的方法、工具、过程
方法:面向对象方法
工具:EA
过程:基于原型的增量迭代软件开发过程
软件生命周期(一)
1. 可行性分析阶段
本阶段的主要任务:系统分析员在用户的配合下对用户的要求和现有的环境进行深入调查并写出调研报告,从经济可行性、技术可行性、操作可行性、法律可行性等方面研究并论证该项目的可行性,即该项目是否值得去做,是否存在可行的解决办法。
本阶段的主要成果:可行性分析报告。
2. 需求分析阶段
本阶段的主要任务:系统分析员和用户反复讨论和商量,充分交流信息,确定待开发的软件系统“做什么”,确定软件系统的功能需求和非功能需求,用某种方法和工具构件软件系统模型,并编写软件需求规格说明书。
本阶段的主要成果:软件需求规格说明书(Software Requirements Specification,即SRS)。
软件生命周期(二)
3. 系统设计阶段
本阶段的主要任务:根据需求分析阶段确定的功能需求和非功能需求,对整个系统进行总体框架设计、详细功能设计和数据库设计等。简单来说,需求分析阶段回答“做什么”的问题,而系统设计阶段要回答“怎么做”的问题。设计阶段又分为概要设计和详细设计。概要设计是以需求分析的结果为依据定义系统的主要构成成分和它们之间的关系。而详细设计是定义每个系统成分内部的构造细节。
本阶段的主要成果:概要设计说明、详细设计说明书、数据库设计说明书。
4. 系统实现阶段: 通常也称为编码阶段。
本阶段的主要任务:根据详细设计说明书,用某种选定的程序设计语言把详细设计的结果转化成机器可运行的源代码,这是一个编写和调试程序的过程。
本阶段的主要成果:通过单元测试的源代码。
软件生命周期(三)
5. 测试阶段
本阶段的主要任务:通过各种软件测试方法和测试工具,使软件的Bug降到最低。
本阶段的主要成果:软件测试报告。
6. 维护阶段
本阶段的主要任务:通过各种必要的维护活动使系统持久地满足用户的需要。
通常维护活动有四类:
改正性维护:诊断和改正系统使用过程中发现的软件错误。
适应性维护:修改软件以适应环境的变化。
完善性维护:根据用户的要求改进或扩充软件使它更完善。
预防性维护:即修改软件为将来的维护活动做准备。
本阶段的主要成果:软件问题报告、软件变动记录、软件维护记录。
软件开发过程
软件开发过程是在软件生命周期的软件系统开发过程中,一系列活动和软件生成结果的集合。软件过程模型描述软件开发过程的各项活动、角色、产品及其相互关系的模型。
目前有若干软件过程模型,各种模型有其不同的特点,并适用于不同的开发方法。例如,瀑布模型、循环模型、螺旋模型、增量模型和喷泉模型等。
不同的软件开发方法和软件开发模型要求有不同的工程体系。从历史看,使用最多的是结构化方法和瀑布模型。代表当前技术主流的是面向对象方法和喷泉模型。
统一建模语言UML
如同盖一座高楼大厦需要先画建筑图建立模型一样,在软件系统开发的系统分析和设计阶段时,我们通常会使用建模技术为系统建立模型。在软件工程发展过程中,出现了很多建模技术。最终,IBM的统一建模语言UML成为业界认同的统一建模技术。
统一建模语言UML(Unified Modeling Language)是专门用来进行软件系统设计和架构建模的一门可视化建模语言,它通过各种图示展示了软件系统的方方面面。
UML图有很多种,对于程序员来说,最频繁使用的莫过于类图。类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。类图中最基本的元素是类、接口。软件设计师设计出类图后,程序员就可以用代码实现类图中包含的内容。
使用类图表示关系
类和类、类和接口、接口和接口之间存在一定关系,共有六种类型:分别是实现关系、泛化关系、关联关系、依赖关系、聚合关系、组合关系,
1. 实现关系是指接口及其实现类之间的关系。
2. 泛化关系(Generalization)是指对象与对象之间的继承关系。
3. 关联关系(Association)是指对象和对象之间的连接,它使一个对象知道另一个对象的属性和方法。在Java中,关联关系的代码表现形式为一个对象含有另一个对象的引用。 关联关系有单向关联和双向关联。
4. 依赖 (Dependency) 关系是一种弱关联关系。依赖关系在Java中的具体代码表现形式为B为A的构造器或方法中的局部变量、方法或构造器的参数、方法的返回值,或者A调用B的静态方法。
5. 聚合(Aggregation)是关联关系的一种特例,它体现的是整体与部分的拥有关系,即“has a”的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享,所以聚合关系也常称为共享关系。(比如:部门和员工)
6. 组合(Composition)也是关联关系的一种特例,它同样体现整体与部分间的包含关系,即“contains a”的关系。但此时整体与部分是不可分的,部分也不能给其它整体共享,作为整体的对象负责部分的对象的生命周期。这种关系比聚合更强,也称为强聚合。(比如:公司和部门)
面向对象系统分析与设计
在面向对象技术中,建造整个软件系统的过程常常被称为面向对象的分析和设计(Object-Oriented Analysis and Design,OOAD)。对于我们要开发的软件系统来说,OOAD解决了系统是什么(面向对象的系统分析,即OOA)以及如何做的问题(面向对象的系统设计,即OOD),OOP只是用编程语言去实现该系统。
一般来说,OOAD工作一般由需求分析师、系统分析员、系统架构师来完成,而OOP则由程序员来完成。但是,对于程序员来说,掌握OOD技术,对于编写高质量的代码以及个人技术成长和职业规划来说,有特别重要的意义。