850 likes | 974 Views
第四章 面向对象分析. 学习目标 : 了解面向对象技术,理解其中的重要概念; 了解统一建模语言,理解 UML 的有关概念; 掌握面向对象分析的步骤、方法; 熟悉用例建模、类建模和动态建模; 了解在面向对象分析阶段的测试和度量方法; 面向对象分析阶段面临的挑战。. 4.1 面向对象方法概述. 4.1.1 什么是面向对象 1 .面向对象 面向对象方法( Object Oriented Method )的基本思想是从现实世界中客观存在的事物(即对象)出发,尽可能地运用人类的自然思维方式来构造软件系统。
E N D
第四章 面向对象分析 学习目标 : • 了解面向对象技术,理解其中的重要概念; • 了解统一建模语言,理解UML的有关概念; • 掌握面向对象分析的步骤、方法; • 熟悉用例建模、类建模和动态建模; • 了解在面向对象分析阶段的测试和度量方法; • 面向对象分析阶段面临的挑战。
4.1面向对象方法概述 4.1.1什么是面向对象 1.面向对象 面向对象方法(Object Oriented Method)的基本思想是从现实世界中客观存在的事物(即对象)出发,尽可能地运用人类的自然思维方式来构造软件系统。 面向对象技术(Object Oriented Technology)是基于面向对象思想的软件开发技术,是软件工程领域中的重要技术,它以对象为核心,用这种技术开发出的软件系统由对象组成。 概括地说,面向对象方法具有下述四个要点: (1)面向对象的软件系统是由对象组成的,软件中的
4.1面向对象方法概述 任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。 (2)具有相同数据和相同操作的对象可以归并为一个类,对象是对象类的一个实例。 (3)类可以派生出子类(又称为派生类),子类继承父类(又称为基类)的全部特性(数据和操作),又可以有自己的新特性。 (4) 对象之间通过消息传递相互联系。类具有封装性,其数据和操作等对外界是不可见的,外界只能通过消息请求进行某些操作,提供所需要的服务。 软件工程学家Codd和Yourdon认为,面向对象方法可以用下列方程式来概括: 面向对象=对象+类+继承+通信
4.1面向对象方法概述 2.面向对象技术的发展历史 面向对象方法起源于面向对象程序设计语言,后来才逐步形成了面向对象的分析和设计方法,其发展过程大体上经历了初始阶段、发展阶段和成熟阶段等过程。 (1)初始阶段 上世纪60年代末挪威奥斯陆大学和挪威计算中心共同研制的Simula语言是面向对象语言发展历史上的第一个里程碑,它首先引入了类的概念和继承机制,后来的一些著名面向对象编程语言(如Smalltalk、C++、Eiffel)都受到Simula的启发。
4.1面向对象方法概述 (2)发展阶段 从上世纪80年代中期到90年代,面向对象语言十分热门,大批比较实用的面向对象编程语言(OOPL:Object Oriented Programming Language)涌现出来,如C++、Objective-C、Object Pascal、CLOS(Common Lisp Object System)、Eiffel、Actor等,特别是C++语言已成为目前应用最广泛的OOPL。 (3)成熟阶段 在C++语言十分热门的时候,人们开始了对面向对象分析(OOA:Object Oriented Anlysis)的研究,进而延伸到面向对象设计(OOD:Object Oriented Design)。
4.1面向对象方法概述 4.1.2面向对象的基本概念 1. 对象(Object) 对象从不同的角度有不同的含义,我们针对系统开发来讨论对象的概念,其定义是:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,由一组属性和对这组属性进行操作的一组服务组成。在这里,属性和服务是构成对象的两个基本要素,其定义是:属性是用来描述对象静态特征的一个数据项。服务是用来描述对象动态特征(行为)的一个操作序列。 在这里,对象只描述客观事物本质的、与系统目标有关的特征,同时,对象是属性和服务的结合体,对象的属性值只能由这个对象的服务来读取和修改。
4.1面向对象方法概述 2. 类(Class) 类是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。类好比是一个对象模板,用它可以产生多个对象。类所代表的是一个抽象的概念或事物,在客观世界中实际存在的是类的实例,即对象。 3. 封装(Encapsulation) 封装是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐藏对象的内部细节。封装是面向对象方法的一个重要原则,系统中把对象看成是属性和对象的结合体,使对象能集中而完整地描述一个具体事物。封装的信息隐蔽作用反映了事物的相对独立性,只需要了解对象所呈现的外部行为(即做什么),而不必关心它的内部细节(即怎么做)。
4.1面向对象方法概述 与封装密切相关的概念是可见性,它是指对象的属性和服务允许对象外部存取和引用的程度。 4. 继承(Inheritance) 继承是指子类可以自动拥有父类的全部属性和服务。 一个类可以是多个父类的子类,它从多个父类中继承了属性与服务,这称为多继承(Multiple Inheritance)。 继承对于软件复用是十分有益的,如果将面向对象方法开发的类作为可复用构件,那么在开发新系统时可以直接复用这个类,还可以将其作为父类,通过继承而实现复用,从而大大扩展了复用的范围。
4.1面向对象方法概述 5. 消息(Message) 消息是对象发出的服务请求,一般包含提供服务的对象标识、服务标识、输入信息和应答信息等信息。通常,一个对象向另一个对象发出消息请求某项服务,接收消息的对象响应该消息,激发所要求的服务操作,并将操作结果返回给请求服务的对象。 面向对象技术的封装机制使对象各自独立,各司其职,消息通信则为它们提供了唯一合法的动态联系途径,使它们的行为能够相互配合,构成一个有机的运动的系统。 6. 结构与连接 任何事物之间都不是互相孤立,而是彼此联系的,并因此构成一个有机的整体。对象之间常见的联系包括:
4.1面向对象方法概述 分类关系,即一般与特殊结构; 组成关系,即整体与部分结构; 对象属性之间的静态联系,即实例连接; 对象行为之间的动态联系,即消息连接。 7. 多态性(Polymorphism) 多态性是指在父类中定义的属性或服务被子类继承后,可以具有不同的数据类型或表现出不同的行为。 在体现一般与特殊关系的一个类层次结构中,不同层次的类可以共享一个操作,但却有各自不同的实现。当一个对象接收到一个请求时,它根据其所属的类,动态地选用在该类中定义的操作。
4.1面向对象方法概述 多态性机制不但为软件的结构设计提供了灵活性,减少了信息冗余,明显提高了软件的可复用性和可扩充性。多态性的实现需要OOPL提供相应的支持,与多态性实现有关的语言功能包括:重载、动态绑定、类属。 8. 主动对象(Active Object) 主动对象是一组属性和一组服务的封装体,其中至少有一个服务不需要接收消息就能主动执行(称为主动服务)。 主动对象的作用是描述问题域中具有主动行为的事物以及在系统设计时识别的任务,其主动服务描述相应任务所应完成的操作。在系统实现阶段,主动服务应该被实现为一个能并发执行的、主动的程序单位,如进程或线程。
4.2 UML概述 UML(Unified Modeling Language,统一建模语言),是一种面向对象的建模语言,它的主要作用是帮助用户对软件系统进行面向对象的描述和建模。建模是通过将用户的业务需求映射为代码,保证代码满足这些需求,并能方便地回溯需求的过程,它可以描述这个软件开发过程从需求分析直到实现和测试的全过程。 4.2.1 UML的组成 UML由视图、图、模型元素和通用机制等几个部分组成。 视图是表达系统的某一方面特征的UML建模元素的子集,由多个图构成,是在某一个抽象层上,对系统的抽象描述。
4.2 UML概述 图是模型元素集的图形表示,通常由弧(关系)和顶点(其他模型元素)相互链接构成的。 模型元素代表面向对象中的类、对象、消息和关系等概念,是构成图的最基本的常用概念。 通用机制用于表示其他信息,比如注释、模型元素的语义等。另外,UML还提供扩充机制,使UML语言能适应一个特殊的方法(或过程),或扩充至一个组织或用户。 4.2.2 UML中的模型元素 UML用来描述模型的内容有3种,分别是事物、关系和图。事物是UML中重要的组成部分,它是模型中最具有代表性的成分的抽象。关系把事物联系在一起,组成有意义的结构模型。每一个模型元素都有一个与之对应的图形元素,
4.2 UML概述 这种图形表示使UML的模型图形化。 事物主要有四种:结构事物、行为事物、组织事物和辅助事物,具体描述如下。 1. 结构事物 结构事物是模型中的静态部分,描述概念或物理元素,主要有7种,分别是类、接口、协作、用例、活动类、组件和节点。 (1)类(Class) 类是具有相同属性、相同方法、相同语义和相同关系的一组对象的集合。在UML图中,类通常用一个矩形来表示。如图4.1所示。
4.2 UML概述 (2)接口(Interface) 接口是指类或组件所提供的、可以完成特定功能的一组操作的集合,换句话,接口描述了类或组件对外的、可见的动作。通常,一个类实现一个或多个接口。在UML图中,接口通常用一个圆形来表示,如图4.2所示: 图4.1 UML图中类的描述 图4.2 UML图中接口的描述
4.2 UML概述 (3)协作(Collaboration) 协作定义了交互的操作,表示一些角色和其他元素一起工作,提供一些合作的动作。在ULM图中,协作通常用一个虚线椭圆来表示,如图4.3所示: 图4.3 UML图中协作的描述
4.2 UML概述 (4)用例(Use Case) 用例定义了系统执行的一组操作,对特定的用户产生可以观察的结果。在UML图中,用例通常用一个实线椭圆来表示,如图4.4所示。 图4.4 UML图中用例的描述
4.2 UML概述 (5)活动类(Actives Class) 活动类是对拥有线程并可发起控制活动的对象(往往称为主动对象)的抽象。在UML图中,活动类的表示方法与普通类的表示方法相似,也是使用一个矩形,只是最外面的边框使用粗线,如图4.5所示。 图4.5 UML图中活动类的描述
4.2 UML概述 (6)组件(Component) 组件是物理上可替换的,实现了一个或多个接口的系统元素。在UML图中,组件的表示方法比较复杂,如图4.6所示。 图4.6 UML图中组件的描述
4.2 UML概述 (7)节点(Node) 节点是一个物理元素,它在运行时存在,代表一个可计算的资源,比如一台数据库服务器。在UML图中,节点使用一个立方体来表示,如图4.7所示。 图4.7 UML图中节点的描述
4.2 UML概述 2. 行为事物(Behavior Things) 行为事物是模型中的动态部分,是一种跨越时间、空间的行为,主要有两种:交互和状态机。 (1)交互(Interaction) 在UML图中,交互的消息通常画成带箭头的直线,如图4.8所示。 图4.8 UML图中交互的描述
4.2 UML概述 (2)状态机(State Machine) 状态机是对象的一个或多个状态集合。在UML图中,状态机通常用一个圆角矩形来表示,如图4.9所示。 图4.9 UML图中状态机的描述 3. 组织事物(Grouping Things) 组织事物是UML模型中负责分组的部分,可以把它看作是一个个盒子,每个盒子里面的对象关系相对复杂,而盒子与盒子之间的关系相对简单。组织事物只有一种,称为包。
4.2 UML概述 包是一种有组织地将一系列元素分组的机制。包与组件的最大区别在于,包纯粹是一种概念上的东西,仅仅存在于开发阶段结束之前,而组件是一种物理元素,存在于运行时。在UML图中,包通常表示为一个类似文件夹的符号,如图4.10所示。 图4.10 UML图中包的描述
4.2 UML概述 4.辅助事物(Annotation Things) 辅助事物也称注释事物,属于这一类的只有注释。在UML图中,一般表示为折起一角的矩形,如图4.11所示。 UML中的关系(Relationships)包含四种:关联关系、依赖关系、泛化关系和实现关系。 图4.11 UML图中注释的描述
4.2 UML概述 1. 关联关系(Association) 关联关系是一种结构化的关系,指一种对象和另一种对象有联系。如图4.12所示: 图4.12 UML图中关联关系的描述 2. 依赖关系 对于两个对象X、Y,如果对象X发生变化,可能会引起对另一个对象Y的变化,则称Y依赖X。如图4.13所示:
4.2 UML概述 图4.13 UML图中依赖关系的描述 3. 泛化关系(Generalization) UML中泛化关系定义了一般元素和特殊元素之间的分类关系。如图4.14所示: 图4.14 UML图中泛化关系的描述
4.2 UML概述 4. 实现关系 实现关系将一种模型元素(如类)与另一种模型元素(如接口)连接起来,其中接口只是行为的说明而不是结构或者实现。如图4.15所示: 图4.15 UML图中泛化关系的描述
4.2 UML概述 4.2.3 UML中的图 本小节将详述在面向对象分析与建模中常用的9种图。根据它们在不同架构视图的应用,可以把9种图分成分为三类: (1)结构图:类图,对象图,组件图,部署图; (2)行为图:用例图、活动图和状态图; (3)交互图:序列图,协作图。 1. 结构图 系统分析与建模过程中,结构图用来描述系统静态的部分,经常使用的结构图有4中:类图、对象图、组件图和部署图。 (1)类图(Class Diagram)
4.2 UML概述 类图展示了一组类、接口和协作及它们之间的关系,在建模中所建立的最常见的图就是类图。用类图说明系统的静态设计视图,包含主动类的类图——专注于系统的静态进程视图。系统可有几个类图,单个类图仅表达了系统的一个方面。一般在高层给出类的主要职责,在低层给出类的属性和操作。类图如图4.16所示: 图4.16 类图
4.2 UML概述 (2)对象图(Object Diagram) 对象图展示了一组对象及它们之间的关系。用对象图说明类图中所反应的事物实例的数据结构和静态快照。对象图表达了系统的静态设计视图或静态过程视图,除了现实和原型方面的因素外,它与类图的作用是相同的。对象图如图4.17所示: 图4.17 对象图
4.2 UML概述 (3)组件图(Component Diagram) 又称构件图,展现了一组组件之间的组织和依赖,用于对原代码、可执行的发布、物理数据库和可调整的系统建模。组件图的例子如图4.18所示。 图4.18 组件图
4.2 UML概述 4)部署图(Deployment Diagram) 部署图是说明系统结构的静态部署图,即说明分布、交付和安装的物理系统。部署图的例子如下图4.19所示: 图4.19 部署图
4.2 UML概述 2. 行为图 行为图用来描述系统的动态部分,本小节将介绍3种行为图,分别是:用例图、状态图和活动图。 (1)用例图(Use Case Diagram) 用例图展现了一组用例、参与者以及它们间的关系。可以用用例图描述系统静态使用的情况。在对系统行为组织的建模方面,用例图是相当重要的。用图例如图4.20所示。
4.2 UML概述 图4.20 用例图
4.2 UML概述 (2)状态图(State Machine Diagram) 状态图展示了一个特定对象的所有可能状态以及由各种事件的发生而引起的状态间的转移。状态图如图4.21所示。
4.2 UML概述 图4.21 状态图
4.2 UML概述 (3)活动图(Activity Diagram) 活动图显示了系统中从一个活动到另一个活动的流程。活动图显示了一些活动,强调的是对象之间的流程控制。活动图如图4.22所示。 图4.22 活动图
4.2 UML概述 3. 交互图 交互图描述系统中对象之间的交互,本小节将介绍2种交互图,分别是:序列图和协作图。 (1)序列图(Sequence Diagram) 序列图展现了一组对象和由这组对象收发的消息,用于按时间顺序对控制流进行建模。序列图是一种强调消息的时序交互图,它由活动者(Actor)、对象(Object)、消息(Message)、生命线(Lifeline)和控制焦点(Focus of control)组成。序列图的例子如图4.23。
4.2 UML概述 图4.23 序列图
4.2 UML概述 (2)协作图(Collaboration Diagram) 协作图展现了一组对象间的连接以及这组对象收发的消息。它强调收发消息对象的组织结构,按组织结构对控制流建模。协作图的例子如图4.24所示。 图4.24 协作图
4.2 UML概述 4.2.4 UML中的视图 UML是用来描述模型的,用模型来描述系统的结构或静态特征,以及行为或动态特征。从不同的视角为系统构架建模,形成系统的不同视图。 用例视图(Use Case View),强调从用户的角度看到的或需要的系统功能,是被称为参与者的外部用户所能观察到的系统功能的模型图。 逻辑视图(Logical View),展现系统的静态或结构组成及特征,也称为结构模型视图(Structure Model View)或静态视图(Static View)。
4.2 UML概述 • 并发视图(Concurrent View),体现了系统的动态或行为特征,也称为行为模型视图(Behavioral Model View)或动态视图(Dynamic View)。 • 组件视图(Component View),体现了系统实现的结构和行为特征,也称为实现模型视图(Implementation Model View)。 • 配置视图(Deployment View),体现了系统实现环境的结构和行为特征,也称为环境模型视图(Environment Model View)或物理视图(Physical View)。
4.3面向对象分析 4.3.1面向对象分析概述 面向对象分析(OOA)是关于面向对象范型的一个半形式化规格说明技术。因为OOA每项技术的一个本质上固有的部分是与该项技术有关的图形表示法,因此,学习使用某项技术就是学习该技术相应的图形表示法。 1.OOA的主要任务 首先要理解用户的需求,然后进行分析,提取类和对象,并结合分析进行建模。其基本步骤是标识类,定义属性和方法;刻画类的层次;表示对象以及对象与对象间的关系;对对象的行为建模。这些步骤可反复进行,直到完成建模,实现以下目标:
4.3面向对象分析 (1)模型必须包含对一个软件应该做什么的一个全面的描述。 (2)模型必须将任何一个对分析人员理解应用领域需求而言是重要的人、物理事物和概念表示出来。 (3)模型必须显示这些人、事物和概念之间的联系和交互。 (4)模型必须足够详细地显示业务情景以便评价可能的设计。 (5)理想的状态是,模型对后续的软件设计而言是有帮助的。 2.面向对象分析的步骤 面向对象分析过程主要由三个活动组成,
4.3面向对象分析 即用例建模、类建模和行为建模。 (1)用例建模 用例建模是建立以用例模型为主体的需求模型。当软件开发小组获得软件需求后,分析员可以据此建立一组场景。用一个用例图描述一组相似事物场景。这个步骤有时称为功能建模,因为主要是面向行为的。 (2)类建模 确定类和它们的属性,以及类间的相互关系和交互作用。用类图的形式表示上述信息。这个步骤主要是面向数据的。 (3)行为建模 确定由每个类或子类发出的或对它们进行的行为(动作)。以一个某种程度上与有限状态机相似的图的形式表示
4.3面向对象分析 这个信息,称为状态图,这个步骤也是面向行为的。 在实践中,这三个活动不是纯粹顺序执行的。一个图的变化将相应引起另外两个图的修改。这样,从效果上看,OOA的三个活动是并行进行的。从这个角度来看,数据和行为都不能优先于另一方,保证了设计过程中对数据和行为得到同等的重视。 4.3.2用例建模 用例是从用户的角度出发来描述系统的功能。用例图用于展示系统将提供什么样的功能,以及用户将如何与系统交互来使用这些功能。下面以开放实验室管理系统中的实验预约子系统为例说明用例建模。
4.3面向对象分析 1.编写用例 首先是提供开始编写用例所需要的信息。定义问题的范围,说明整体的操作目标,概述所有已知的功能需求,描述系统将处理的信息。 2.用例图 图形化的表示可以促进理解,尤其是当场景比较复杂时。 用例模型从用户的角度描述了系统如何帮助他们完成其任务。为了设计软件来实现这些需求,分析人员还需要深入地分析,并将正确的和无歧义地对用户需求的理解传达给那些将来设计和构建软件的人。这种深入的分析工作是通过建立一系列的模型来实现的。仅采用用例建模是无法实现上述目标的,需要在用例建模的基础上进行类建模。
4.3面向对象分析 4.3.3类建模 类建模就是实现一个用例,它的任务是识别一组可能的类,理解这些类如何通过交互来实现这个用例的功能。一组类被称为一个协作。图4.27描述了一个协作的简单表示,说明了一个协作对应着一个用例的实现。 图4.27 实验预约协作图1
4.3面向对象分析 图4.28给出了这个协作的更加细致地描述,显示出了协作的组成对象和它们之间的连线。对象交互的细节不需要在协作中给出。通信图是描述协作内部细节的有用的视图,它明确地显示出了对象的交互。 图4.28 实验预约协作图2
4.3面向对象分析 图4.29在图4.28所表示的协作上增加了交互,显示了组成协作的对象间的通信。在通信图中,交互以对象间消息的形式表示。