`
yiliner
  • 浏览: 214520 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《EMF:A Developer's Guide》读书笔记第二章 :EMF简介(上)

    博客分类:
  • EMF
阅读更多

1.EMF的元模型Ecore  
    我们通常所说的模型(Model)是指应用程序更高层次的描述,通过它可以生成部分甚至全部的实现代码,可以由UML等标准的方法来定义。EMF(Eclipse Modeling Framework)中的模型层次没有这么高,它和实现直接关联。
    EMF是一个可以产生代码的框架,你可以通过UML类图、XML Schema、Java Interface等任何一种方式来定义EMF模型,而且可以由一种方式生成另外其它方式,在这里EMF 模型就是把这三者结合在一起的更高层次的一种表示。EMF模型本质上是UML类图的子集,它是关于应用的类和数据的简单模型。
    用来描述EMF模型的模型(元模型)叫做Ecore,Ecore本身也是一个EMF模型,因此它是自己的元模型,也可以说Ecore是一个元元模型。Ecore模型的主要组成部分有:
    EClass:代表一个类,通常有自己的名字,0个或者多个属性、引用。   
    EAttribute:代表一个属性,有自己的名字和类型。
    EReference:代表两个类之间的关联关系的一端。有名字,代表是否聚合的boolean类型的标志,以及目标类的类型。
    EDataType:代表属性的类型,可以是int或者float等原子类型,也可以是java.util.Date等对象类型。
    当我们有了自己的具体应用时,我们会实例化Ecore的以上元素为这个具体的应用构造模型,称为core模型。core模型的序列化采用XMI(XML Metadata Interchange),因为用来定义core模型的三种方式(Java Interface,XML Schema,UML)都有各自的缺点,不适合作为core模型的序列化形式。
   
    2.目前生成Ecore模型的三种方法
    (1)从UML生成: 直接用Ecore Editor或者Omondo提供的工具EclipseUML;也可以从EMF Project的Wizard中导入mdl文件;还可以从UML工具中导出。其中第一种方法可以自动的同步core模型与工具中编辑的模型(如 EclipseUML编辑的ecd文件),而后两种方法当uml类图有了变化时需要重新导入或者导出才能使core模型与之同步。
    (2)从Java Interface生成:在要建模的类或者方法前加“@model”注释,每个属性和引用对应一个get方法,不需要set方法。

<!---->/**
 *@model
 
*/
public   interface  PurchaseOrder
{
    
/**
     @model
     
*/
    String getShipTo();

    
/**
     @model
     
*/
    String getBillTo();

    
/**
     @model type="Item" containment="true"
     
*/
    List getItems();
}


    (3)从XML Schema生成:模型中的每个类用一个complex type表示,一个属性用一个内嵌的element表示,引用则用一个内嵌的属于另一个complex type的element表示。这样给定schema之后,模型实例的序列化根据它来进行。
    除了以上三种定义模型的方式之外,还存在其它的方式,比如说,目前EMF正在支持RDB Schema(Rational Database)的方式来定义模型。
    
    3.代码生成
    模型到代码的自动生成是EMF重要的功能之一,大大提高了生产率,而且生成的代码简洁,高效。
    Ecore中的每个类(EClass)会生成一个接口和一个实现类,EMF特意采用了这种实现与接口相分离的设计。其中的接口都会继承EObject这一 EMF中的集接口,它如同java.lang.Object在Java中的地位,它主要提供了三个功能:eClass()方法返回该对象的 metaobject;eContainer()和eResource()反别返回包含该对象的对象和资源;另外eGet()、eSet()、 eIsSet()和eUnset()等方法为访问该对象提供了API.EObject还继承了Notifier接口,当对象发生变化时(如成员变量的取值 发生了变化)会发出通知(观察者设计模式)。比如改变Order对象的属性shipTo的set方法的实现如下所示:

<!---->public   void  setShipTo(String newShipTo)
{
   String oldShipTo 
=  shipTo;
   shipTo 
=  newShipTo;
   
if (eNotificationRequired())
      eNotify(
new  ENotificationImpl( this , Notification.SET, POPackage.PURCHASE_ORDER_SHIP_TO, oldShipTO, shipTo));
}

   其中eNotificationRequired()是BasicNotifierImpl类提供的方法,它返回是否需要调用eNofifier().
   除此以外,EMF还为每个模型分别生成一个factory和package对应的接口和实现类。其中**Factory继承于EFactory,为模型中 每个类的创建提供create***方法,因此我们在EMF中一般不用new来创建对象。创建一个订单对象的代码如下:

<!---->PurchaseOrder po  =  POFactory.eINSTANCE.createPurchaseOrder();

    如果**Factory中没有为你想要的类型生成特定的create***()方法,那么可以用基类EFactory的create(EClass class)方法,将要创建的类型作为参数传入即可。比如说,模型中用到Enumeration或者自定义的MapEntry,**Factory中就不 会有直接创建这两个类型的对象的方法,我们可以 用***Factory.eINSTANCE.create(**Package.eINSTANCE.getIntToIntEntry)来完成。
   **Package使得我们可以访问模型中的Ecore元数据,模型中的每个类、每个属性、每个引用都在**Package中对应一个int值。
   生成的**AdapterFactory类可以为特定的类型创建Adapter。

   4.代码的重新生成与合并
  
EMF 生成的类、接口、方法、域前面都有“@generated"标记,如果改变该标记,那么在重新生成代码的时候,这个标记下的部分保持不变,不会重新生成。 如果你修改了getName()方法的实现,也相应的修改了该方法前面的"@generated"标记,但是你既想保留自己对这个方法的修改,又想看看 EMF自动生成的这个方法是什么样子的,这时可以通过在该类文件中添加这样一个方法来实现:

<!---->/**
  *@generated
  
*/
public  String getNameGen()
{
}

   这个方法名字的末尾加上了Gen后缀,这样EMF在生成代码的时候发现你把getName()前面的“@generated"标记修改了,这时它会检查有 没有getNameGen()方法存在,如果有,就把getName的默认实现添加在这个方法里边。重新生成代码后,发现EMF为 getNameGen()方法添加了实现语句"return name".
   EMF代码生成器是从generator model (.genmodel文件)而不是core model(.ecore文件)来生成代码的,这里的generator model是core model的Decorator,其中的GenClass修饰EClass, GenFeature修饰EAttribute和EReference等,另外它还包含生成代码的包名,生成的Package和Factory类的前缀名 字等信息。
   generator model和ecore model分离的好处是,Ecore元模型只保存模型信息,而独立于代码生成相关的一些额外信息。坏处是两个模型可能出于不一致的状态,因此修改了 ecore模型后,应该在genmodel上重新导入ecore模型,以保持两个模型的一致性。

   
分享到:
评论

相关推荐

    Eclipse Modeling Framework (EMF) Developer Guide

    ### Eclipse Modeling Framework (EMF) Developer Guide 知识点概览 #### 1. EMF 框架程序员指南 **EMF Framework Programmer's Guide** 部分为开发人员提供了深入理解 EMF 核心框架所需的知识。这部分涵盖了如何...

    EMF Developer Guide

    总的来说,EMF Developer Guide是学习和应用EMF的关键参考资料,它为开发者提供了一个强大而灵活的工具,使模型驱动开发变得更加简单和高效。通过EMF,你可以利用模型的力量,提升软件开发的质量和效率。

    EMF 自学笔记5

    ### EMF自学笔记知识点详述 #### 一、EMF框架概述 EMF(Eclipse Modeling Framework)是Eclipse项目中的一个子项目,它提供了一套用于构建模型驱动的开发工具和应用程序的框架。EMF的主要目标是简化元数据驱动应用...

    EMF Eclipse Modeling Framework 第二版

    ### EMF Eclipse Modeling Framework 第二版 #### 一、概述 《EMF Eclipse Modeling Framework》第二版是由 Dave Steinberg、Frank Budinsky、Marcelo Paternostro 和 Ed Merks 四位专家编写的权威指南。本书是...

    Addison.Wesley.Eclipse.Modeling.Framework.A.Developers.Guide 中文版

    Addison.Wesley.Eclipse.Modeling.Framework.A.Developers.Guide 中文版

    emf文件格式详解

    **微软EMF文件格式详解.pdf**:这份文档很可能是微软官方或第三方专家提供的关于EMF格式的详细指南。通常,它会涵盖EMF的基本结构、记录类型、图形操作、颜色管理、图元定义等内容。通过阅读这份文档,读者可以了解...

    微软emf文件格式详解

    #### 二、EMF格式背景与特点 EMF格式的出现主要是为了满足日益增长的高质量图形处理需求。传统的WMF格式虽然也能够存储矢量图形信息,但在处理高分辨率输出时存在一定的局限性,尤其是在不同分辨率下无法保证图像...

    eclipse Modeling Framework

    Eclipse Modeling Framework: A Developer's Guide By Frank Budinsky, David Steinberg, Ed Merks, Raymond Ellersick, Timothy J. Grose Publisher : Addison Wesley Pub Date : August 11, 2003 ISBN : 0-...

    imdb2emf:将 IMDb 电影数据库解析为 EMF 模型

    imdb2emf:创建 EMF 模型或 TGraphs 的 IMDb 解析器这个小工具从 IMDb 文件创建一个 EMF 模型(或 )。用法您可以克隆这个存储库并安装 Leiningen 来解析 IMDb 文件,也可以下载一个没有依赖项的预编译 JAR。用法:...

    EMF文件提取文本,预览,打印

    4. **转换为图像**:有时候,将EMF文件转换为位图格式(如JPEG、PNG或BMP)可能是必要的,例如为了在网络上分享或在不支持EMF格式的设备上查看。这个过程称为渲染,需要将矢量图形转换为固定像素的图像。转换过程...

    将EMF图片格式转换成PNG

    EMF (Enhanced Metafile) 是Windows操作系统中用于存储矢量图形和光栅图像的文件格式,它在处理复杂的图形和图像是非常有效。而PNG(Portable Network Graphics)则是一种无损压缩的位图格式,广泛应用于网页设计、...

    EMF.rar_emf

    **EMF(Eclipse Modeling Framework)详解** EMF(Eclipse Modeling Framework)是Eclipse基金会下的一个开源项目,主要用于构建基于模型的软件开发环境。它为开发者提供了强大的模型化工具和框架,支持元数据驱动...

    emf文件和wmf的转换

    EMF(Enhanced Metafile)和WMF(Windows Metafile)是两种常见的矢量图形文件格式,主要用于存储图像数据,特别是在Windows操作系统环境下。这两种格式都允许无损缩放和复杂图形的绘制,但EMF是WMF的增强版本,提供...

    SVG转EMF的示例代码

    2. 使用Batik的SVGGeneratorContext和SVGGraphics2D创建一个SVG到EMF的转换上下文。 3. 将SVG图形渲染到SVGGraphics2D对象中。 4. 使用转换上下文将SVGGraphics2D对象写入EMF输出流,通常是FileOutputStream。 5. ...

    blueprints-emf:蓝图的 EMF 绑定(用于 EMF 的 GraphDB)

    蓝图 EMF 使用将模型存储在图形数据库中,例如 Neo4J、OrientDB、Titan 等...。 当前版本是 0.3.0。 依赖关系 蓝图 2.6.0 或更高版本 安装 将在 maven central 上可用。 现在做 git clone ...

Global site tag (gtag.js) - Google Analytics