面向对象方法综述

陈小群博士

[返回]

  八十年代末以来,随着面向对象技术成为研究的热点出现了几十种支持软件开发的面向对象方法。其中,Booch, Coad/Yourdon, OMT, 和Jacobson的方法在面向对象软件开发界得到了广泛的认可。特别值得一提的是统一的建模语言UML
(Unified Modeling Language),该方法结合了Booch, OMT, 和Jacobson方法
的优点,统一了符号体系,并从其它的方法和工程实践中吸收了许多经过实际检验的概念和技术。UML方法自去年提出后到现在已发展到1.1版,并已提交给对象管理集团OMG,申请成为面向对象方法的标准。

  面向对象方法都支持三种基本的活动:识别对象和类,描述对象和类之间的关系,以及通过描述每个类的功能定义对象的行为。

  为了发现对象和类,开发人员要在系统需求和系统分析的文档中查找名词和名词短语,包括可感知的事物(汽车、压力、传感器);角色(母亲、教师、政治家);事件(着陆、中断、请求);互相作用(借贷、开会、交叉);人员;场所;组织;设备;和地点。通过浏览使用系统的脚本发现重要的对象和其责任,是面向对象分析和设计过程的初期重要的技术。

  当重要的对象被发现后,通过一组互相关联的模型详细表示类之间的关系和对象的行为,这些模型从四个不同的侧面表示了软件的体系结构:静态逻辑、动态逻辑、静态物理和动态物理。

  静态逻辑模型描述实例化(类成员关系)、关联、聚集(整体/部分)、和一般化(继承)等关系。这被称为对象模型。一般化关系表示属性和方法的继承关系。定义对象模型的图形符号体系通常是从用于数据建模的实体关系图导出的。对设计十分重要的约束,如基数(一对一、一对多、多对多),也在对象模型中表示。

  动态逻辑模型描述对象之间的互相作用。互相作用通过一组协同的对象,对象之间消息的有序的序列,参与对象的可见性定义,来定义系统运行时的行为。Booch方法中的对象交互作用图被用来描述重要的互相作用,显示参与的对象和对象之间按时间排序的消息。可见性图用来描述互相作用中对象的可见性。对象的可见性定义了一个对象如何处于向它发送消息的方法的作用域之中。例如,它可以是方法的参数、局部变量、新的对象、或当前执行方法的对象的部分。

  静态物理模型通过模块描述代码的布局。动态物理模型描述软件的进程和线程体系结构。

以下章节我们将简要介绍上述面向对象方法,并对这些方法进行比较。

***********************************************************************

Booch方法的过程包括以下步骤:
  . 在给定的抽象层次上识别类和对象
  . 识别这些对象和类的语义
  . 识别这些类和对象之间的关系
  . 实现类和对象

  这四种活动不仅仅是一个简单的步骤序列,而是对系统的逻辑和物理视图不断细化的迭代和渐增的开发过程。

  类和对象的识别包括找出问题空间中关键的抽象和产生动态行为的重要机制。开发人员可以通过研究问题域的术语发现关键的抽象。语义的识别主要是建立前一阶段识别出的类和对象的含义。开发人员确定类的行为(即方法)和类及对象之间的互相作用(即行为的规范描述)。该阶段利用状态转移图描述对象的状态的模型,利用时态图(系统中的时态约束)和对象图(对象之间的互相作用)描述行为模型。

  在关系识别阶段描述静态和动态关系模型。这些关系包括使用、实例化、继承、关联和聚集等。类和对象之间的可见性也在此时确定。


  在类和对象的实现阶段要考虑如何用选定的编程语言实现,如何将类和对象组织成模块。

  在面向对象的设计方法中,Booch强调基于类和对象的系统逻辑视图与基于模块和进程的系统物理视图之间的区别。他还区别了系统的静态和动态模型。然而,他的方法偏向于系统的静态描述,对动态描述支持较少。

  Booch方法的力量在于其丰富的符号体系,包括:
  . 类图(类结构-静态视图)
  . 对象图(对象结构-静态视图)
  . 状态转移图(类结构-动态视图)
  . 时态图(对象结构-动态视图)
  . 模块图(模块体系结构)
  . 进程图(进程体系结构)

  用于类和对象建模的符号体系使用注释和不同的图符(如不同的箭头)表达详细的信息。Booch建议在设计的初期可以用符号体系的一个子集,随后不断添加细节。对每一个符号体系还有一个文本的形式,由每一个主要结构的描述模板组成。符号体系由大量的图符定义,但是,其语法和语义并没有严格地定义。

***********************************************************************

RumbaughOMT方法从三个视角描述系统,相应地提供了三种模型,对象模型,动态模型和功能模型。对象模型描述对象的静态结构和它们之间的关系。主要的概念包括:
  . 类
  . 属性
  . 操作
  . 继承
  . 关联(即关系)
  . 聚集

动态模型描述系统那些随时间变化的方面,其主要概念有:
  . 状态
  . 子状态和超状态
  . 事件
  . 行为
  . 活动

功能模型描述系统内部数据值的转换,其主要概念有:
  . 加工
  . 数据存储
  . 数据流
  . 控制流
  . 角色(源/潭)

该方法将开发过程分为四个阶段:
1 分析
  基于问题和用户需求的描述,建立现实世界的模型。分析阶段的产物有:
  . 问题描述
  . 对象模型=对象图+数据词典
  . 动态模型=状态图+全局事件流图
  . 功能模型=数据流图+约束

2 系统设计
  结合问题域的知识和目标系统的体系结构(求解域),将目标系统分解为子系统。

3 对象设计
  基于分析模型和求解域中的体系结构等添加的实现细节,完成系统设计。主要产物包括:
  . 细化的对象模型
  . 细化的动态模型
  . 细化的功能模型

4 实现
  将设计转换为特定的编程语言或硬件,同时保持可追踪性、灵活性和可扩展性。

***********************************************************************

Coad/Yourdon方法严格区分了面向对象分析OOA和面向对象设计OOD。该方法利用五个层次和活动定义和记录系统行为,输入和输出。这五个层次的活动包括:
  . 发现类及对象。描述如何发现类及对象。从应用领域开始识别类及对象,形成整个应用的基础,然后,据此分析系统的责任。
  . 识别结构。该阶段分为两个步骤。第一,识别一般-特殊结构,该结构捕获了识别出的类的层次结构;第二,识别整体-部分结构,该结构用来表示一个对象如何成为另一个对象的一部分,以及多个对象如何组装成更大的对象。
  . 定义主题。主题由一组类及对象组成,用于将类及对象模型划分为更大的单位,便于理解。
  . 定义属性。其中包括定义类的实例(对象)之间的实例连接。
  . 定义服务。其中包括定义对象之间的消息连接。

  在面向对象分析阶段,经过五个层次的活动后的结果是一个分成五个层次的问题域模型,包括主题、类及对象、结构、属性和服务五个层次,由类及对象图表示。五个层次活动的顺序并不重要。

面向对象设计模型需要进一步区分以下四个部分:
  .问题域部分(PDC)。面向对象分析的结果直接放入该部分。
  .人机交互部分(HIC)。这部分的活动包括对用户分类,描述人机交互的脚本,设计命令层次结构,设计详细的交互,生成用户界面的原型,定义HIC类。
  .任务管理部分(TMC)这部分的活动包括识别任务(进程)、任务所提供的服务、任务的优先级、进程是事件驱动还是时钟驱动、以及任务与其它进程和外界如何通信。
  .数据管理部分(DMC)。这一部分依赖于存储技术,是文件系统,还是关系数据库管理系统,还是面向对象数据库管理系统。

***********************************************************************

Jacobson方法与上述三种方法有所不同,它涉及到整个软件生命周期,包括需求分析、设计、实现和测试等四个阶段。需求分析和设计密切相关。需求分析阶段的活动包括定义潜在的角色(角色指使用系统的人和与系统互相作用的软、硬件环境),识别问题域中的对象和关系,基于需求规范说明和角色的需要发现use case,详细描述use case。设计阶段包括两个主要活动,从需求分析模型中发现设计对象,以及针对实现环境调整设计模型。第一个活动包括从use case的描述发现设计对象,并描述对象的属性、行为和关联。在这里还要把use case的行为分派给对象。

  在需求分析阶段的识别领域对象和关系的活动中,开发人员识别类、属性和关系。关系包括继承、熟悉(关联)、组成(聚集)和通信关联。定义use case的活动和识别设计对象的活动,两个活动共同完成行为的描述。Jacobson方法还将对象区分为语义对象(领域对象)、界面对象(如用户界面对象)和控制对象(处理界面对象和领域对象之间的控制)。

  在该方法中的一个关键概念就是use case。use case是指行为相关的事务(transaction)序列,该序列将由用户在与系统对话中执行。因此,每一个use case就是一个使用系统的方式,当用户给定一个输入,就执行一个use case的实例并引发执行属于该use case的一个事务。基于这种系统视图,Jacobson将use case模型与其它五种系统模型关联:
  . 领域对象模型。use case模型根据领域来表示。
  . 分析模型。use case模型通过分析来构造。
  . 设计模型。use case模型通过设计来具体化。
  . 实现模型。该模型依据具体化的设计来实现use case模型。
  . 测试模型。用来测试具体化的use case模型。
***********************************************************************

[返回]