软件学报
JOURNAL OF SOFTWARE
1999年 第4期 第10卷 Vol.10 No.4 1999



面向对象应用框架在油气勘探领域的应用研究*
李英军　吕　建　王宏琳
摘要　企业领域的面向对象应用框架研究是现代面向对象应用框架技术的重用趋势之一.应用框架可以增强大型应用软件的可扩充性和代码重用性.文章在对面向对象应用框架技术进行深入分析的基础上,针对油气勘探领域交互地震处理软件设计中存在的问题,提出采用面向对象应用框架方法,并引进一组面向应用领域、基于特定设计模式的组件,使交互地震处理应用软件具有良好的可扩充性和重用性.
关键词　面向对象,应用框架,设计模式,地震处理.
中图法分类号　TP319
Research and Development of Object-oriented Application Framework
in Oil and Gas Exploration Area
LI Ying-jun1,2　L Jian1,2　WANG Hong-lin3
1(State Key Laboratory for Novel Software Technology Nanjing University Nanjing　210093)
2(Institute of Computer Software Nanjing University Nanjing　210093)
3(Bureau of Geophysical Prospecting China National Petroleum Corporation Zhuozhou　072750)
Abstract　　Domain-specific frameworks have received considerable attention from researchers and developers and will become one of the future trends in object-oriented framework research area. In this paper, based on the deep understanding and analysis of the object-oriented application framework techniques, the existing problems in oil and gas exploration software are studied, and a specific framework for the interactive seismic processing application is proposed. Meanwhile, a set of design-pattern-oriented components are introduced so that the software extensibility and the code reusability are enhanced.
Key words　Object-orientation, application framework, design pattern, seismic processing.
　　计算机在油气勘探开发领域中的应用已有近30年的历史,其地震信号处理应用系统均以数据流驱动的批量计算任务为主.进入90年代以来,图形和人机交互方式的信号处理模式有效地提高了地震信号的处理质量.但多数交互应用软件采用结构化设计方法,使其功能的扩充和代码重用受到诸多限制.尤其是近年来地震勘探新技术的发展,新的数据模型和计算方法不断出现,以及对超大数据量并行计算的需求,使得应用软件系统的扩充性、重用性和易用性都显得极为重要.但现存的结构化应用软件系统远不能满足这种不断增长的需求.
　　结构化设计是一种面向功能的软件设计方法,它使用数据流将功能模块粘合在一起,形成完整的系统.但当系统功能需求改变时,会引起功能模块的变化.如果需求变化涉及到高层功能模块并影响到系统结构时,则整个系统需要重新设计.因此,结构化设计限制了系统的功能扩展性.另外,以往的结构化设计仅针对某个系统而言,缺乏企业领域内对同类软件系统的综合考虑,造成同类系统的开发往往从头开始.虽然可以使用其他系统的设计模式,但是程序代码的重用仅停留在“Cut and Paste”级别上.
　　使用面向对象的应用框架技术可以加强系统的扩充性和代码重用.由于软件系统中的数据模型相对稳定,使用面向对象设计方法开发的系统具有良好的稳定性.对象将数据和行为封装在一起,系统功能的变化仅仅影响到某些对象的行为特征的改变,而不会改变系统的体系结构.因此,系统具有良好的可扩展性,而面向对象方法的继承特性使系统的部分程序代码得到重用.另外,应用框架是对某领域内应用系统的部分或整体的可重用性设计,它将应用系统的控制流进行抽象,形成更为通用的功能组件.并且,框架把系统中公用及繁琐部分都隐藏在稳定的界面之下.因此,应用框架稳定的界面和抽象的功能组件增强了系统的可重用性.
　　应用框架强调的是软件的重用性和系统的扩充性,以缩短大型应用软件系统的开发周期,提高开发质量.与早期基于面向对象类库的重用技术相比,应用框架的研究则更注重那些特定专业应用领域内的软件重用.然而,目前应用框架的研究领域主要集中在系统体系结构（例如,微软的MFC(Microsoft foundation classes)）和应用集成中间件（例如,ORB(object request broker)）方面.相比之下,面向商业和企业领域（例如,油气勘探、气象预报、银行等）的应用框架则缺少研究与实例,特别是在面向油气勘探领域的应用框架研究目前未见报道.因此,面向商业和企业领域的应用框架被认为是今后该领域的发展趋势之一［1］.
　　本文的主要工作就是在对应用框架技术进行深入分析和研究的基础上,针对油气勘探领域地震信号处理软件设计中存在的问题,对其数据模型和计算模型进行了分析,讨论并提出了如何使用面向对象应用框架技术来解决图形交互地震信号处理应用软件开发问题,并引入面向对象应用框架、面向专业领域的应用组件和设计模式等概念,给出了交互地震信号处理应用框架的基本设计思想,从而使交互地震信号处理应用软件具有良好的可扩充性和重用性.本文一方面说明面向对象应用框架技术在油气勘探领域中应用的可行性和广阔的应用前景,另一方面,将我们在应用框架技术应用于油气勘探领域的经验和体会加以提炼,为进一步完善面向对象应用框架技术提供新的研究思路.　　
1　面向对象应用框架
　　目前,虽然面向对象应用框架的研究开发工作已经起步,但尚未形成一个严格而精确的定义.尽管目前有关应用框架的定义较多,其中心都是“重用”二字.下面列举3个应用框架的定义：
　　(1) 应用框架是一种可以重用的应用软件的半成品,它可以被用来建造一族应用程序［1］.
　　(2) 应用框架是一组相关组件的集合,这些组件的相互作用关系形成了一个可以重用的体系结构.该结构可以被用来建造一族应用程序［2］.
　　(3) 应用框架是一种软件重用技术.它是一个应用软件系统的部分或整体的可重用设计.应用框架具体表现为一组抽象类以及其实例（对象）之间的相互作用方式［2］.
　　以上定义的侧重点各有不同.前两个定义描述了应用框架的功能和目的,第3个定义则描述了框架的结构.根据以上定义和在应用框架技术的研究及实践中的体会,我们认为,对面向对象应用框架技术可以从软件方法学和应用框架本身这两个层次来理解.首先,面向对象应用框架是一门以软件重用为核心,研究软件应用框架的获取、表示和应用等问题的软件方法学.作为一门软件方法学,应用框架具有如下特征：
　　(1) 基于应用领域的应用框架的获取,强调其重用性和集成性.与普通面向对象类库相比,应用框架强调应用领域内重复出现的大粒度问题及其解的抽象提取.它是领域内应用软件的部分或整体的可重用设计,适应于该领域内一组相关问题的求解,可作为应用程序的半成品,具有较大的重用粒度.框架的集成性体现在：其本质内涵为对一组问题求解的基础结构,通常表现为在统一基础结构下的一组设计模式(design patterns)与相应功能的有机合成.
　　(2) 面向对象的应用框架的表示,强调其模块性和灵活性.面向对象的面向问题特征使之适合于作为应用框架的表示机制,而面向对象中的继承和允引等机制可用来较好地表达应用框架的集成性.更进一步地,面向对象的封装性可为应用框架提供统一而稳定的使用界面,使其具有抽象性,从而可使设计与实现的细节局部化并对用户透明.这为框架的使用和实现带来了诸多方便.
　　(3) 方便用户的应用框架的使用,强调其直接可用性和可扩充性.应用框架为用户提供了直接使用其内置功能和修改及扩充其功能的途径.白箱框架(whitebox frameworks)主要依靠面向对象的继承和动态定连机制实现其可扩充性.用户可以直接使用框架提供的功能函数,也可以继承框架的特征并重载框架中预定义的hook方法,实现其可扩充性.同时,黑箱框架(blackbox frameworks)使用对象组合和代理方法,通过定义组件界面使其可插入到框架中去的机制实现其可扩充性.用户可以定义特定界面的组件,并将其插入到框架中.
　　(4) 透明于用户的框架实现,强调可多重实现性和易移植性.框架是对某领域内应用软件公用部分的抽象,具体表现为一组相关的抽象类.由于不同的应用领域对其应用环境往往会有不同的要求,因此,框架应该可以在多重平台如单机、并行机或分布式网络环境等上实现,而对应用程序不产生影响.框架表示的抽象界面为此提供了可能.
　　另一方面,应用框架本身作为可重用的软件实体,是面向对象应用框架方法学的主要成果.因此,它应该具有重用性、抽象性和易扩展性等特点.由于应用领域之间的差别,不同领域内的应用框架所强调的侧重点各异.因此,领域内所开发出来的应用框架可能只具有其中的部分特性.例如,下文讨论的交互地震信号处理应用框架使用设计模式和组件技术,具有良好的重用性和可扩充性.目前,面向对象应用框架的研究才刚刚起步,尤其是企业领域的框架研究,需要对各种各样的研究实例进行分析、研究和提炼,为面向对象应用框架方法学的发展提供新的研究思路,从而可使之逐步完善.
2　交互地震处理
　　地震处理可以被理解为对一组数据,经过一系列的数学变换后得出相应的结果数据.一个典型的地震处理过程可以被描述如下：
　　地震信号数据从野外被采集后,记录到某种介质上,称为野外原始数据.经过对该数据的解编重排计算和野外测量参数的分析解释,形成叠前数据.然后对叠前数据进行信噪比增强、速度分析和动校正计算、静校正分析计算和叠加,形成叠加数据和速度模型.最后经过使用速度模型对叠加数据进行偏移成像计算,得出阶段性结果,如图1所示.

图1　地震处理基本流程
　　如何从现存的图形交互地震处理应用软件中分离数据模型、显示模型和控制模型,是我们研制开发地震应用框架时遇到的基本问题.现有的地震处理软件将数据模型、显示模型和控制模型紧密耦合在一起,使系统难以具有模块化特征.
　　根据地震处理的特点以及相应存在的问题,我们将交互地震应用的计算模型抽象为：在一个基本数据模型上,运用一系列的数学变换,使数据模型的状态得以改变.在数学变换过程中,需要图形显示和人工干预,直至得到所要求的结果数据模型,如图2所示.

图2　交互地震处理模型
3　交互地震处理应用框架
　　面向对象应用框架技术主要解决交互图形地震处理系统中控制流和显示部分的复用和扩充问题,为计算功能组件提供可重用及可扩充的场景.交互应用框架将数据交换、错误处理、参数译码和事件处理等通用繁琐的功能用稳定的界面包装起来,并且,框架的控制流中设置了一系列的热点,在热点之上定义了事件处理和相应的功能函数派遣机制,用来监听和处理来自用户的键盘和鼠标事件.基于事件的到来,分布在热点上的功能函数模块被激发.信号处理功能模块被定义为具有统一接口的组件.这些功能组件使用接口进行消息传递,并且可以互换地插入到应用框架的热点之上.这些功能组件具有高内聚、低耦合的特性,可以被多次重用.
　　应用框架应该是在对现存的应用领域内的软件系统作深入了解分析的基础上进行的.经过对GRISYS地震数据处理系统的分析研究,认为交互地震信号处理应用框架是对数据模型、显示模型和控制计算模型的控制流部分的抽象描述与实现.地震信号处理的数据模型比较复杂,对数据模型的变换和计算方法多样.例如,地震信号的信噪比提高方法就有反褶积、相干加强、最小熵等.地震信号成像计算和测井数据分析则需要多种复杂的数据模型混合计算.地震信号的速度分析需要用户作较多的干预和图形显示.虽然地震信号处理的数据模型和计算模型具有复杂性,还是可以被抽象为“数据模型/显示模型/控制模型”,或称之为MVC(Model/View/Controller)的应用框架模式［3］.
　　我们建造了一个以MVC为基础的交互地震处理应用框架,如图3所示.该框架使用了3个抽象类作为基本类,即DataModel用来作为地震数据基类,描述地震数据和属性数据;View作为显示对象类的父类;Controller用来导出控制流对象类.用户通过该框架的控制部分选择数据的变换方法,并且对地震数据对象进行计算,同时,使用View的实例窗口显示当前的数据对象的部分或全部数据.Controller类实例接收用户的键盘和鼠标事件,并且将控制流移交相应的功能函数组件.

图3　基于MVC的交互地震处理框架
　　交互地震处理应用框架与MVC模型的不同之处在于,后者仅对DataModel进行单一的控制,并且View也只是在对DataModel作单一方式显示的假设下提出来的,而交互地震信号处理框架则要对数据模型,根据其属性不同,要求作出多种不同的显示,即它支持复杂显示模型.当DataModel被改变时,多个View 的实例将自动根据数据模型选择适当的显示方式,并修改其显示内容.同时,用户通过Controller选择对DataModel的变换算法.在多个View和DataModel之间建立一种Subscribe/Notify协议,一旦DataModel被改变,它便通知View,对数据进行自动修改其显示内容.Controller定义了一系列控制热点,用来插入计算方法.
　　交互地震处理框架使用了3个抽象设计模式Observer,Strategy和Composite,以使其具有鲜明的可扩充性和重用性等应用框架特点.如图4所示,框架中的View可作为DataModel的Observer,但是View本身不负责处理用户事件,只是将事件发送给Controller.而Controller使用Strategy处理用户事件.此外,View可以有多个GraphicComponent,而每个GraphicComponent又可以有自己的WiggleTrace,Velocity和GraphicComponent等.因此,这3个抽象设计模式确立了DataModel,View和Controller三者之间的互动关系.

图4　交互地震处理应用框架对象关系图
3.1　Observer设计模式
　　从View和DataModel之间的相应关系中,可以得到Observer设计模式如下.
　　定义存在于对象间的一种一对多的相互依赖关系.当一个对象的状态被改变时,所有其他相关对象均被通知,并且自动改变其自身状态［4］.
　　按照Observer设计模式,将View和Controller定义为Observer的子类,从而可继承父类的行为特征.同时,让DataModel和Observer之间具有一对多的关系.DataModel和Observer之间的相互作用关系可以被描述成：
　　(1) DataModel一旦发生导致数据状态改变的事件,就通知它的Observer对象.
　　(2) 当任何一个View对象收到消息后,它则向DataModel请求被显示数据模型的细节,并使用该数据模型对其显示状态进行改变.
　　因此,Observer设计模式使得DataModel和View两个类中的任意一个可以被独立重用,而不会影响到另外一个.例如,新增加View的子类对DataModel是透明的.这种设计模式使交互地震应用框架具有如下特点：
　　(1) DataModel和Observer之间的抽象耦合关系.DataModel仅能感知多个具有统一抽象界面的Observer,而并不关心抽象类Observer的实际子类.因此,DataModel和Observer之间仅存在一种最小的耦合关系.
　　(2) 支持广播通信机制.与普通“请求/回答”机制不同的是,DataModel发出的请求并不需要指明接受者,而是通过Observer将消息送给任何一个感兴趣的对象.DataModel也不必知道有多少个感兴趣的对象存在.该机制允许随时增删显示对象,并且所有的通信都由Observer抽象类完成.
3.2　Strategy设计模式
　　地震处理是对其数据模型进行一系列数学变换的过程,其数学变换和结果数据之间存在着对应关系.如果将多个数学算法以特征行为方式和数据状态静态地封装在一起,不仅使数据类变得庞大复杂,也不利于算法的修改和替换.因此,使用Strategy设计模式将算法和数据模型进行逻辑分离,可以实现算法与算法之间、算法与数据之间的松散耦合结构.
　　定义一组算法并将其逐一封装,使算法之间可以进行互换.该设计模式使算法与使用它们的客户相互独立.在抽象类Strategy中声明一个对所有支持的算法统一的公共接口.数据对象仅使用这个接口调用实际对象中定义的不同算法［4］.
　　该设计模式为数据对象提供一组可以重用的、相互独立的算法.其层次结构可以帮助将信号处理中的公共功能抽象出来,使其容易被使用、修改和替换.Strategy和DataModel可以相互作用,进行算法选择.数据对象可以在调用某一算法时,将数据作为参数传递给算法函数,或将数据对象本身作为算法接口的参数.客户选择某一算法时,还可以将算法对象作为参数传递给数据对象.
3.3　Composite设计模式
　　交互地震处理经常需要将地震数据与属性数据叠合显示,并且对其进行分析和编辑.因此,可以把地震数据和属性数据看作基本图元的组合.地震基本图元是由如WiggleTrace,Curve,Grid等组成的基本绘图单位,也是用户可操作的最小绘图单位.这些基本图元的组合构成一幅完整的地震成果图.
　　每个基本图元为一个类,并且增设图元容器类(container class)用来对图元进行组合.为了保持基本图元和图元容器所提供应用界面的一致性,在基本图元类和图元容器之上引进一个抽象类GraphicComponent,用来为应用程序提供统一的界面.即应用程序只通过该抽象类的界面来使用图形对象,而不必关心所使用的是基本图元还是组合图元.因此,这种“部分和整体”的树型结构确定了一组对象的层次关系,并可以抽象成为Composite设计模式.
　　在该设计模式中,应用程序只需要使用GraphicComponent类的界面就可以和Composite中的对象进行通信,如果消息的接收者是这个树的枝叶(如WiggleTrace),则它可以直接处理该请求.如果消息的接收者是Composite,即图元容器对象,则它将请求转发给它的孩子.因此,使用Composite设计模式使应用程序变得简洁,程序使用统一界面处理基本图元和图元容器,避免了在程序中使用类似于Case的语句所带来的复杂性.另外,Composite设计模式也易于扩充新的Composite组件.新增设的枝叶或Composite子类并不给使用该模式的应用程序带来任何影响.
4　结束语
　　本文描述了面向对象的图形交互地震信号处理应用框架的基本设计思想.中国石油天然气集团公司地球物理研究院已经使用面向对象的应用框架的设计思想,开发出交互波阻抗分析软件和图形交互数据处理系统.由该研究院研制的油气勘探开发集成平台（oil in one,简称OIO）目前已基本完成,其中的有关部分也使用了应用框架的设计模式.应用框架设计模式和软件组件技术的使用,使地震信号处理软件系统在体系结构上有了新的突破,部分组件的重用性得到提高.初步的实践结果表明：面向对象应用框架技术在油气勘探领域的应用是可行的,它可以提高应用软件系统的可扩充性和重用性,具有广阔的应用前景.
　　另一方面,在应用框架技术的使用过程中,我们也发现若干值得进一步研究的问题.(1) 油气勘探领域内的应用软件种类繁多,现有的应用框架技术难以完全适应其需要.例如,在油气勘探领域具有重要应用价值的三维叠前处理技术,它所涉及的数据量巨大,需要使用并行计算方式才能有效地解决叠前深度偏移成像问题.而目前对并行面向对象应用框架技术的研究甚少,几乎没有可以直接使用的方法与技术.如何采用并行面向对象应用框架技术来提供良好的并行程序设计界面,复用相关领域的并行算法,并使之可较为方便地在不同的并行体系结构和分布式并行结构之间移植,是我们目前研究工作的重点之一.(2) 目前,应用框架的表示和使用仅仅局限在类这一级上,而应用框架中所涉及的设计模式等通常是多个类之间的有机组合.如何从语言的角度,在类的基础上引入刻画复合类的设施及其相应的继承机制,从而可从根本上简化框架的表示与使用,也是一个值得研究的问题.在这方面,我们已进行了初步的尝试,需要从面向应用领域的角度逐步加以完善.
*　本文研究得到国家杰出青年科学基金资助.
本文通讯联系人:李英军,南京 210093,南京大学计算机软件新技术国家重点实验室ｓ
作者简介　李英军,1962年生,高级工程师,主要研究领域为面向对象应用框架及程序设计.
　　　　　吕建,1960年生,博士,教授,博士生导师,主要研究领域为软件自动化,并行程序形式化方法和面向对象语言及环境.
　　　　　王宏琳,1941年生,教授级高工,主要研究领域为油气勘探计算机软件的发展与应用.
作者单位：李英军　吕　建（南京大学计算机软件新技术国家重点实验室　南京　210093）
　　　　　李英军　吕　建（南京大学计算机软件研究所　南京　210093）
　　　　　王宏琳（中国石油天然气集团公司地球物理勘探局　涿州　072750）
E-mail: yjlee@mx.cei.gov.cn
参考文献
　1　Fayad M E, Schmidt D C. Object-oriented application framework. Communications of the ACM, 1997,40(10):32～38
　2　Johnson R E. Framework=Components+Patterns. Communications of the ACM, 1997,40(10):39～42
　3　Lewis T, Rosenstein L, Pree W et al. Object-oriented Application Frameworks. Greenwich: Manning Publications Co., 1995
　4　Gamma E, Helm R, Johnson R et al. Design Patterns, Elements of Reusable Object-oriented Software. Reading, MA: Addison-Wesley Publishing Company, 1995
本文1997-12-08收到原稿,1998-05-04收到修改稿
