MOF原理和实现
陈健翔
2004-10-15
关键字:MDA MOF AOP
众所周知MOF是MDA的核心,下面我们来快速浏览一下什么是MOF。
序曲
一个应用系统可以被分为典型的3层结构。在《UML模式与应用》[1]一书中分别称为UI层、领域层、数据层。UI层和领域层的接口通过应用程序和应用框架来连接;领域层和数据层的接口通过持久化框架来连接。该书中关于持久化框架的实现是使用模板方法模式来实现的,基类定义了持久化基本接口,由每个子类来实现各自的持久化方法。子类的域(field)和关系数据库的字段的映射关系被直接编码到类代码中。该方案会导致系统复杂性的提高和系统维护的困难。为了解决该问题,该书引用另一本书的一种解决方案,即POSA[2](Pattern-Oriented Software Architecture: A System of Patterns)的反射模式。
POSA1中的Reflection一节讲述上述的反射模式,或称为映像[3]模式。映像模式将软件系统(领域层)分为基本层次和元层次。基本层实现程序的逻辑,元层次封装可更改的系统内部成分。元层次由一组元对象(metaobjects)组成,每个元对象封装了一个关于基本层次的结构、行为或状态的一方面的所选信息,所有元对象一起提供一个应用程序的自表示。将持久化方法封装到元层次后,基本层次通过调用元层次提供的持久化组件来序列化和反序列化内部数据。同时可以通过元对象协议(MOP)改变元层次的持久化方法,以影响整个系统的持久化行为。该模式示意图如下:
将元层次从系统中独立出来后,对元层次的访问变得十分重要了,这就直接导致了元层次的互操作性和兼容性问题,即不同模型系统表达的元层次能够互相访问、接口兼容。我们来看映射模式中元层次信息的结构:元层次保存的信息包括类型信息(type_info),存放在元层次类型库中;扩展信息(extTypeInfo),提供类大小、继承关系和数据成员信息等,对象与关系数据库的关系可以记录在扩展信息中。由于建模语言的不同,定义出来的元数据虽然内容相似,但是格式、接口却不同。为了解决这个问题,就需要一个统一的格式和接口来描述和访问元数据,这就是MOF要做的。
MOF体系结构
我们知道,为了实现跨语言和跨平台的对象访问,OMG提出了CORBA体系结构,并定义了IDL用于统一对象访问接口。MOF接口是OMG提出的在元层次上定义的统一的接口。和OMG一贯思想一样,它也是跨语言和跨平台可访问的。另外,注意到跨平台访问和跨平台运行是不同的两个概念,Sun的Java是跨平台运行的,但Eclipse就不一定了;C++程序通过CORBA能够做到跨平台访问,但是做到垮平台运行却比较难。
MOF体系结构是分层的元数据体系结构,该体系结构的经典框架有4个建模层次的,如下图所示:
每个层次的上一层是下一层的的模型,本层次的描述语言在它的上一层模型中。比如元层次股票报价类StockQuote用于描述软件系统中的报价对象;而元-元层的类Class则是用于描述模型层,如元层次类、包等的建模元素;同样,元-元-元层,简称为MOF Model层,该层的Class则是用于描述元-元层,也称为元模型层的中我们通常说的类,包,关联这些建模型元素;那么最后MOF Model由谁来描述呢?答案是MOF Model自己:“上层”MOF Model中的Class可以描述下层MOF Model的Class,Data Type,Association,Reference,Attribute,Operation等等这些Model Element类的派生类,包括Model Element类在内;“上层”MOF Model中的Package