1、 面向对象的建模技术(OMT)以前,我们在用 Fortran、C 语言进行编程时实际上使用了一种叫做面向过程的程序设计方法,也就是所说的结构化方法。这种方法强调对系统功能进行抽象,系统功能的实现是通过对若干个模块的调用来完成的。历史已经证明这种方法在降低软件开发成本、提高软件生产率方面是一次失败的尝试。为什么呢?客观世界是一个对象的世界,人类对客观事物的认识又是一个由特殊到一般、一般到特殊的过程。而面向过程所能提供给我们的解决问题的方法却是“后一步的设计要满足前一步的要求” 。这种强调系统功能、一环套一环的设计方法使我们设计出来的软件模块仅仅是满足了特定的需求,并且在软件系统后期维护过程中它仅
2、能给程序员提供很小的活动空间。回首往事,除了仅有的几个数学函数外又有多少个所谓的模块可以真正地重用!又有多少位软件工程师在为自己所做的“遗憾工程”感到惋惜!这些主要是由于计算机求解的问题空间与解题的方法空间不一致,两种空间的映射量太大!当然产生上述问题的最根本的原因还应是冯.偌伊曼的计算机体系结构。面向对象的方法正是在上述背景下产生的。面向对象的方法认为:客观世界的问题都是由客观世界的实体及其相互之间的联系构成的。我们把客观世界的实体称为问题对象,那么对象都有自己的运动状态及运动规律,不同对象之间的相互作用和相互通信就构成了完整的客观世界。使用面向对象的方法人们可以逐步去解决问题,而在问题逐步
3、深入过程中不必去重新修改前面已完成的设计工作。由于采用了数据抽象和封装技术,面向对象的程序设计降低了各模块间的关联程度,这就相对减少了程序员之间的相互影响。这项技术是在设计初期只由有很少的程序员介入的情况下,通过在对象系统中建立一个高层次的通讯环境来实现的,它使得今后更改引起的成本大大降低。使用面向对象的方法详细定义用户的数据类型,将它们封装在一起又可实现较高的代码利用率。当今,计算机产业正朝着分布式处理、并行处理、网络化和软件生产工程化发展,而面向对象的方法是作为实施这些目标的关键技术之一。面向对象的方法中有一些重要的概念,它们是对象、封装、继承和多态等。 对象就是人们所感兴趣的任何事物,它
4、可以是有形的实体、某种作用及性能等。对象都有其运动状态和运动规律,因此对象具有很强的表达能力和描述功能。对象中包含数据和对数据操作的代码,它实现了数据和操作的结合。具有相同结构、操作并遵守相同约束规则的对象的集合就是类。 封装是一种组织软件的方法,它的基本思想是把客观世界中联系紧密的元素及相关操作组织在一起,构造具有独立含义的软件实现,使其相互关系隐藏在内部,而对外仅仅表现为与其它封装体间的接口关系。封装的目的就是信息隐匿。在面向对象的方法中,是通过对象/类来实现封装的。继承用于描述类之间的共同性质,它减少了相似类的重复说明。继承使得程序员对共同的操作及属性只说明一次,并且在具体的情况下可以扩
5、展细化这些属性及操作。多态性指相同的语言结构可以代表不同类型的实体或者对不同类型的实体进行操作。对于大多数面向对象的编程语言,在类的继承关系中有一种独特的多态现象,即如果类 P 是类 S 的父类,则子类 S 的一个对象 s 可以用在父类 P 的一个对象 p所使用的任何地方。面向对象的方法有很多种,这里所介绍的面向对象的建模技术是指 James Rumbaugh等人所著的“Object-Oriented Modeling and Design”中谈到的 OMT 的方法。OMT 是一种通过模型来思考问题的方法,这些模型都是围绕着真实世界的概念建立的。OMT 方法提供了一组面向对象的概念及图形符号,
6、然后利用这些概念及符号来分析需求、设计系统、实现,它适应于整个软件的开发过程。OMT 方法是一种思考问题的方法,而不仅仅是一种编程技术。由于面向对象的地震物理模拟软件平台是采用 OMT 方法设计的,所以这里对 OMT 方法做一个比较详细的介绍。首先介绍 OMT 的一些建模概念和图形符号。2.1 建模的概念模型是为了对事物进行更好的理解而对事物本身所做的抽象。由于模型忽略了一些事物的非本质属性,所以它比原来的事物更容易操纵。OMT 的方法是从三个相关但体现系统不同方面的角度去对一个系统进行建模,得到的三种模型分别是对象模型、动态模型和功能模型。每一种模型描述系统的一个方面。对象模型代表了系统静态
7、的结构。动态模型代表了系统随时间变化的、行为的、控制的方面。功能模型代表了系统的功能的方面。这三种模型不是完全独立的,每一种模型都包含对其它模型的引用。系统也不是各独立部分的组合。这三种模型是随着开发过程不断演变的(从问题域中的模型逐步演变为计算机域的模型程序实现) 。在系统分析阶段,问题域的模型被创建,这时不用考虑实现;在系统设计阶段,解决方法的一些结构要加到模型中去;在实现阶段,问题域和解决方法的结构要实施为代码。模型有两方面的意义,一是用来理解问题域、理解系统,二是作为解题的方法。我们先来看看对象模型。2.1.1 对象模型对象模型描述了系统的静态结构,它提供了系统中的对象、对象之间的关系
8、、标识每一对象类的属性及行为等。在三种模型中,对象模型是最重要的。在此将对象模型的一些概念陈述如下:对象是一种概念、一种抽象,是问题域中有着明确意义的事物。类描述了一组具有相同属性、行为、共同语法特征以及和其它对象有着相同联系的对象。属性是对象拥有的数据值。行为是一种功能,作用于对象。联系是两个对象之间物理的或概念上的联系。关联是两个类(问题域)之间的联系。聚合聚合是一种特殊的关联,它代表了部分整体的关系。A 聚合了 B,可以表示为 A“has a”B。继承继承是共享类的相似点但同时保留差别的一种强有力的抽象手段。一个子类可以继承它的父类。A 继承 B,可以表示为 A“is a”B。对象模型的
9、内容要与求解的问题相关。图 2.1.1 为对象模型的图形符号记法。2.1.2 动态模型对于一个系统,我们首先了解它的静态结构,了解单一时刻的各对象的结构及它们之间的关系;然后我们才是检查对象及其相互关系随时间发生的变化。一个系统的关于时间和变化的方面就是动态模型。在此,将动态模型的一些概念陈述如下:状态状态是对对象属性值和对象联系的一种抽象。状态决定了对象对外部事件激励所做成的反应。一个状态一般伴随一个持续的活动,状态对应一个时间段。事件一个独立的从一个对象到另一个对象的激励叫事件。事件对应一个时间点、一个动作。对象接收到一个事件,其下一个状态依赖于当前的状态及其接收到的事件。Class :
10、Association :Association Name Class Name Class-1 Class-2role-1 role-2Class Name . Qualified Association :Attribute:Association Name Operation: Class-1 Qualifier Class-2role-1 role-2Inheritance : Multiplicity of Associations :Superclass Class Exactly oneClass Many ( 0 or more ) Subclass1 Subclass2 Cl
11、ass Optional ( 0 or one ) Aggregation : 1+ Class One or moreAssembly Class 1-2,4 Class Numerically specified Ordering :( ordered ) classPart-1-Class Part-2-Class Link Attribute :Object Instances : Association NameClass-1 Class-2 ( Class Name ) link attribute Instantiation Relationship :( Class Name
12、) Class Name图 2.1.1状态图状态图是一个由事件和状态所组成的网络。它是一个图,其节点为状态,有向弧为标有事件名的转变。动态模型就是一个彼此共享事件、交互作用的状态图的集合。仅为那些具有动态行为的对象类构造动态模型。图 2.1.2 为动态模型的图形符号记法。Event causes Transition between Event with Attribute :States :event event ( attribute ) State-1 State-2 State-1 State-2Initial and Final States : Action on a Transi
13、tion :event / action Initial Intermediate State-1 State-2Guarded Transition : .Sending an event to another object:event ( guard ) event1 State-1 State-2 State-1 State-2. State Generalization : event2Superstate Class-3event1 Substate1 Substate2event2event3. Splitting of control : . Synchronization of
14、 control :event1Substate-1 Substate-3 event3event0event2Substate-2 Substate-4 event4图 2.1.22.1.3 功能模型功能模型描述了一个系统内的计算、功能(确定了计算的结果,不考虑如何计算) 。功能模型确定发生了什么,动态模型确定什么时候发生,对象模型决定了对谁发生。Process : Data Flow between Processes :data nameprocess name process-1 process-2Data Store or File Object : Data Flow that R
15、esults in a Data Store :Name of Name ofdata store data storeActor Objects . Control Flow :( as Source or Sink of Data ) :boolean resultActor-1 process Actor-2 process-1 process-2d1 d2Access and Update . Composition of Data Value :of Data Store Value :d1Data store composited1 d2processDuplication of
16、Data Value : . Decomposition of Data Value :d1 composite d1d2 图 2.1.3功能模型包含了众多的数据流图,用以表明数据的流动、从外部输入、通过操作、内部的数据存储以及数据的输出。功能模型只能指示可能的功能计算路径,它不能确定哪一条路径实际发生。功能模型没有显示系统的控制信息和对象结构信息。在此,将功能模型的一些概念陈述如下:处理过程:处理转变数据值,低层次的处理就是一个纯粹的函数。数据流:数据流连接一个对象或处理的输出到另一个对象或处理的输入。它代表一个计算的中间数据值。在数据流上的数据是不改变的。行动者:行动者是一个通过产生或消费
17、数据而驱动数据流的活动对象。行动者与数据流图的输入和输出相连。数据仓库:数据仓库是数据流图中为了以后的应用而存储数据的对象。控制流:一个裁决映象了一个或多个处理的执行,这是动态模型的控制方面的问题。将裁决信息包含在功能模型中,这样可以显示出数据的依赖性。在数据流图中的控制流专门负责这方面的问题。控制流是一个布尔函数值,它影响了哪一个处理被执行。数据流图:数据流图显示了一个系统计算各值间的函数关系,包括输入值、输出值和内部的数据存储。功能模型包含了众多的有明确操作意义和约束条件的数据流图 DFD。图 2.1.3 为功能模型的图形符号记法。2.1.4 对象模型、动态模型和功能模型之间的关系对于功能
18、模型:对象模型显示了处理的结构、数据仓库和功能模型中的数据流;动态模型显示了处理执行的顺序。对于对象模型:功能模型显示了类的操作和每一操作的参数,它也显示了各类之间的关系;动态模型显示了每一对象的状态以及接收事件、状态改变所执行的操作。对于动态模型:功能模型定义了在动态模型中没有定义的原子动作和活动;对象模型显示了什么改变了状态、什么经历了操作。 每一种模型都集中描述系统的一个特定的方面,而对其它的方面没有解释。虽然对于不同类型的系统三种模型的重要程度是不同的,但对于全面理解一个问题,三种模型都是必要的。2.2 设计方法学软件工程一个通过使用预定义的技术和符号约定、组织生产软件的过程。这个过程
19、一般被表述为一系列的阶段,这些阶段组成一个完整的软件的生命周期,它包括从问题声明开始,到分析、设计、实现、测试,还有维护与升级。OMT 方法作为一种软件工程的方法,它支持整个软件的生命周期。但对于测试与维护,OMT 的方法同其它软件工程方法区别不大,这里暂不介绍。OMT 方法包括以下几个阶段:分析分析阶段最开始的工作是问题声明。问题声明描述了要解决的问题,提供了推荐系统的总体概念。然后是与用户及真实世界的背景知识交流。分析阶段的成果是得到了捕获系统三个方面的形式模型。系统设计该阶段确定系统的总体结构。对象设计该阶段将分析的模型细化,然后产生一个实际的设计。在对象设计阶段,有一个从应用域概念到计
20、算机域概念的转变。下面就简要介绍一下各阶段的工作方法。2.2.1 分析分析是 OMT 方法的第一个阶段,它涉及设计一个精确的、可理解的、准确的、形式的、概念的、关于真实世界的模型,它澄清了需求,为系统的设计和实现提供了框架。1.写或得到一份原始的问题声明。2.建立对象模型*确认对象类*准备一个数据字典,包括对类、属性和关联的描述。*增加类之间的关联。* 为对象和联系增加属性。*用继承组织和简化对象类。*检测路径,迭代上述过程。*将类分组形成模块。=对象模型对象模型图数据字典。3.建立动态模型*确认系统中典型的需要交互的情况(广义和狭义的交互方式) 。*识别对象间的事件。*为每一个交互的情况准备
21、事件足迹图。*准备系统的全局事件流图。* 根据每一对象的事件足迹图建立状态图。*为校验一致性匹配对象间的事件。=动态模型状态图全局事件流图。4.建立功能模型*确定输入和输出值。*用数据流图表示功能依赖关系。*描述每一个功能做什么。*确定约束和优化标准。=功能模型数据流图约束。5.校验、迭代和精炼三种模型*增加在动态模型、功能模型中发现的操作到对象模型中。*校验类、关联、属性和操作的一致性和完备性。将这三种模型与问题声明及相关问题域知识做比较。*重审问题声明,迭代上述过程一直到分析结束。=分析文档问题声明对象模型动态模型功能模型。2.2.2 系统设计系统体系结构是系统总体的组织结构。存在一些常用
22、的共同的系统结构,每一种结构适应于一种类型的应用。不同类型的体系结构将重点放到不同的模型上。系统设计是解决问题并建立求解的高层策略,它包括将系统分为一些子系统、将子系统分配给适当的硬件和软件分量和组成框架的概念和策略。1.将系统分解为一些子系统。2.确定问题内在的并发性。3.分配子系统给适当的处理机和任务。4.选择实施数据仓库的策略。5.确定全局资源和对它们的存取机制。6.选择实施软件控制的方法(主要从动态模型中获得控制结构) 。7.考虑边界条件。8.建立优先级。=系统设计文档系统基本的体系结构高层策略。2.2.3 对象设计对象设计阶段确定了实施中用到的类和关联的全部定义,以及用于实施的方法的
23、接口和算法,这时为了实施和优化数据结构和算法要增加一些内部对象。在 OMT 方法中,模型符号记法跨越分析、设计和实施阶段。设计阶段开始了一个转变,即从面向真实世界的分析模型到面向计算机求解的具体实施。1.从其它模型中为对象模型获得操作。*在功能模型的处理中找操作。*根据控制的实施,为每一个动态模型中的事件定义操作。2.为实施的操作设计算法。*选择算法最小成本的实施。*选择合理的数据结构。*如果必要,定义新的类和操作。3.优化数据存取。*为增加方便性和减少存取成本引入冗余关联。*为效率重新安排计算。*保留导出属性减少计算。4.实施软件控制。5.调整类结构以增加继承。6.实施关联。7.确定对象属性
24、表征。8.将类与关联分成一些模块。=对象设计文档详细对象模型详细动态模型详细功能模型。2.3 从设计到实施写代码是设计阶段的扩展。写代码实际上是很机械的,因为所有困难的裁决在设计阶段已经完成了。代码应是从设计到特定语言的简单翻译。在编码阶段也要做一些裁决。因为程序代码是问题解决的最终体现,所以程序的风格对于可维护性及可扩展性是很重要的。我们可以用任何一种语言来实施设计。任何一种语言,无论是面向对象的( C+、Eiffer、Smalltalk 等)还是非面向对象的(C、Pascal 等)都是一种工具,可以被使用得很好,也可能被用得很差。面向对象编程大大改善了程序的表达能力,但同时也增加了混乱的可
25、能性(如果你是一个粗心的程序员) 。好的程序需要纪律,要坚持好的编程风格。考虑多方面的因素,我们的开发工具采用的是 C+,具体来说是 Visual C+5.0 for Windows NT。C+对面向对象概念的支持是比较彻底的,C+中与面向对象有关的特征为:类和数据封装,结构作为一种特殊的类,构造函数和析构函数,类的私有、保护和公有部分,对象和消息,友元,类中运算符及函数名重载,派生类,虚拟函数等。当主要关心的问题是对持久数据的存储,而不是对数据的操作时,那么数据库是实施的有效形式。数据库主要的焦点在于数据库的结构和对数据的约束。数据库的命令主要是对数据库某一数据集合的操作,这其中包含着高度的
26、并发性,而传统语言大多数都是串行的。数据库体系结构的基本部分之一就是提供并发的数据操作。前面我们谈到 OMT 是认识事物的方法,所以它不仅仅应用于软件的设计,它也可以被应用于硬件的设计、知识库的设计和商业企业建模。由于实施与具体的开发环境及语言紧密相关,这里就不做介绍了。OMT 方法并不是最新的方法,一种叫做 UMLUnified Modeling Language的方法目前可能已经成为了面向对象的工业标准。由于资料获取及其它各方面的原因,本文并没有采用 UML。UML 的出现并不意味着 OMT 的过时。UML 也是以 OMT 为基础产生的,OMT 方法已成功地应用于很多大型的软件项目中。在计算机领域,最新的技术不一定就是最成熟、最完善的技术。