1、1,2,第7章 面向对象软件工程的概念,传统软件开发方法的局限性 面向对象的过程模型 面向对象的概念 几种面向对象方法 统一建模语言UML,3,7.1 传统软件开发方法的局限性,传统的软件工具、软件技术和抽象层次越来越难以适应大规模复杂软件系统的开发特点。软件能力问题已经成为制约软件发展的因素。软件工程自70年代以来,有力的推动了软件能力的解决。自顶向下的分析与设计的方法、软件项目的工程化管理、软件工具和开发环境、软件质量保证等都对软件的发展起了非常重要的作用。传统的软件开发方法在当时的软件工程中起了主导作用,随着系统复杂性、多变性增强,传统方法的缺陷就显露了出来:(1)面向过程为主。系统围绕
2、着由计算机来实现功能的复杂过程而建立,在分析和解决问题时与人们对现实世界的认识有一定差距。,4,(2)软件结构稳定性差。需求分析阶段重点是功能模型,难以彻底明确全部需求。设计阶段的软件体系结构是基于系统功能建立的。每个模块完成一个基本功能,多个模块的组合完成一个整体功能。一个模块的变动可能会影响到多个模块。用户的需求大多针对功能,功能的变化会引起体系结构的变化,不利于系统的维护。(3)软件开发的抽象力度小。解决问题的类型一般用于“输入-处理-输出”为核心的数据处理系统,不适应于复杂的实时、交互、事件驱动、分布式等新型应用的系统开发。(4)软件重用未能得到很好的解决。传统的方法一般从“零”开始开
3、发软件,数据与操作作为相互分离的实体来考虑,使软件的可复用性差。重用的实施仅仅是公用模块的调用。面向对象的封装性、继承性、多态性等特性支持软件重用且重用的粒度大。软件的重用导致更快地、高质量地开发软件,为软件工业化生产奠定基础。,5,传统方法数据与过程是分离的,过程1,输入,输出,过程2,过程3,数据实体,属于该对象 的数据,对象,处理数据的方法,消息,消息,对象把数据和处理数据的方法封状成一个单元,6,传统方法与面向对象方法的比较,面向对象方法 系统是交互对象的集合 对象与人或其它对象交互 对象发送与响应消息,传统方法 系统是过程的集合 过程与数据实体交互 过程接受输入并产生输出,7,7.2
4、 面向对象的过程模型,1、演化/并行模型 (p402)是Booch等人在90年代初建议的。该模型与第1章介绍的螺旋模型、增量模型相似。但强调: (1)对OO系统的分析和设计建模不在相同的抽象层次上进行。 (2)分析和设计可以并发地应用到独立的系统构件。,8,该模型每次迭代都要计划、工程和评估。每个计划都要调整进度以适应和本次迭代相关的变化。早期阶段迭代进行的分析与设计工作为了分离出OO模型中的所有重要元素;当工程工作不断进展时,产生软件的增量版本;在评估阶段对每个增量的评估其反馈将影响下一次计划活动及后续增量。 2、RUP98年6月推出,该过程强调了开发方法的统一、建模语言的统一、研究成果的统
5、一。该过程是基于构件的,即所构造的系统是由软件构件通过明确定义的接口相互连接所建造起来的。它使用UML来制定软件系统的所有蓝图。RUP的主要特点:(1)用例驱动用例作为系统分析、设计、实现和测试的基本输入。,9,即用例不只是一种确定系统需求的工具,它还能驱动系统的设计、实现和测试的进行。基于用例模型,开发人员可以创建一系列实现这些用例的设计模型和实现模型。开发人员可以审查每个后续建立的模型是否与用例模型一致。测试人员测试实现以确定实现模型的构件是否实现了用例。所以用例启动了开发过程,还使开发过程结合为一体。开发过程是沿着一系列从用例得到的工作流前进的。,10,下图显示了用例模型与其他模型之间的
6、相关性:,用例模型,由建立,分析模型,为系统描述一系列类,由设计,设计模型,为系统定义一系列子系统和界面,由实现,实现模型,将类映射到构件,由分配,测试模型,由验证,验证系统是否提供了用例模型中描述的功能,配置模型,定义软件分布,11,(2)以构架(Architecture)为中心软件系统的构架从不同角度描述了即将构造的系统,它刻画了系统的整体设计,去掉了细节部分,突出了系统的重要特征,包含了系统中最重要的静态结构和动态行为。构架是根据应用领域的需要逐渐发展起来的,并在用例中得到反映。每种产品都具有功能和表现形式,功能与用例对应,表现形式与构架对应。用例与构架是相互影响的,用例在实现时必须符合
7、于构架,构架必须预留空间以实现现在或将来所有需要的用例。,12,3、迭代与增量的过程迭代指工作流中的步骤,增量指产品中增加的部分。迭代过程要处理一组用例,这组用例合起来能扩展所开发产品的可用性,后续的迭代过程建立在前一次迭代过程末期所开发的产品上。构架提供了一种结构来指导迭代过程中的工作,用例则确定了目标并驱动每次迭代的工作。三条腿的凳子! 4、基于构件统一过程所构造的软件系统,是由软件构件通过明确定义的接口相互连接所建造起来的。 5、使用UML统一过程使用UML来制定软件系统的所有蓝图,UML是整个统一过程的一个完整部分,他们是共同发展起来的,它强调创建和维护模型。,13,6、过程可剪裁用统
8、一过程开发软件时,各阶段应该有多长?各个阶段迭代多少次是合适的?候选构架可以在哪一点完全建立起来?这些问题的答案取决于系统的规模、项目的性质、开发组织的领域经验,甚至包括相关人员有效配合程度。总之,统一过程是一个框架,可以根据具体情况加以裁剪,以此来适应各种各样的开发过程。,14,7.3 面向对象的概念,面向对象(Object Oriented,简称OO)的概念起源于20世纪60年代中期的Simula 67。80年代初,Smalltalk语言及其程序设计环境的出现成为面向对象技术发展的一个重要里程碑。80年代中期硬件的发展使C到C+过渡平滑,推出了相应工具及面向对象集成环境,使OOP模式进入主
9、流。80年代中后期,面向对象分析与设计的研究开始发展。进入90年代,面向对象软件工程成了许多软件产品的建造笵型。(1)对象(object)是现实世界中个体或事物的抽象表示。封装了其属性及相关的操作。属性表示对象的性质,属性值规定了对象所有可能的状态。对象的操作指出了该对象具有的行为并提供了对外的服务。,15,(2)类(class)是具有相同属性和相同操作的对象的抽象。通常用类名、类的属性、类的操作三方面的内容来定意一个类。一个具体对象是类的一个实例。(3)消息(message)是一个对象发送给另一个对象的操作请求。消息一般由三部分组成:对象名、消息名、参数。消息传递是对象与外部世界相互通信的唯
10、一途径。(4)方法(method)是对象操作的实现,描述了对象中操作的算法和响应消息的方式。,16,(5)继承(inheritance)是子类自动的共享其父类中定义的属性和操作的机制,该机制构成了类的层次结构。较高层的父类称为基类、超类、一般类。子类称为派生类、特殊类。子类除了继承父类的特征,还可有自己的特征。继承有传递性,子类能继承上层的全部特征。继承性使得相似的对象可以共享程序代码和数据结构,从而简化了创建类及对象的工作量,基类解决一般性问题,派生类解决特殊问题,提高了软件的可重用性。继承性还使得软件便于维护,当需要扩充软件原有功能时,从要修改的类中派生出一个子类,在该子类中添加新的代码。
11、,17,(6)多态(polymorphism)指在类的不同层次上可以使用相同的操作名。同一操作名可有不同的实现方式,运行时可动态地选择哪一个算法。多态性增加了软件的灵活性,可扩充性,通用功能的操作放在高层,不同地实现这一功能的行为放在低层,以实现不同的相应。,18,7.4 几种面向对象方法,20世纪80年代以来,出现了几十种面向对象软件开发方法。每一种都有自己的符号体系和开发过程,都支持以下基本活动: 标识类及对象 描述类及对象之间的关系 定义类的属性和操作1、Booch方法Booch是面向对象方法最早的提出者之一,提出了面向对象软件工程的概念。提出了“微开发过程”和“宏开发过程”的思想。,1
12、9,微开发过程:定义一组分析任务,包括标识类和对象以及类和对象的语义、定义类和对象间的关系、描述类和对象的动态行为。宏开发过程:将微过程反复应用,并包含了体系结构设计的计划活动: 将相似的对象聚集到独立的模块; 描述对象管理、内存管理、错误处理等其它功能的实施; 可使用原型对上述任务进行精化; 将同时执行的进程分配到不同的处理机。该方法提出建立以下模型:类图、对象图、状态转移图、时序图、模块图、进程图。,20,2、Coad/Yourdon方法著名的OOA/OOD方法,也是最早的面向对象的分析与设计方法之一。简单、易学。OOA阶段的任务: 标识类及对象 定义结构(一般特殊结构、整体部分结构) 划
13、分主题 定义属性及对象间的实例连接 定义服务及对象间的消息连接上述任务迭代进行,产生5个层次的问题域模型(主题层、类及对象层、结构层、属性层、服务层),21,OOD阶段的活动: 问题域部分 人机交互部分 任务管理部分 数据管理部分3、OMT方法Rumbaugh等人提出的对象建模技术(Object Model Technology, OMT),该方法强调了三种模型,并将软件开发过程划分为以下几个阶段:(1)系统分析 问题描述 建立对象模型 产品:对象模型对象图数据字典,22, 建立动态模型产品:动态模型状态图事件跟踪图 建立功能模型产品:功能模型数据流图约束(2)系统设计 将系统分解为各个子系统
14、 确定问题中固有的并发性 将各子系统分配给处理器 数据存储管理 全局资源管理 选择软件控制机制 边界条件处理,23,(3)对象设计对分析模型细化: 将三种模型结合起来以获得对象类上的操作。如功能模型中的加工,动态模型中对应一个事件的活动。 设计实现操作的算法 优化数据访问路径 实现系统设计中的控制机制 为提高继承而调整类结构 设计对象之间的关联 将类和关联集成到模块中,24,4、Jacobson方法也称OOSE方法。最大特点是强调使用实例(Use-Case),每一个用例就是一个使用系统的方式,用例的执行将引发执行一系列与行为相关的事务。该方法将用例贯穿于整个开发阶段,并在用例描述中引入了角色或
15、参与者(Actor)的概念。角色指使用系统的人以及与系统相互作用的软硬件环境。该方法还将对象区分为实体对象(业务对象)、接口对象(界面对象)和控制对象。需求分析阶段活动:定义潜在的角色、识别问题域中的对象和关系、基于需求规格说明和角色的需要描述用例。设计阶段的活动:从用例的描述中发现与设计有关的对象,并描述其属性、行为和关联。同时把所有用例的行为分派给每个对象。,25,7.5 统一建模语言UML,UML(Unified Modeling Language)产生于90年代中期。它不仅统一了Booch、OMT和OOSE方法中的概念和表示法,而且对其作了进一步扩展,最终成为在面向对象技术领域占主导地
16、位的、并被大众所接受的标准建模语言。1、UML概述UML的发展历程(下图)UML是一个通用的标准建模语言,可以对任何具有静态结构和动态行为的系统进行可视化建模。UML不是一个开发过程,也不是一个方法,但允许任何一种开发过程和面向对象方法使用它。,26,Booch93,OMT-2,UML 0.8,UML 0.9&0.91,UML 1.0,UML 1.1,UML同行 专家意见,OMG认证,10/95,10/96 & 9/96,OMG审核,1/97,OMG修正,9/97,OMG采纳为标准,11/97,UML 1.3,UML2.0,2001年重要修改,OOSE,UML开发历程,27,2、UML中的模型
17、视图UML有以下主要模型元素,构成了UML中的各种模型视图:,28, 用户模型视图用例图: 从用户的角度描述系统能提供哪些功能以及功能的使用者。 结构模型视图:类图:描述系统的静态结构;对 象图:描述系统在某个时刻的静态结构;包图:将类分组成更高层次的静态结构。 行为模型试图顺序图:按时间顺序描述系统元素之间的交互;协作图:从时间和空间的顺序描述系统元素之间的交互;状态图:描述系统元素对事件的响应引起的状态转换;活动图:描述系统元素的活动。 实现模型视图构件图:描述实现系统的元素的组织结构;配置图:描述环境元素的配置,并把实现系统的元素映射到配置上。,29,(1)用例图用例:根据Jacobso
18、n的定义,用例规定了一个动作序列,系统执行这些动作并产生出对于特定参与者可见的有价值的结果。参与者 可以是人、组织、硬件设备或外部系统。用例图用于展示参与者与系统提供的用例之间的连接(通信)关系。仅仅从参与者使用系统的角度描述系统,不反映内部的处理方式。因此用例图定义的是系统的功能需求。下图是某保险业务的用例图。,30,签定一份 保险单,客户,保险销 售人员,销售统计,客户统计,某保险业务的用例图,31,某金融贸易系统用例图,设置边界,风险分析,交易估价,进行交易,超越边界,更新帐目,评价,交易 人员,交易 经理,计帐 系统,销售员,extend,include,include,32,其中:
19、include、extend为用例图中可用的构造型元素, 表示“风险分析”和“交易估价”都包含有公共的“评价”动作,因此把“评价”作为一个独立的用例。而“超越边界”用例是“进行交易”用例的扩展,指交易时对某个特定用户规定了最大贸易量,不能执行一般的常规动作。因此,当描述一般行为时有例外、任选或异常处理时,采用extend;当在两个或多个用例中出现重复描述(有共用行为)而又想避免重复时,采用include。(2)类图用来描述系统中类和类之间的关系,是系统的静态结构。类图中还描述了类的属性、操作、以及对模型中各种成分的约束。类图包含有类、关联和关系等模型元素。见下图:,33,类名,属性,操作,类的
20、完整表示,类名,类的简单表示,类1,类2,角色,角色,关联名,关联表示类之间的语义联系(是运行时实例之间的关系)。角色表示该类在这个关联中的作用。关联中可以有重数,重数指一个角色可以有多少个对象来扮演。,类的表示:,类的关联(association):,34,公司,董事会,办公室,分配,员工,01,*,人员,董事会成员,0,38,*,董事会,同时省略关联名和角色名,默认关联名是has(有),省略重数默认11。,每一个员工可能没有或者只有一个办公室,每一个董事会没有或者有38个董事会成员(有角色名,可以省略关联名),35,在一些情况下关联可能需要记录一些信息,但这些信息不能放在任何一个类中,可引
21、入一个关联类记录这些信息。如下图:,学生,* 选修 *,课程,学生,* *,课程,选修成绩,学生,* 选修 *,成绩,课程,一个多对多关联。“成绩”属性不能放在任何一方(每个学生只有一个成绩或每门课程只有一个成绩),创建一个关联类来保存成绩,与带有关联类的多对多关联等价的两个一对多关联的图,36,整体类,部分类,整体类,部分类,项目,人员,1 *,建筑物,楼房,类的聚合,类的强聚合(组合),*,类的聚合(aggregation): 是表示“整体-部分”的特殊关联。,组合(composition)是一种强类型的聚合,整体类和部分类共存亡,如果整体类被撤销,部分类也不存在。部分类的存在只是为整体类
22、服务。,37,一般类,特殊类,人员,教师,学生,由一个超类和几个直接子类构成的结构通常称为泛化 。类的这种关系也称为一般-特殊关系或继承关系,将现实世界实体的共同特性抽象为一般类,通过增加独有的特性而成为各种特殊类。如图所示:,类的泛化(generalization):,下图是一个网上售货系统的部分类图。其中用括起来的内容是约束条件。UML提供了对类图中的基本成分可进行限制与约束的手段。,38,销售代表 0 1,定货,name address,顾客,creditRating( ):String,产品,雇员,1,dataReceived isPrepaid number:String price
23、:Money,协作顾客,contactName creditRating creditLimit,creditCard#,个人顾客,creditRating( ) =“poor”,定货作业线,dispatch( ) close( ),remind( ) billForMonth( ),Quantity:Integer price:Money isSatisfied:Boolean,1,*,*,*,*,1,物品,39,(3)对象图对象图是类的实例图,给出了存在于程序执行过程中某个特定点的对象与链接的配置示例。,对象名:类名,属性,对象名,:类名,对象1,对象2,链名,对象的三种描述方式,链的表示
24、,教师,讲授,课程,类图,李伟,编号3658职称教授,软件工程,编号401学分3,数据库,编号301学分3,对象图,40,其中,链是类图中关联的实例,类图中关联表示两个类之间可能存在的所有链接,而对象图中的链上不附加重数。对象图中也不可能包含泛化。对象图不像类图那样具有重要地位,通常用来实例化一个复杂的类图以分析特定的场景。对象图也常用在协作图中,反映一组对象之间的动态协作关系。(4)状态图状态图描述类的对象在生命周期内所有可能的状态以及事件发生时状态的转移(transition)情况。一个转移可以有一个与之相连的动作(action),这个动作指明了状态转移时应该作些什么。状态图是类图的补充。
25、不需要为所有的类画状态图,仅为那些有多个状态其行为受外界环境的影响并且发生改变的类画状态图。,41,在一楼,空闲,下降,到达一层,到达楼层,升楼层,电梯运行的状态图,开始,上,下降楼层,在大楼一层,到达楼层,上升楼层,超时,移到一层,上升,42,初态,终态,状态名,do/活动名,中间态,行驶,向前,向后,向前,向后,低速,高速,行驶,或关系子状态(只取一种),与关系子状态(某时刻可同时到达多个子状态), UML中的状态表示, 转移,状态1,do/活动1,状态2,do/活动2,事件条件 / 动作,其中:状态内部的“活动”不引起状态转移;箭头上的“动作”指状态转移时要执行的动作。,43,(5)顺序
26、图用来描述对象之间的动态协作关系以及协作过程中的先后次序。它常用来描述一个用例的行为,显示该用例中所涉及到的对象以及对象之间交互的时间顺序。每个对象图符下面的垂直虚线表示对象的生命线,每条对象生命线上的细长矩形表示该对象正处于活动时期,细长矩形底部的“”表示该对象被删除。对象生命线之间的带箭头连线表示对象之间的交互与通信,一般指消息传递并具有以下类型:简单消息,不考虑通信细节。同步消息,必须等待消息的返回。异步消息,不等待消息返回,继续执行。返回消息,同步消息激活的动作返回到发送对象的消息。消息泛指操作调用、信号传送、事件唤醒等。,44,:呼叫者,:交换机,:远程交换机,:受话者,拿起话筒,响
27、拨号声,拨号码,接通信号,响铃,铃响停止信号,拿起话筒,铃响停止,10 ,d,e,a,b,c,b-a1s,e-d5s,c-b10s,路由选择,接电话的顺序图,45,:计算机,:打印服务器,:打印机,:队列,打印( ),打印机空闲打印( ),打印机忙存储( ),打印结束( ),打印结束( ),用例“打印程序”的顺序图,46,(6)活动图活动图可有不同的抽象级别。既可以在企业业务模型中描述业务工作流,又可以描述满足一个用例要求所进行的活动及相应约束关系,还可以描述每个活动的具体操作步骤(相当于流程图)。主要图形元素: 泳道 活动图中用垂直分隔线划分成的纵向区域,说明由谁来完成该泳道中的任务。 起点
28、 活动图中所有活动的开始,用 表示。 终点 活动图中所有活动的结束,用 表示。可有几个终点。 活动 完成的任务或操作步骤,用圆角矩形表示。 决策 是特殊的活动,表示活动流程中的判断,用菱形表示。,47, 同步 表示活动之间的同步或并发,表示引入的信息流同时到达,引出的信息流同时被触发。同步用一条粗线表示,称为同步线。 业务对象 对象可以作为活动的输入或输出,即活动会改变对象的状态。用虚线箭头表示数据传送的方向。 转移 是活动之间的关系,由隐含事件引起活动转移。转移连接各个活动及各个特殊活动(起点、终点、决策、同步线等)。转移用带箭头的线表示,其上不标注事件和动作,可标注转移的条件。下面是两个活
29、动图示例:,48,顾客,售货,库房,请求服务,支付,收货,开订单,供货,交货,顾客购物的活动图,49,采购部经理,副总经理,协商采购协议,签定采购协议草案,采购协议草案 (待审),审批,通过否,生成正式采购协议,通知供货商,采购协议草案(未通过),正式采购协议(通过),通过,未通过,采购协议活动图,50,(7)协作图同对象图的画法一样,但强调对象之间的交互关系。同时不像顺序图那样侧重于某种特定情况下对象之间交互的时序。协作图中用箭头表示消息,并注明消息名称和可选参数。箭头附在有协作关系的每对对象的通信链上。在每个消息前加数字标明消息发送的顺序。下图是打印程序的协作图:,51,1.2:打印机忙
30、保存打印文件,:队列,:计算机,1.3:打印机空闲,打印文件,:打印机,:打印服务器,1:打印文件,协作图举例,52,(8)构件图构件可以是源代码文件、二进制文件或可执行文件。构件图用来说明这些构件之间在编译、链接或执行时的依赖关系,利用这种依赖关系能容易的分析一个构件的变化对其他构件的影响。以下是某教学管理的构件图,该图例中:,表示构件接口,对外提供可见的操作和属性,表示依赖关系,属性为.dll的构件为动态链接库中的构件。,53,教学管理.exe,课程,课程管理.dll,成绩管理.dll,人事管理.dll,开设课程,选课注册,教师,学生,构件接口,某一教学管理构件图,54,(9)配置图用来描
31、述系统中硬件设备的配置、通信以及在各硬件设备上软构件和对象的配置。能清楚地展示分布式系统运行时的体系结构。在该图中硬件设备称为结点,之间的连接为通信路径,连接上要标明通信协议或网络类型。下图是银行ATM系统的配置图。,55,局域网,Internet,ATM客户机,银行储户,ATM应用 服务器,ATM数据 服务器,ATM系统配置图:,客户管理,事务管理,帐务管理,56,(10)包图包是将类分组成更高层次的单位。包图用以描述包中存在的类以及包与包之间的依赖关系和泛化关系。包的内容可以是类的列表、类图、或另一个包图。依赖关系用虚线箭头表示。,保险单填写界面,内部系统,保险单,客户,数据库界面,Oracle界面,Sybase界面,某保险信息管理系统的包图,57,3、UML对软件开发过程的支持,58,用例图,输入新客户,创建新订单,订单,运货,客户,订单,客户,创建新订单的顺序图,核实客户,准备输入的项目,准备发运,订单类的状态图,几种视图之间的关系,59,习题,1、传统软件开发方法有什么缺陷? 2、解释面向对象软件开发过程的特点。 3、比较几种面向对象的软件开发方法。 4、UML是什么?如何支持软件开发过程。 5、UML中有哪些模型视图?各有什么特点?,