国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Eclipse Modeling Framework, 2nd Edition. (EMF)學習筆記

yacheng / 1396人閱讀

摘要:定義模型元模型用于表示中模型的模型稱為。用于表示的類型,它可以是基本類型,例如或對象類型等。此外,因為是貨物的容器并會在其中將貨物作為孩子序列化,所以需要標識出。

EMF介紹

為了理解EMF究竟是什么,你只需要知道一件事:“模型”(model)是什么?“模型”的目的是什么?

EMF不要求全新的方法論亦或是任何復雜的建模工具。只需要從Eclipse的Java開發工具著手開始。

EMF將建模概念直接與其實現相關聯,所以上手比較容易。

統一Java、XML和UML

  舉個編程實例,假設老板讓你編寫一個程序來管理供應商的采購清單。采購清單包含付款對象(bill to)和送貨對象(ship to)的地址,以及貨物的集合。其中,貨物信息包含名稱、數量、價格。

    //采購清單
    public intrerface PurchaseOrder
    {
        //送貨對象
        String getShipTo();
        void setShipTo(String value);
        
        //付款對象
        String getBillTo();
        void SetBillTo(String value);
        
        //貨物的集合
        List getItems();
    }
    //貨物信息
    public intrerface Item
    {
        //貨物名稱
        String getProductName();
        void setProductName(String value);
        
        //貨物數量
        int getQuantity();
        void setQuantity(int value);

        //貨物價格
        float getPrice();
        void setPrice(float value);    
    }

  從上面的接口著手,你將需要開始編寫應用程序的UI以及之后一系列工作。

  然而,這時候你的老板問你:“你不先建立模型嗎?”盡管你覺得有點多此一舉,但還是按吩咐建立了UML模型。

 接下來需要保存這些“模型”,然后你決定使用XML文件來解決,于是寫下了XML Schema來定義你XML文件的結構:

    
    
        
            
                
                
                
            
        
        
        
            
                
                
                
            
        
    

  在進行下一步工作前,你意識到,針對同一事物:程序的“數據模型”,你已經擁有三種不同的表示。于是你在思考:能不能只編寫三者中的一種模型,其他兩種從這一種模型中生成?更進一步,在這種模型中是否有足夠的信息來生成接口Java實現
  于是,EMF就出現了。EMF是一個框架和代碼生成工具,借助EMF這個橋梁,你可以用任意一種表示來定義一個模型,然后從中生成其他表示以及相應的實現類。下圖展示了EMF是如何統一Java、XML、UML的。

建模vs編程

  有個經常問到的問題:“我是該建模呢還是該編程?”,它的答案是:“都可以,建模亦或編程,這并不是問題。”在EMF看來。建模和編程可以被認為是等價的。
  對于初學者,相比于代碼,建模更容易使他們描述出應用程序的功能。如果你是個經驗豐富的程序員,如果對高階建模的想法沒有很大的信心,可將EMF看作建模的文雅介紹以及蘊含的優勢。你不必接觸一種全新的方法論,但你也能享受的建模的一些好處。
  如果你已經了解了建模的知識,甚至是MDA的重點,你應該講EMF看作在那個方向的一種技術。問題是高階建模語言還需要去學習,此外,因為我們將需要處理(例如調試)生成的Java代碼,所以還需要理解它們之間的映射。優秀的傳統Java編程是做這件事最簡單和最直接的方式。
  我們認為,EMF將建模與編程完美地相結合,以最大限度地發揮兩者的效果。
  在EMF看來,用戶和其他開發者不必去了解高階建模語言和生成的Java代碼之間的映射,這些映射讓Java程序員來理解是自然而又簡單的。同時,應用程序之間的細粒度數據集成;代碼生成產生的生產力增益,這些是建模的優勢。

定義模型 Ecore(元)模型

  用于表示EMF中模型的模型稱為Ecore。Ecore本身就是EMF模型,因此是它自己的元模型。也可以說Ecore是個元元模型
  元模型是模型的模型,如果該模型本身是一個元模型,那么這個元模型實際上就是元元模型。
  元模型的概念也能遞歸到元元元模型(meta-meta-metamodel)等等,但是我們目前用不到。
  下圖給出了一個簡化的Ecore元模型,說它是簡化的,是因為它只是Ecore元模型的子集,而且為了方便,將某些公共類省略,如ENamedElement類(定義了類中屬性的名字)。

  上圖中有EClass 、EAttribute 、EReference 、EDataType 四個類,這四個類都是元模型(位于MOF的M2層)。它們的模型又都是EClass,所以位于MOF的M3層的只有EClass ,所以EClass 也是元元模型,可參考下圖:

  需要四種Ecore類來表示我們的模型:
  1. EClass 用于表示模型中的類,它有一個name,0個或多個attributes,0個或多個references。
  2. EAttribute 用于表示模型中的attribute,它有一個name和一個type。
  3. EReference 用于表示兩個類之間的關聯,它有一個name,一個布爾值表示它是否是containment,還有一個引用類型(其它類)。
  4. EDataType 用于表示attribute的類型,它可以是基本類型,例如int 、 float 或對象類型 java.util.Date等。

  從圖中可以注意到Ecore類的名稱和UML中的非常相似,這并不奇怪,因為UML是統一建模語言。事實上,你也許會疑惑為什么EMF模型不是UML呢?EMF為什么還需要自己專門的Ecore模型?原因就是,Ecore是UML的簡化子集
  現在我們可以使用定義在Ecore中的類的實例,來描述應用程序模型中的類結構。

創建和編輯模型

  你可以從你開始的任何輸入形式中建立模型。如果從Java接口開始,EMF將分析并建立Ecore模型。如果從XML Schema開始,模型也將從中建立。如果從UML開始,將有三種可能性:
  1. 直接Ecore編輯。EMF有一個簡單的基于樹的樣本編輯器
  2. 從UML導入。EMF Project和EMF Model 向導(wizard)提供一個可擴展的框架,其中有模型導入器,支持不同的模型格式。
  3. 從UML導出。類似于第二種選擇,但是轉換支持是由UML工具專門提供的。
  也許你會想,第一種選擇是最好的,因為在開發過程中不需要導入和導出的步驟,也不必擔心Ecore模型與工具本身的模型不同步。
  第二種和第三種選擇的優點是,相比于EMF建模,你可以使用UML工具做得更多。

XMI序列化

  現在你也許會想Ecore模型的序列化形式是什么。上文中,這個“概念上的”模型已經被三種物理空間(Java代碼、XML Schema、UML圖)所表示。事實上,我們有另一種(即第四種)保存形式來作為權威性表示: XML Metadata Interchange (XMI)
  為什么不適用前三種形式中的一種呢?首先,Java代碼、XML Schema、UML圖都具有Ecore模型不需要的額外信息,然后,它們三個中沒有一個可以滿足所有EMF使用的場合。采購清單模型的Ecore XMI文件如下:



  
    
    
    
  
  
    
    
    
  

要導出EMF模型時,實際上就是導出EMF的XMI。

Java注釋

  EMF可以根據包含標準get()方法的接口,來生成模型屬性引用。但是,EMF不會盲目地將每一個接口方法都看作模型中的一部分。只有按照EMF特定的規范才可以生成(EMF使用JavaBeans簡單屬性訪問器命名模式的子集,具體規范可參考http://java.sun.com/products/...)。
  根據此規范,需要用@model標明需要用EMF生成模型的接口。例如前面給的PurchaseOrder接口就需要用下面的格式來生成UML:

    /**
     * @model
     */
    public interface PurchaseOrder
    {
         /**
         * @model
         */
          String getShipTo();
          
         /**
         * @model
         */
          String getBillTo();
          
         /**
         * @model type="Item" containment="true"
         */
          List getItems();
    }

  @model標簽是來將PurchaseOrder 標識為一個需要被建模的類。
  shipTo和billTo的類型是String,所以在@model標簽之后沒有額外的模型信息
  getItems()返回的是一個對象類型為Item的List,所以需要在@model標簽之后加上type="Item"。此外,因為getItems()是貨物的容器并會在其中將貨物作為孩子序列化,所以需要標識出containment="true"
  從Java 5.0 開始,泛型可以被用來指定List中對象的類型,從EMF 2.3開始,也可以支持泛型。
  我們注意得到在接口PurchaseOrder中沒有定義 setShipTo()setBillTo()方法,因為在EMF看來,只要get()方法的上面有注釋,如果沒有相應的set()方法,EMF就會自動生成set()方法并整合到接口中。

Ecore“藍圖”

  我們回顧一下前面的知識。
  - EcoreXMI序列化,是EMF的核心
  - Ecore模型的創建,有至少三種方式:UML模型XML Schema注釋后的Java接口
  - Ecore模型可以生成 Java 接口的實現代碼以及模型的其他形式
  使用XML Schema定義模型有個重要的優點:根據schema,可以序列化模型的實例來符合模型。除了簡單地定義模型,XML Schema也能指定模型實例的持久形式
  這里有個問題:“是否有其他持久形式?”答案是肯定的。例如RDB Schema。“藍圖”如下:

生成代碼

  EMF最大的優點就是自動生成代碼的效率很高。現在,在前面的基礎上,你只需要使用EMF Project 向導(自動加載了生成器)來創建項目,然后在菜單上選擇Generate Model Code

生成的模型類

  EMF生成的代碼是什么樣的呢?
  首先,Ecore類(比如一個EClass)對應Java中的接口以及其實現類。舉例子來說,PurchaseOrder的EClass對應的Java接口:

    public interface PurchaseOrder ...

  這個接口對應的實現類:

    public class PurchaseOrderImpl extends ... implements PurchaseOrder {

  這種接口-實現兩者分離(interface–implementation)是EMF青睞的設計選擇。因為這是任何一個類模型API(model-like API)最好的模式。例如,文檔對象模式(DOM)是這樣的,Eclipse的許多API也是如此。它也是支持Java中多重繼承的必要模式。
  其次,每個生成的接口都直接或間接擴展了基接口EObject

    public interface PurchaseOrder extends EObject {

  EMF中的EObject等價于java.lang.Object,它是所有建模對象的基礎。擴展的EObject引入了以下三種主要行為:
  1. eClass()返回對象的元對象(一個EClass)。
  2. eContainer()eResource() 返回的是對象里面包含的對象和資源
  3. eGet()eSet()eIsSet(),和eUnset()提供一個API,用來反射式訪問對象。
  然后,EObject還是另一個接口Notifier的擴展:

    public interface EObject extends Notifier {

  Notifier接口向建模對象中引入一個重要的特性:模型變更通知(notification),正如在觀察者模式(Observer design pattern)中。和對象持久性一樣,通知也是EMF對象的一個重要特征。
  最后,根據類型及用戶設定的屬性生成方法以及方法中的實例變量。例如:

    public String getShipTo()
    {
        return shipTo;
    }

  EMF會自動生成對應的set()方法并設置相同的變量,但是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));
    }

  可以看到,為了使方法更高效,當沒有觀察者時,為了避免調用eNotify()花費的高昂代價,EMF會添加一個eNotificationRequired()守衛條件。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/110376.html

相關文章

  • Eclipse Modeling Framework, 2nd Edition. (EMF)學習筆記

    摘要:定義模型元模型用于表示中模型的模型稱為。用于表示的類型,它可以是基本類型,例如或對象類型等。此外,因為是貨物的容器并會在其中將貨物作為孩子序列化,所以需要標識出。 EMF介紹 為了理解EMF究竟是什么,你只需要知道一件事:模型(model)是什么?模型的目的是什么? EMF不要求全新的方法論亦或是任何復雜的建模工具。只需要從Eclipse的Java開發工具著手開始。 EMF將建模概念...

    yagami 評論0 收藏0
  • EMF學習筆記(三)——使用EMF編程——持久化

    摘要:生成的包首次被訪問時,在全局包注冊表中自動地注冊。然而,類似于資源工廠注冊表,這種顯式注冊的過程僅當獨立運行時被要求,在下運行時通過擴展指針來自動地完成。通過使用合適的資源工廠,就可以確定被產生的和被使用的持久化形式。 持久化(Persistence)   EMF擁有一個強大的模型持久化框架。通過一個高度可定制資源實現(resource implementation)來支持XML序列化...

    villainhr 評論0 收藏0
  • EMF學習筆記(三)——使用EMF編程——持久化

    摘要:生成的包首次被訪問時,在全局包注冊表中自動地注冊。然而,類似于資源工廠注冊表,這種顯式注冊的過程僅當獨立運行時被要求,在下運行時通過擴展指針來自動地完成。通過使用合適的資源工廠,就可以確定被產生的和被使用的持久化形式。 持久化(Persistence)   EMF擁有一個強大的模型持久化框架。通過一個高度可定制資源實現(resource implementation)來支持XML序列化...

    helloworldcoding 評論0 收藏0
  • EMF學習筆記(二)——使用EMF編程——開發元數據

    摘要:使用元數據包中包含了中每一個被建模類對應的接口。任何對象的元數據是使用的實現來表示的。加載模型的序列化形式是個在運行期間獲取元數據的有效方法。反射提供一個反射式,可以檢查對象的元數據以及一般地訪問和操縱數據。 使用元數據   Java包org.eclipse.emf.ecore中包含了Ecore中每一個被建模類對應的接口。任何EMF對象的元數據是使用Ecore的實現(implement...

    Jiavan 評論0 收藏0
  • Java培訓學習之Java開源軟件的匯總

    摘要:開源軟件的匯總開源插件是一個類似于的插件,它可以幫助你在不退出的環境下瀏覽本地文件系統。事件模型支持基于的事件提交。開源容器是一個非侵入式的對象反轉控制容器容器。開源插件提供一個可針對文件語法進行著色的編輯器。 Java開源軟件的匯總:EcSplorer 【Java開源 Eclipse插件】EcSplorer(Eclips...

    qiangdada 評論0 收藏0

發表評論

0條評論

yacheng

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<