《软件工程ppt09面向对象方法学引论课件.ppt》由会员分享,可在线阅读,更多相关《软件工程ppt09面向对象方法学引论课件.ppt(72页珍藏版)》请在三一办公上搜索。
1、第九章 面向对象方法学引论,面向对象方法学概述面向对象的基本概念面向对象建模对象模型 动态模型功能模型,面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。,面向对象方法学概述,1.面向对象方法学的要点,面向对象方法具有下述4个要点:认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。把所有对象都划分成各种对象类(简称为类,class),每个对象类都定义了一组数据和一组方法
2、。按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。对象彼此之间仅能通过传递消息互相联系。,面向对象就是运用对象、类、继承、封装、消息、结构与连接等面向对象的概念对问题进行分析、求解的系统开发技术,或者说,是以对象(类)为数据中心、对象之间的动态行为模式为运行机制的一种问题求解方法。用公式可表示为: 面向对象=对象+类+继承+封装+消息+结构与连接,也就是说,面向对象就是既使用对象又使用类和继承等机制,而且对象之间仅能通过传递消息实现彼此通信。如果仅使用对象和消息,则这种方法可以称为基于对象的(object-based)方法,而不能称为面
3、向对象的方法;如果进一步要求把所有对象都划分为类,则这种方法可称为基于类的(class-based)方法,但仍然不是面向对象的方法。只有同时使用对象、类、继承和消息的方法,才是真正面向对象的方法。,1)与人类习惯的思维方法一致 传统的程序设计技术是面向过程的设计方法,这种方法以算法为核心,把数据和过程作为相互独立的部分,数据代表问题空间中的客体,程序代码则用于处理这些数据。2) 稳定性好 传统的软件开发方法以算法为核心,开发过程基于功能分析和功能分解。用传统方法所建立起来的软件系统的结构紧密依赖于系统所要完成的功能,当功能需求发生变化时将引起软件结构的整体修改。事实上,用户需求变化大部分是针对
4、功能的,因此,这样的软件系统是不稳定的。,2.面向对象方法学的优点,3)可重用性好 用已有的零部件装配新的产品,是典型的重用技术,例如,可以用已有的预制件建筑一幢结构和外形都不同于从前的新大楼。重用是提高生产率的最主要的方法。4)较易开发大型软件产品 在开发大型软件产品时,组织开发人员的方法不恰当往往是出现问题的主要原因。用面向对象方法学开发软件时,构成软件系统的每个对象就像一个微型程序,有自己的数据、操作、功能和用途,因此,可以把一个大型软件产品分解成一系列本质上相互独立的小产品来处理。,5)可维护性好 用传统方法和面向过程语言开发出来的软件很难维护,是长期困扰人们的一个严重问题,是软件危机
5、的突出表现。由于下述因素的存在,使得用面向对象方法所开发的软件可维护性好:(1) 面向对象的软件稳定性比较好。(2) 面向对象的软件比较容易修改。(3) 面向对象的软件比较容易理解。(4) 易于测试和调试。,迭代是软件开发过程中普遍存在的一种内在属性。经验表明,软件过程各个阶段之间的迭代或一个阶段内各个工作步骤之间的迭代,在面向对象范型中比在结构化范型中更常见。“喷泉”这个词体现了面向对象软件开发过程迭代和无缝的特性。,喷泉模型,由描述该对象属性的数据以及可以对这些数据施加的所有操作封装在一起构成的统一体。对象可以作的操作表示它的动态行为,在面向对象分析和面向对象设计中,通常把对象的操作称为服
6、务或方法。,面向对象的基本概念,1、 对象,对象是人们要进行研究的任何事物,具体一点讲就是研究对象。它可以是有形实体,也可以是作用、事件、性能说明等,当然,如果朋友成为你研究的对象时,对象也可以是你的朋友。,2 )对象的定义目前,对对象所下的定义并不完全统一,人们从不同角度给出对象的不同定义。这些定义虽然形式不同,但基本含义是相同的。 (1) 定义1: 对象是具有相同状态的一组操作的集合。这个定义主要是从面向对象程序设计的角度看“对象”。(2) 定义2: 对象是对问题域中某个东西的抽象,这种抽象反映了系统保存有关这个东西的信息或与它交互的能力。也就是说,对象是对属性值和操作的封装。这个定义着重
7、从信息模拟的角度看待“对象”。,(3) 定义3: 对象=ID,MS,DS,MI。其中,ID是对象的标识或名字,MS是对象中的操作集合,DS是对象的数据结构,MI是对象受理的消息名集合(即对外接口)。这个定义是一个形式化的定义。从动态角度或对象的实现机制来看,对象是一台自动机。具有内部状态S,操作fi(i=1,2,n),且与操作fi对应的状态转换函数为gi(i=1,2,n)的一个对象,可以用下图所示的自动机来模拟。,3) 对象的特点以数据为中心。 对象是主动的。实现了数据封装。本质上具有并行性。模块独立性好。,3) 对象的状态和行为 对象有自身的状态,比如你的女朋友有她的姓名(张朋)、年龄(25
8、岁)、工作单位等状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为,比如“张朋跳槽到某公司”这个行为将使她的工作单位这个状态发生变化。,2、其他概念,1) 类(class)在面向对象的软件技术中,具有相同或相似性质的对象的抽象就是类。如桃树、李树、樟树等是具体的树,抽象之后得到“树”这个类。类具有属性,属性是状态的抽象,如一棵李树的高度是3米,樟树是10米,树则抽象出一个属性“高度”。类具有操作,它是对象行为的抽象。,类的结构 类的结构有两种,一种是“一般-具体”结构,如植物、树都是类,它们之间是抽象到具体的关系,即树是一种(is a)植物。还有一种就是“整体-部分”结构,如计
9、算机是类、CPU也是类,则计算机与CPU之间就是整体与部分的关系,即计算机有一个(has a)CPU。,实例(instance)实例就是由某个特定的类所描述的一个具体的对象。类是对具有相同属性和行为的一组相似的对象的抽象,类在现实世界中并不能真正存在。当使用“对象”这个术语时,既可以指一个具体的对象,也可以泛指一般的对象,但是,当使用“实例”这个术语时,必然是指一个具体的对象。,3)消息(message)消息就是要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明。即对象之间进行通信的构造。比如张朋是一个对象,上司发出一个出差通知消息:张朋出差到深圳。这样,相应的对象接收到这个消息就会
10、给予响应。通常,一个消息由下述3部分组成:接收消息的对象;张朋消息选择符(也称为消息名);出差通知零个或多个变元。张朋出差到深圳,4)方法(method)方法就是对象所能执行的操作,也就是类中所定义的服务。方法描述了对象执行操作的算法,响应消息的方法。在C+语言中把方法称为成员函数。 比如张朋是一个对象,上司发出一个消息:张朋出差到深圳。这样,相应的对象接收到这个消息就会给予响应,在这个消息中,张朋是对象名,出差到就是方法名,深圳就是参数。在类中操作的实现过程叫做方法。上面的出差到(某地)这个方法如何实现呢,就是买车票,乘车到某地。这个过程就是方法。,5)属性(attribute) 属性就是类
11、中所定义的数据,它是对客观世界实体所具有的性质的抽象。类的每个实例都有自己特有的属性值。在C+语言中把属性称为数据成员6)封装(encapsulation) 在面向对象的程序中,把数据和实现操作的代码集中起来放在对象内部。一个对象好像是一个不透明的黑盒子,表示对象状态的数据和实现操作的代码与局部数据,都被封装在黑盒子里面,从外面是看不见的,更不能从外面直接访问或修改这些数据和代码。,对象具有封装性的条件如下:(1) 有一个清晰的边界。所有私有数据和实现操作的代码都被封装在这个边界内,从外面看不见更不能直接访问。(2) 有确定的接口(即协议)。这些接口就是对象可以接受的消息,只能通过向对象发送消
12、息来使用它。(3) 受保护的内部实现。实现对象功能的细节(私有数据和代码)不能在定义该对象的类的范围外访问。,7)继承(inheritance)广义地说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们。在面向对象的软件技术中,继承是子类自动地共享基类中定义的数据和方法的机制。下图描绘了实现继承机制的原理:,8)多态性(polymorphism) 多态性是指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。 在C+语言中,多态性是通过虚函数来实现的。在类等级不同层次中可以说明名字、参数特征和返回值类型都相同的虚拟成员函数,而不同层次的类中的虚函数实现算
13、法各不相同。虚函数机制使得程序员能在一个类等级中使用相同函数的多个不同版本,在运行时刻才根据接收消息的对象所属于的类,决定到底执行哪个特定的版本,这称为动态联编,也叫滞后联编。,9)重载(overloading) 有两种重载:函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字;运算符重载是指同一个运算符可以施加于不同类型的操作数上面。当然,当参数特征不同或被操作数的类型不同时,实现函数的算法或运算符的语义是不相同的。 在C+语言中函数重载是通过静态联编(也叫先前联编)实现的。,所谓模型,就是为了理解事物而对事物作出的一种抽象,是对事物的一种无歧义的书面描述。通常,模型由
14、一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。为了开发复杂的软件系统,系统分析员应该从不同角度抽象出目标系统的特性,使用精确的表示方法构造系统的模型,验证模型是否满足用户对目标系统的需求,并在设计过程中逐渐把和实现有关的细节加进模型中,直至最终用程序实现模型。,面向对象建模,面向对象的建模分析从概念上分为二个层次。 问题分析:主要任务是收集并确认用户的需求信息,对实际问题进行功能分析和过程分析。 应用分析:主要任务是动态描述系统中对象的合法状态序列。,在对目标系统进行分析的初始阶段,面对大量模糊的、涉及众多专业领域的、错综复杂的信息,系统分析员往往感到无从下手
15、。模型提供了组织大量信息的一种有效机制。 通常,用户和领域专家可以通过快速建立的原型亲身体验,从而对系统模型进行更有效的审查。,1. 面向对象的模型面向对象的模型包括三个,它们分别是: 描述系统数据结构的对象模型。 描述系统控制结构的动态模型。 描述系统功能的功能模型。,对象模型表示静态的、结构化的系统的“数据”性质。它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。它从客观世界实体对象的关系角度来描述,表现了对象的相互关系。事实上,这个模型可以当作扩充的实体关系模型(E-R)。 面向对象方法强调围绕对象而不是围绕功能来构造系统。对象模型为建立动态模型和功能模型,提
16、供了实质性的框架。,对象模型,1.类图的基本符号,类图描述类及类与类之间的静态关系。类图是一种静态模型,它是创建其他UML图的基础。一个系统可以由多张类图来描述,一个类也可以出现在几张类图中。,1)定义类UML中类的图形符号为长方形,用两条横线把长方形分成上、中、下3个区域(下面两个区域可省略),3个区域分别放类的名字、属性和服务。,表示类的图,类名是一类对象的名字。命名是否恰当对系统的可理解性影响相当大,因此,为类命名时应该遵守以下几条准则:(1) 使用标准术语。例如,“交通信号灯”比“信号单元”这个名字好,“传送带”比“零件传送设备”好。(2) 使用具有确切含义的名词。例如,“库房”比“房
17、屋”或“存物场所”更确切。(3) 必要时用名词短语作名字。例如,“最小的领土单元”、“储藏室”、“公司员工”等都是比较恰当的名字。,2)定义属性UML描述属性的语法格式如下:可见性 属性名: 类型名=初值性质串属性的可见性(即可访问性)通常有下述3种:公有的(public)、私有的(private)和保护的(protected),分别用加号(+)、减号(-)和井号(#)表示。如果未声明可见性,则表示该属性的可见性尚未定义。注意,没有默认的可见性。属性名和类型名之间用冒号(:)分隔。类型名表示该属性的数据类型,它可以是基本数据类型,也可以是用户自定义的类型。,在创建类的实例时应给其属性赋值,如果
18、给某个属性定义了初值,则该初值可作为创建实例时这个属性的默认值。类型名和初值之间用等号(=)隔开。 用花括号括起来的性质串明确地列出该属性所有可能的取值。枚举类型的属性往往用性质串列出可以选用的枚举值,不同枚举值之间用逗号分隔。也可以用性质串说明属性的其他性质,例如,约束说明只读表明该属性是只读属性。,例如,“发货单”类的属性“管理员”,在UML类图中像下面那样描述:-管理员: String=“未定” 类的属性中还可以有一种能被该类所有对象共享的属性,称为类的作用域属性,也称为类变量。C+语言中的静态数据成员就是这样的属性。类变量在类图中表示为带下划线的属性,例如,发货单类的类变量“货单数”,
19、用来统计发货单的总数,在该类所有对象中这个属性的值都是一样的,下面是对这个属性的描述:-货单数: Integer,3)定义服务 服务也就是操作,UML描述操作的语法格式如下:可见性操作名(参数表): 返回值类型性质串操作可见性的定义方法与属性相同。参数表是用逗号分隔的形式参数的序列。描述一个参数的语法如下:参数名: 类型名=默认值,类图由类及类与类之间的关系组成。定义了类之后就可以定义类与类之间的各种关系了。类与类之间通常有关联、泛化(继承)、依赖和细化等4种关系。1)关联 关联表示两个类的对象之间存在某种语义上的联系。例如,作家使用计算机,我们就认为在作家和计算机之间存在某种语义连接,因此,
20、在类图中应该在作家类和计算机类之间建立关联关系。,2.表示关系的符号,(1) 普通关联 普通关联是最常见的关联关系,只要在类与类之间存在连接关系就可以用普通关联表示。普通关联的图示符号是连接两个类之间的直线。通常,关联是双向的,可在一个方向上为关联起一个名字,在另一个方向上起另一个名字(也可不起名字)。为避免混淆,在名字前面(或后面)加一个表示关联方向的黑三角。,在表示关联的直线两端可以写上重数(multiplicity),它表示该类有多少个对象与对方的一个对象连接。重数的表示方法通常有:01表示0到1个对象0*或*表示0到多个对象1+或1*表示1到多个对象115表示1到15个对象3表示3个对
21、象如果图中未明确标出关联的重数,则默认重数是1。,(2) 关联的角色 在任何关联中都会涉及到参与此关联的对象所扮演的角色(即起的作用),在某些情况下显式标明角色名有助于别人理解类图。例如,下图是一个递归关联(即一个类与它本身有关联关系)的例子。一个人与另一个人结婚,必然一个人扮演丈夫的角色,另一个人扮演妻子的角色。如果没有显式标出角色名,则意味着用类名作为角色名。,(3) 限定关联 限定关联通常用在一对多或多对多的关联关系中,可以把模型中的重数从一对多变成一对一,或从多对多简化成多对一。在类图中把限定词放在关联关系末端的一个小方框内。例如,某操作系统中一个目录下有许多文件,一个文件仅属于一个目
22、录,在一个目录内文件名确定了惟一一个文件。,(4) 关联类 为了说明关联的性质可能需要一些附加信息。可以引入一个关联类来记录这些信息。关联中的每个连接与关联类的一个对象相联系。关联类通过一条虚线与关联连接。例如,下图是一个电梯系统的类模型,队列就是电梯控制器类与电梯类的关联关系上的关联类。,(1) 共享聚集 如果在聚集关系中处于部分方的对象可同时参与多个处于整体方对象的构成,则该聚集称为共享聚集。例如,一个课题组包含许多成员,每个成员又可以是另一个课题组的成员,则课题组和成员之间是共享聚集关系,如下图所示。,2)聚集 聚集也称为聚合,是关联的特例。聚集表示类与类之间的关系是整体与部分的关系。两
23、种特殊的聚集关系分别是共享聚集和组合聚集。,(2) 组合聚集 如果部分类完全隶属于整体类,部分与整体共存,整体不存在了部分也会随之消失(或失去存在价值了),则该聚集称为组合聚集(简称为组成)。例如,在屏幕上打开一个窗口,它就由文本框、列表框、按钮和菜单组成,一旦关闭了窗口,各个组成部分也同时消失,窗口和它的组成部分之间存在着组合聚集关系。,3)泛化 UML中的泛化关系就是通常所说的继承关系,它是通用元素和具体元素之间的一种分类关系。具体元素完全拥有通用元素的信息,并且还可以附加一些其他信息。 在UML中,用一端为空心三角形的连线表示泛化关系,三角形的顶角紧挨着通用元素。 注意:泛化针对类型而不
24、针对实例,一个类可以继承另一个类,但一个对象不能继承另一个对象。泛化可进一步划分成普通泛化和受限泛化。,(1) 普通泛化普通泛化与继承基本相同。 没有具体对象的类称为抽象类。抽象类通常作为父类,用于描述其他类(子类)的公共属性和行为。,与抽象类相反的类是具体类,具体类有自己的对象,并且该类的操作都有具体的实现方法。,(2) 受限泛化 可以给泛化关系附加约束条件,以进一步说明该泛化关系的使用方法或扩充方法,这样的泛化关系称为受限泛化。预定义的约束有4种: 多重、不相交、完全和不完全。这些约束都是语义约束。多重继承指的是,一个子类可以同时多次继承同一个上层基类,例如下图中的水陆两用类继承了两次交通
25、工具类。,与多重继承相反的是不相交继承,即一个子类不能多次继承同一个基类(这样的基类相当于C+语言中的虚基类)。如果图中没有指定多重约束,则是不相交继承,一般的继承都是不相交继承。完全继承指的是父类的所有子类都已在类图中穷举出来了,图示符号是指定完全约束。不完全继承与完全继承恰好相反,父类的子类并没有都穷举出来,随着对问题理解的深入,可不断补充和维护,这为日后系统的扩充和维护带来很大方便。不完全继承是一般情况下默认的继承关系。,4)依赖和细化(1) 依赖关系 依赖关系描述两个模型元素(类、用例等)之间的语义连接关系: 其中一个模型元素是独立的,另一个模型元素不是独立的,它依赖于独立的模型元素,
26、如果独立的模型元素改变了,将影响依赖于它的模型元素。 在UML的类图中,用带箭头的虚线连接有依赖关系的两个类,箭头指向独立的类。在虚线上可以带一个版类标签,具体说明依赖的种类,例如,下图表示一个友元依赖关系,该关系使得B类的操作可以使用A类中私有的或保护的成员。,(2) 细化关系 当对同一个事物在不同抽象层次上描述时,这些描述之间具有细化关系。假设两个模型元素A和B描述同一个事物,它们的区别是抽象层次不同,如果B是在A的基础上的更详细的描述,则称B细化了A,或称A细化成了B。细化的图示符号为由元素B指向元素A的、一端为空心三角形的虚线,如图所示。,动态模型表示瞬时的、行为化的系统的“控制”性质
27、,它规定了对象模型中的对象的合法变化序列。描述了系统的涉及时序和改变的状态 一旦建立起对象模型之后,就需要考察对象的动态行为。所有对象都具有自己的生命周期(或称为运行周期)。对一个对象来说,生命周期由许多阶段组成,在每个特定阶段中,都有适合该对象的一组运行规律和行为规则,用以规范该对象的行为。生命周期中的阶段也就是对象的状态。,动态模型,状态是对对象属性值的一种抽象。各对象之间相互触发(即作用)就形成了一系列的状态变化。一个触发行为称作一个事件。对象对事件的响应,取决于接受该触发的对象当时所处的状态,响应包括改变自己的状态或者又形成一个新的触发行为。 状态有持续性,它占用一段时间间隔。状态与事
28、件密不可分,一个事件分开两个状态,一个状态隔开两个事件。事件表示时刻,状态代表时间间隔。通常,用UML提供的状态图来描绘对象的状态、触发状态转换的事件以及对象的行为。每个类的动态行为用一张状态图来描绘,各个类的状态图通过共享事件合并起来,从而构成系统的动态模型。也就是说,动态模型是基于事件共享而互相关联的一组状态图的集合。,状态图的表示方法,功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,因此更直接地反映了用户对目标系统的需求。 通常,功能模型由一组数据流图组成。在面向对象方法学中,数据流图远不如在结构分析、设计方法中那样重要。一般说来,与对象模型和动态模型比较起来,数据流图
29、并没有增加新的信息,但是,建立功能模型有助于软件开发人员更深入地理解问题域,改进和完善自己的设计。因此,不能完全忽视功能模型的作用。,功能模型,数据流图说明数据流是如何从外部输入、经过操作和内部存储输出到外部的。功能模型也包括对象模型中值的约束条件。功能模型说明对象模型中操作的含义、动态模型中动作的意义以及对象模型中约束的意义。相关的概念有数据流图中的处理、数据流、动作对象、数据存储对象等。数据流图的表示方法如下图所示。,数据流图的表示方法综上所述,功能模型定义“做什么”,动态模型定义“何时做”,而对象模型定义“对谁做”。,UML提供的用例图也是进行需求分析和建立功能模型的强有力工具。在UML
30、中把用用例图建立起来的系统模型称为用例模型。用例模型描述的是外部行为者(actor)所理解的系统功能。用例模型的建立是系统开发者和用户反复讨论的结果,它描述了开发者和用户对需求规格所达成的共识。,1. 用例图,一幅用例图包含的模型元素有系统、行为者、用例及用例之间的关系。下图是自动售货机系统的用例图。,1)系统 系统被看作是一个提供用例的黑盒子,内部如何工作、用例如何实现,这些对于建立用例模型来说都是不重要的。 代表系统的方框的边线表示系统的边界,用于划定系统的功能范围,定义了系统所具有的功能。描述该系统功能的用例置于方框内,代表外部实体的行为者置于方框外。2)用例 一个用例是可以被行为者感受
31、到的、系统的一个完整的功能。在UML中把用例定义成系统完成的一系列动作,动作的结果能被特定的行为者察觉到。这些动作除了完成系统内部的计算与工作外,还包括与一些行为者的通信。用例通过关联与行为者连接,关联指出一个用例与哪些行为者交互,这种交互是双向的。,用例具有下述特征:(1) 用例代表某些用户可见的功能,实现一个具体的用户目标;(2) 用例总是被行为者启动的,并向行为者提供可识别的值;(3) 用例必须是完整的。 用例的实例是系统的一种实际使用方法,通常把用例的实例称为脚本。脚本是系统的一次具体执行过程,例如,在自动售货机系统中,张三投入硬币购买矿泉水,系统收到钱后把矿泉水送出来,上述过程就是一
32、个脚本;李四投币买可乐,但是可乐已卖完了,于是系统给出提示信息并把钱退还给李四,这个过程是另一个脚本。,3)行为者 行为者是指与系统交互的人或其他系统,它代表外部实体。使用用例并且与系统交互的任何人或物都是行为者。 行为者代表一种角色,而不是某个具体的人或物。事实上,一个具体的人可以充当多种不同角色。 在用例图中用直线连接行为者和用例,表示两者之间交换信息,称为通信联系。行为者触发(激活)用例,并与用例交换信息。 实践表明,行为者对确定用例是非常有用的。面对一个大型、复杂的系统,要列出用例清单往往很困难,可以先列出行为者清单,再针对每个行为者列出它的用例。这样做可以比较容易地建立起用例模型。,
33、4) 用例之间的关系UML用例之间主要有扩展和使用两种关系,它们是泛化关系的两种不同形式。(1) 扩展关系 向一个用例中添加一些动作后构成了另一个用例,这两个用例之间的关系就是扩展关系,后者继承前者的一些行为,通常把后者称为扩展用例。例如,在自动售货机系统中,“售货”是一个基本的用例,如果顾客购买罐装饮料,售货功能完成得很顺利,但是,如果顾客要购买用纸杯装的散装饮料,则不能执行该用例提供的常规动作,而要做些改动。,(2) 使用关系当一个用例使用另一个用例时,这两个用例之间就构成了使用关系。一般说来,如果在若干个用例中有某些相同的动作,则可以把这些相同的动作提取出来单独构成一个用例(称为抽象用例
34、)。这样,当某个用例使用该抽象用例时,就好像这个用例包含了抽象用例中的所有动作。在用例图中,用例之间的使用关系用带版类使用的泛化关系表示。,含扩展和使用关系的用例图,几乎在任何情况下都需要使用用例,通过用例可以获取用户需求,规划和控制项目。获取用例是需求分析阶段的主要工作之一,而且是首先要做的工作。大部分用例将在项目的需求分析阶段产生,并且随着开发工作的深入还会发现更多用例,这些新发现的用例都应及时补充进已有的用例集中。用例集中的每个用例都是对系统的一个潜在的需求。一个用例模型由若干幅用例图组成。创建用例模型的工作包括: 定义系统,寻找行为者和用例,描述用例,定义用例之间的关系,确认模型。其中
35、,寻找行为者和用例是关键。,2. 用例建模,1) 寻找行为者为获取用例首先要找出系统的行为者,可以通过请系统的用户回答一些问题的办法来发现行为者。下述问题有助于发现行为者:谁将使用系统的主要功能(主行为者)?谁需要借助系统的支持来完成日常工作?谁来维护和管理系统(副行为者)?系统控制哪些硬件设备?系统需要与哪些其他系统交互?哪些人或系统对本系统产生的结果(值)感兴趣?,2)寻找用例一旦找到了行为者,就可通过请每个行为者回答下述问题来获取用例:行为者需系统提供哪些功能?行为者自身需要做什么?行为者是否需要读取、创建、删除、修改或存储系统中的某类信息?系统中发生的事件需要通知行为者吗?行为者需要通
36、知系统某些事情吗?从功能观点看,这些事件能做什么?行为者的日常工作是否因为系统的新功能而被简化或提高了效率?还有一些不是针对具体行为者而是针对整个系统的问题,也能帮助建模者发现用例,例如:系统需要哪些输入输出?输入来自何处?输出到哪里去?当前使用的系统(可能是人工系统)存在的主要问题是什么?,面向对象建模技术所建立的三种模型,分别从三个不同侧面描述了所要开发的系统。这三种模型相互补充、相互配合,使得我们对系统的认识更加全面:功能模型指明了系统应该“做什么”;动态模型明确规定了什么时候(即在何种状态下接受了什么事件的触发)做;对象模型则定义了做事情的实体。在面向对象方法学中,对象模型是最基本最重
37、要的,它为其他两种模型奠定了基础,我们依靠对象模型完成三种模型的集成。,3. 三种模型之间的关系,三种模型之间的关系:(1) 针对每个类建立的动态模型,描述了类实例的生命周期或运行周期。(2) 状态转换驱使行为发生,这些行为在数据流图中被映射成处理,在用例图中被映射成用例,它们同时与类图中的服务相对应。(3) 功能模型中的处理(或用例)对应于对象模型中的类所提供的服务。通常,复杂的处理(或用例)对应于复杂对象提供的服务,简单的处理(或用例)对应于更基本的对象提供的服务。有时一个处理(或用例)对应多个服务,也有一个服务对应多个处理(或用例)的时候。,(4) 数据流图中的数据存储,以及数据的源点/终点,通常是对象模型中的对象。(5) 数据流图中的数据流,往往是对象模型中对象的属性值,也可能是整个对象。(6) 用例图中的行为者,可能是对象模型中的对象。(7) 功能模型中的处理(或用例)可能产生动态模型中的事件。(8) 对象模型描述了数据流图中的数据流、数据存储以及数据源点/终点的结构。,