两篇openMDX的文章

系统 1281 0

分别是:

openMDX- 开源的 MDA 平台 http://www.myfaq.com.cn/2005September/2005-09-11/191918.html

AndroMDA & OpenMDx- - http://sunshineormer.blogdriver.com/sunshineormer/1161310.html

为方便,内容转贴如下:

摘要:openMDX- 开源的 MDA 平台

<name></name>陈宇

2005 年 8 月

MDA的概念来自于OMG的规范,按照它的说法,MDA提供了一种开放的、供应商中立的 方法以应对商业与技术变化的挑战。实际上,在真正应用这种技术的时候,开发人员 面临着更大的挑战,就是需要在面向对象(OO)开发的基础上加入以模型为中心的思想。

1 I.MDA概述

1.1 定义
MDA的概念来自于OMG的规范,按照它的说法,MDA提供了一种开放的、供应商中立的 方法以应对商业与技术变化的挑战。实际上,在真正应用这种技术的时候,开发人员 面临着更大的挑战,就是需要在面向对象(OO)开发的基础上加入以模型为中心的思想。

MDA 是把建模语言作为编程语言来使用而不仅仅作为设计语言, 用模型语言编程能够带来提升生产力,软件质量以及更长远的好处。

1.2 目标
真正达到重用模型,实现以模型为中心的开发方式和使模型真正成为可复用资产。

对于厌倦了一遍遍在编码层解决在建模的抽象层中同样的问题提出彻底的解决办法。

最小成本适应不同平台间的迁移。

1.3 相关概念
UML、MOF、XMI、JMI、XML、J2EE、EJB、.NET、PIM、PSM

  • 不一定每个概念都要非常熟悉,可是起码要知道是作什么用的

1.4 关于MDA的误解
1) MDA不是代码自动生成的规范,相反它的目标是尽量减少自动生成的代码。

2) MDA不是代替RUP,XP等软件工程的传统开发过程,而是对这些开发过程一个有益的补充,特别是直接将分析设计阶段所产生的模型应用于编写程序,并最终影响部署后的系统行为方式。

3) 你所说的这种MDA实现还没有达到开发企业级应用的阶段,换句话说,根本不实际。其实,现在不仅仅有商业化的实现,也有很优秀的开源MDA平台,例如,openMDX

1.5 其他介绍文章
* An introduction to Model Driven Architecture (Part I)
See document: 3100.html

* An introduction to Model Driven Architecture (Part II)
See document: index.html

* An introduction to Model Driven Architecture (Part III)
See document: index.html

2 II.MDA开源产品比较
对于MDA的实现来说,现在有两种不同的途径:I)使用模型驱动应用开发过程;II)直接利用模型驱动运行时应用系统的行为方式。前一种实现,大部分支持从UML模型转换的代码生成工具都可以归入此类,例如AndroMDA,而后一种实现就比较少,例如openMDX。

这两种方式没有优劣之分,只是取决于你的应用目的而有不同的侧重。

  • 商业软件不作讨论,因为手头 只有IBM rational modeler的评估版

2.1 AndroMDA
AndroMDA的功能非常强大,主要用途在于从UML模型生成Hibernate,EJB,Spring,WebServices,和Struts等框架标准对应的代码, 在开发过程的建模阶段可以快速生成可运行原型,就此而言它是非常实用有效的工具,但是它的代价就是增加了很多对应各种框架类的 stereotype,这样的模型事实上已不能再算作PIM了,这样既不利于平台的迁移和模型的复用。而openMDX则仅仅使用了两个用于 语义描述的stereotype,这样的模型显得更加中立,更面向业务建模的视角。

在Struts和Spring已经成为事实上的J2EE框架标准的情况下,AndroMDA能够满足很多J2EE项目的框架要求,并且节约了很多重复性的编码工时,特别是,相对于采用手工编写此种代码,避免了可能出现的"手误"。

AndroMDA的长处也正是它的短处,因为完全面向J2EE平台开发,对于通用、中立的类型没有定义,也缺少对于属性的特性支持,比如持久性属性和导出属性的区分。在模型的表达上,仍然是更倾向于从技术框架的角度进行建模和描述系统行为。

另外还有一个通常的"代码生成器"都有的问题,就是对于模型的修改生成会覆盖掉手工修改的代码, 这仅仅是因为没有哪个流行的架构会完全采用JMI或者接口编程的方式,这样就很难避免在第一次生成代码之后,需要小心再次生成模型可能会影响到的手工编写的代码。

2.2 openMDX
openMDX拥有自己独立的中立性框架,支持J2EE、.Net和CORBA平台等,同时具有极大的灵活性和扩展性。基于openMDX的系统,从桌面应用程序到完全分布式应用的转化, 不需要改变一行代码。在openMDX所使用的模型中,也没有采用私有的模型标签和功能增强。openMDX没有提供UML模型工具,但是支持所有主流的UML模型工具:Rational Rose, MagicDraw, Poseidon, Together等。现有的插件已经提供了基本功能: 持久性,审核,历史记录和角色以及强大的日志功能。携带了一个集成的完整的界面生成引擎。

但是缺点也是显见的,由于采用的框架完全围绕模型来运行和部署,迫使开发人员从习惯的开发方式和设计思考模式转变到完全不同的重心上。例如,不再首先考虑UI,业务层,持久层所采用的方式和数据库结构等在以前的开发过程中作为核心的部分,而是首先考虑业务模型中的对象及其关联关系,当然这在真正的业务建模中是核心部分,OpenMDX将模型的这种核心地位延伸到了开发、部署和交付使用阶段。

另外,openMDX也没有提供一个IDE来支持整个开发测试和配置应用。

对于这种苛刻的MDA实现方式,下面将介绍对于企业应用系统来说所带来的利益。

3 III.openMDX带来的利益

3.1 完全开源
开源软件的好处在这里就不作讨论了,OpenMDX提供了除了源代码以外更多的东西,包括所有模型文件,API文档,以及几个不同使用方式的实例,甚至还有基于openMDX的完全开源的项目--一个企业级CRM应用,openCRX。

3.2 提供了基于标准(J2EE、.NET等)的基础架构
基于openMDX的应用可以很轻松的移植到多个不同平台,采用了MOF,JMI,XRI,XML等标准和协议,不用过多考虑会被绑定于某一平台。

3.3 快速开发、部署和弹性配置
建立了成熟模型之后,开发测试的工作量降低到了难以想象的地步,举例来说,openCRX总共两百天的开发过程中,建模占了100天,界面设计定制用了70天,10天用于实现,20天用于测试部署。

3.4 极强的系统互操作性
openMDX平台上发布的功能模块,对于数据的导入导出都是基于Schema-XML,而且可以方便的发布为Webservice,跟其他异种系统的交互达到了轻松自如的地步。

3.5 降低总体拥有成本(TCO)
不仅仅因为平台本身是开源软件,而且更因为基于MDA规范,使得模型的重用得以实现,并且可以积累对于企业更有价值的部分--业务模型。对模型变更的快速响应,能够在几分钟内实现从模型修改到生成代码并部署运行的整个开发过程。

4 IV.基于openMDX的开发过程

4.1 openMDX开发过程简介
openMDX 是一个OMG Model Driven Architecture(MDA)为起始的高级实现.openMDX是一个工业化的,开放的,模型驱动的运行时引擎和平台独立模型(PIMs)框架。 不象大多数商业工具,openMDX 没有实现PIM到PSM映射的方法。 而是提供了一个普通的,分布式的对象引擎(作为PIM 平台)。商业逻辑(模型的导出属性和方法)是作为插件添加进去的。下图说明了OpenMDX在软件开发过程中所起到的作用:


  • 建模: 创建PIM。当前版本中, openMDX 仅仅需要与MOF兼容的类图中的静态模型图,其他对系统行为建模的图则暂不被支持,对于UML动作语义和活动图和状态图的支持将在以后的版本中作为可选项加入。 openMDX 提供了工具将兼容MOF的模型映射, 即采用了JMI和 XMI 的映射。由MOF 映射所定义,类图表达了一个组件对外的行为规范, 例如组件的接口。
  • 开发: 在这一步中开发者编写客户端和服务端的代码。要注意,就像以后会看到的,现在手工编写的代码是平台独立的。
  • 部署: 将生成的MOF 映射, 手工编写的代码, 部署信息和openMDX运行时环境,在部署阶段集成在一个可运行、可部署的应用服务平台上,例如,J2EE应用服务器、.Net服务器等。

openMDX 并未覆盖整个开发过程。它没有支持诸如需求工程,测试等阶段的工作。 当然,所有这些阶段都是开发应用的基础阶段。

4.2 openMDX模型基础及Hello-World实例简介
在openMDX的发布包中,有一个Hello-World的实例,在文档中有一篇《openMDX Quick Start》是专门介绍这个实例的配置运行方法的,在这里不再赘述,只是讨论以下几个要点,为下一篇的深入介绍做好基本概念的准备:

1.在openMDX中,代码与模型的关系

2.在基于openMDX的模型中所用到的一些UML概念

3.w3c的基本类型介绍

4.openMDX中所用到的stereotype的介绍

5.Hello-World的模型

1.在openMDX中,代码与模型的关系

在基于openMDX的开发过程中,一旦模型创建完毕,并符合openMDX的建模规则,即可使用Ant构建生成基于openMDX的工程。其中,使用generate target可以导出模型,分别生成对应JMI和XMI标准的文档,其中前者是java代码,后者是XML格式的模型定义文件。搭建起Hello-World在Eclipse中的工程环境之后,可以很清晰的看出,自动生成代码和手工编写的代码是分放在两个不同的目录中,而对于导出属性和操作则是通过delegate(委托)的方式去执行手工编写代码的,而其中的委托关系,是以package(包,包括java类中的包和UML/MOF模型中的包的含义)为单位去配置映射关系的。关于JMI和XMI在openMDX中的具体作用和运行调用关系,请参考《openMDX Introduction》。

2.在基于openMDX的模型中所用到的一些UML概念

openMDX的模型是兼容MOF标准的,另外加入了对于quarlifier(限定符)的支持。如果你对UML/MOF建模已经非常了解,那么可能只需要熟悉几种openMDX中常用的关联关系和设计惯例。由于openMDX采用了XRI协议访问所有的应用资源(包括模型、包、类、对象/实例),所以所有类图模型中所定义的实体类都必须被每个包中的Segment直接或者间接的包含并且是可导航的,而其他作为参数或者返回结果定义的类(stereotype为Struct)和作为抽象类用于被继承的类(stereotype为root)则可以单独存在。

3.w3c的基本类型

在openMDX的模型中,有一个org::w3c的包,其中定义了几种标准的原始类型,是作为模型中的基本数据类型存在的,并且具有中立性,由OpenMDX平台负责对这几种基本类型到具体语言平台的映射。

4.openMDX中所用到的stereotype的介绍

"0..1" (针对属性的修饰版类, 表明这是个可选的属性)
"list" (针对属性的修饰版类, 表明这是一个没有空值的排序集合)
"set" (针对属性的修饰版类, 表明这是一个不重复的未排序集合)
"sparsearray" (针对属性的修饰版类, 表明这是一个允许空值的散列数组)
"stream" (针对属性的修饰版类,对于类型是org::w3c::string 和org::w3c::binary 的属性,表明这是字符或者二进制流)
openMDX中的每个包含关系都需要一个类型为org::w3c::string 的quarlifier(限定符) "alias" (针对类的修饰版类,允许通过别名引用到一个给定类)
"root" (针对类的修饰版类,允许其他"root"或者非"root"类由此类继承
"primitive" (针对类的修饰版类,表明了此类是原始类型,并由openMDX核心所支持

5.Hello-World的模型

下图是此实例的初始模型图:


注意在poseidon工具界面左方的面板里面,HelloWorld类的节点下面重复性的包含了SayHelloResult类的定义,如下图所示:


因此,在做模型扩展的时候,需要注意,增加了SayGoodbyeResult类之后,同样要在HelloWorld类中复制一份。否则,在使用Ant构建工程时,会报不匹配建模规则的错误。好在使用其他工具,比如Rose时,不会有这样麻烦的需求。

Hello-World的模型非常简单,没有涉及到类与类之间的关联以及对象实例的持久化等问题,这些将在后面的部分进一步讲述。

[个人]AndroMDA & OpenMDx- -

最近在思考MDA、SOA、DDD的融合,稍微研究了一下两个开源的项目OpenMdx和 AndroMDA。非常感谢技术中心MDA产品组的阿建和阿德,在我的研究过程中给予极大的帮助和鼓励。

OpenMdx,号称支持很多国际标准,据说,是因为其背后有IBM的大力支持。不过,这也秉承了IBM产品的特点:庞大。它的典型的商业应用,是OpenCrx,一个开放源代码的CRM系统(不过里面的CRM业务模型部分不是很全).

OpenMdx有一个中文网站,因此许多的document可以看到中文版。不过,其手册中还是一些遗漏,因此,在部署demo的过程中,还是遇到了一些问题。(我会在稍后的时间,把排错过程整理出来)。其操作案例大部分是基于eclipse的,也就是说,OpenMdx的着眼点,还是开发人员。过程:

建模人员用支持XMI的建模工具建立模型,

OpenMdx将XMI模型导入并建立内存模型(通过JMI和反射机制),据说不用做PIM到PSM的转换。

由开发人员将项目导入IDE环境后,手工增加业务逻辑部分(以插件的形式),其插件必需要实现其规定的接口。(要在文件头引入n多的openmdx的包和包装包).另外,其部署过程相当麻烦。

AndroMDA是一个比OpenMDx轻量的MDA框架,它的显著的特点是,支持当下众多的开源项目,并且可以随你的需要,自由扩展。因此,它针对的角色分两种:

  • 建模+应用开发人员
  • cartidge(也就是AndroMDA插件)的开发人员。

AndroMDA支持 java(可以使用struts,bpm4struts,hibernate和Ejb。。。)和.net以及Webservice,不过其教程不如OpenMdx详细,令人不舒服的是它的3.1的demo部署后,用IE访问会出现问题,改用FireFox就没有那个现象。因此,详细的工作原理我还在探索中。。。

比较其OpenMdx的部署,AndroMDA的部署就容易的多,它自动的生成基本maven的部署文件,哪怕你不懂maven,也可以很容易的执行。

说到这里,应该说一下我们自己的MDA,Loushang的MDA,属于MDA的简单实现,没有了那么多标准的约束,并且是基于楼上平台本身的(像OpenMdx的做法,是要开发人员对各种底层有很深的了解的;而AndroMda那样,把众多的开源纳入进来,学习的工作量也不少,也不是一件容易的事情),相比较更具有实战意义。

两篇openMDX的文章


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论