<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    MDA之路

    MDA,UML,XML,Eclipse及Java相關的Blog
    posts - 53, comments - 494, trackbacks - 0, articles - 2
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    漫談OCL概念、特征和實踐

    Posted on 2005-04-04 22:42 wxb_nudt 閱讀(3421) 評論(7)  編輯  收藏 所屬分類: 技術雜談

    漫談OCL概念、特征和實踐

    閑聊:

    Jos WarmerObject Constraint Language, The: Getting Your Models Ready for MDA, Second Edition》終于看完了。這是一本不可多得的好書,一本好書可以讓人節約很多的時間,其實我一直在尋找MDA相關規范的書,這本OCL是我認為最好的一本。關于MOF規范一直沒有由淺入深的教程。XMI倒是有一本《精通XMI》,不過也不甚精彩。UML當然汗牛充棟,這倒不必多說了。

    OCL概念

    我的BLOG上面兩篇都是介紹OCL的,導致人氣低迷,本來關注MDA技術的人就不多,關注OCL的就更少了。不過無論如何,OCLMDA技術中不可缺少的部分。OCL雖然號稱“對象約束語言”,不過實際上可以用來約束MOF四層模型中任意一層的模型以及實例。它真正的意義是建模相關領域約束語言。

    除了約束模型以外,OCL的一個重要用途是可以用來描述模型轉換規則。雖然這并不是OCL的主要用途(我沒有仔細查閱OCL規范,不知道是否在規范中正式提出過這個用途),但是很多研究者進行了研究和探索。其中Jos Warmer專門在一節中討論了這個問題。下面是摘自他文章中的一個用OCL描述模型轉換的例子:

    1.  自然語言描述的轉換規則

    ·         For each class named className in the PIM, there is a class named className in the PSM.

    ·         For each public attribute named attributeName : Type of class className in the PIM the following attributes and operations are part of the class className in the target model.

    - A private attribute with the same name: attributeName : Type

    - A public operation named with the attribute name, preceded with 'get' and the attribute type as return type: getAttributeName() : Type

    - A public operation named with the attribute name, preceded with 'set' and with the attribute as parameter and no return value: setAttributeName(att : Type)

    從上面可以知道,這是一個將PIM中的class轉換為PSMclass的規則,以及為private屬性添加gettersetter方法。

    2.  OCL寫的轉換規則,其中用到了作者自己發明的偽符號

    Transformation ClassToClass (UML, UML) {

      source c1: UML::Class;

      target c2: UML::Class;

      source condition -- none

      target condition -- none

      mapping

             try PublicToPrivateAttribute on

                            c1.features <~> c2.features;

             -- everything else remains the same

    }

    Transformation PublicToPrivateAttribute (UML, UML) {

      source sourceAttribute : UML::Attribute;

      target targetAttribute : UML::Attribute;

             getter          : UML::Operation;

             setter          : UML::Operation;

      source condition

             sourceAttribute.visibility = VisibilityKind::public;

      target condition

             targetAttribute.visibility = VisibilityKind::private

             and -- define the set operation

             setter.name = 'set'.concat(targetAttribute.name)

             and

             setter.parameters->exists( p |

                           p.name = 'new'.concat(targetAttribute.name)

                           and

                           p.type = targetAttribute.type )

             and

             setter.type = OclVoid

             and -- define the get operation

             getter.name = 'get'.concat(targetAttribute.name)

             and

             getter.parameters->isEmpty()

             and

             getter.returntype = targetAttribute.type;

      mapping

             try StringToString on

                         sourceAttribute.name <~> targetAttribute.name;

             try ClassifierToClassifier on

                          sourceAttribute.type <~> targetAttribute.type;

    }

    -- somewhere the rules StringToString and ClassifierToClassifier

    -- need to be defined

    看來作者很有興趣擴展OCL,將它變為Model Transformation Language。

    另外,Kent大學的研究者D.H.Akehurst在《Relations in OCL》(http://www.cs.kent.ac.uk/pubs/2004/2007/index.html)一文中專門做出了探索。這篇文章的大意是:擴展目前的OCL,將Relation(關系)作為first class(第一性的)元素加入OCL語言,然后利用Relation和目前的OCL相結合來描述模型轉換規則(這篇文章我也許會在以后專門討論)。中文的例子比較長,相關知識較多,就不列舉了。

    OCL特征

    關于OCL的特征書中做出了總結,這里我沒有回頭仔細找,而是就腦海中最深的一些映像說幾點。

    OCL是一個查詢性的語言,也就是說任何OCL的動作都不會對模型本身造成任何的影響或者改變。例如select操作,選出原來Set的一個子集,collect操作,將原來集合中的一些元素的值組成另一個集合。這些操作都不會對模型本身造成影響,最多就是構建了另外的對象或者集合。

    OCL是一個強類型的語言,任何一個元素,都是有類型的,并且任何操作的返回值一定有一個確定的類型。如果不能確定類型,那么此元素屬于OclVoid類型的值UndefinedOCL的類型有三種:基本類型(Integer,Boolean等)、Collection類型(五種,虛類型Collection,以及它的子類型Set,OrderedSet,BagSequence)和自定義類型(UML類,Association,Enumeration等等)。

    OCL里面很強調時間點,任何操作都定義為瞬時完成的,即操作中模型的狀態不會改變。基于實現考慮,這么規定有一定的道理,不然在多線程系統中,OCL約束很有可能失效。另外preconditionpostcondition也明確規定是在方法執行的前后時間點才有約束,時間點不對約束無效。

    OCL是一個宣言式(Declarative)的語言,描述了what to do,沒有描述how to do。例如self.attribute->select(i| i.name = ‘wxb_nudt’)描述了將某個類的所有attribute組成一個集合,然后將屬性名為wxb_nudt的屬性提取出來組成一個子集(顯然這樣的屬性不會多于一個,但這并不是我們關心的問題)。這個表達式描述以上的目的,但是沒有給出執行過程。

    OCL是基于集合論和謂詞邏輯的,這點從它的表達式中可以很輕易的看出來。但是并不是集合論中所有的集合操作在OCL中都具有相應的符號表達。例如映射(project)就沒有。而且OCL沒有證明集合論中的所有集合操作都可以用OCL中現有的操作組合出來。但是我們相信這一點(盲目的,我沒有時間去證明這個,呵呵)。另外關于OCL操作的中止性沒有得到證明,也就是說“不能確定每個OCL操作都可以在有限時間內完成”,并且OCL并不能保證任意的OCL表達式是可中止的(我感覺自己簡直就在說廢話)。其實OCL已經說明了,無論如何實現,OCL假定所有表達式的計算都在瞬間完成。

    雖然這部分內容在前面的blog中提到過,不過那個時候僅僅是照本宣科,和現在心有所感是不一樣的。

    OCL實踐

    目前OCL沒有標準的實現,Jos Warmer在他的個人網站上列出了目前可用的OCL實現列表http://www.klasse.nl/ocl/ocl-services.html。

    其中我選擇了Kent大學的OCL實現。還是kent大學的D.H.Akehurst,他們的research team開發了一個KMFKent Model Framework),其中有一個OCL的實現??梢杂脕眢w驗一下用OCL來編程(編程?不是建模么?)。下載地址http://www.cs.kent.ac.uk/projects/ocl/

    需要給他們寫email才能得到下載地址。

    然后Zurich大學的一位研究人員寫了這個版本的OCL的簡單實踐http://www.zurich.ibm.com/~wah/doc/emf-ocl/,源代碼如下:

    import java.util.List;

     

    import org.eclipse.emf.ecore.EAttribute;

    import org.eclipse.emf.ecore.EClass;

    import org.eclipse.emf.ecore.EcoreFactory;

    import org.eclipse.emf.ecore.EcorePackage;

     

    import uk.ac.kent.cs.kmf.util.ILog;

    import uk.ac.kent.cs.kmf.util.OutputStreamLog;

    import uk.ac.kent.cs.ocl20.OclProcessor;

    import uk.ac.kent.cs.ocl20.bridge4emf.EmfOclProcessorImpl;

     

    public class OCLDemo {

     

           public static boolean checkOCLConstraint(OclProcessor processor, String expr, Object model) {

                  List l = processor.evaluate(expr, model);

                  return Boolean.valueOf(l.get(0).toString()).booleanValue();

           }

          

           public static void main(String[] args) {

                  ILog log = new OutputStreamLog(System.err);

                  OclProcessor processor = new EmfOclProcessorImpl(log);

                  System.out.println(processor.evaluate("1+1"));

     

                  processor.addModel(EcorePackage.eINSTANCE);

                  EClass eClass = EcoreFactory.eINSTANCE.createEClass();

                  eClass.setName("Library");

                  EAttribute attr = EcoreFactory.eINSTANCE.createEAttribute();

                  attr.setName("books");

                  attr.setEType(EcorePackage.eINSTANCE.getEInt());

                  eClass.getEStructuralFeatures().add(attr);

                 

                  System.out.println(processor.evaluate("context ecore::EClass " +

                                "inv:self.eAttributes->select(x|x.name='books')", eClass));

                 

                  System.out.println(processor.evaluate("context ecore::EClass " +

                                "inv:self.eAttributes->exists(x|x.name='books' and x.eType.name = 'EInt')", eClass));

                 

                  boolean pre = checkOCLConstraint(processor, "context ecore::EClass inv: not self.oclIsUndefined()",eClass);

                  // do something with eClass

                  boolean post = checkOCLConstraint(processor, "context ecore::EClass inv: self.eAttributes->forAll(c| not c.changeable)",eClass);

                  if (!(!pre | post))

                         System.out.println("OK.");

                  else

                         System.out.println("Ooops.");

                 

           }

    }

    我在Eclipse3.0.1EMF2.0以及上面下載的OCLjava包環境下運行了這個例子,結果如下:

    [2]

    [[org.eclipse.emf.ecore.impl.EAttributeImpl@62937c (name: books) (ordered: true, unique: true, lowerBound: 0, upperBound: 1) (changeable: true, volatile: false, transient: false, defaultValueLiteral: null, unsettable: false, derived: false) (iD: false)]]

    [true]

    OK.

    例子很簡單,詳細的解釋在上面鏈接的文章中解釋了。但是這個例子僅僅構造了一個簡單的ECore模型,而且是在程序中構造的,不是使用EclipseUML或者EMF畫出來的,另外如何將OCL和模型連接起來也沒有提到。如果有時間,我會看看KMF的文檔,應該有答案。

    后記

    目前對OCL有了基本的把握,現在缺少的就是一個具體系統的構建實踐。希望在EclipseEMF、EclipseUMLKMF的環境下來完成這個例子。


    評論

    # re: 漫談OCL概念、特征和實踐  回復  更多評論   

    2005-12-26 15:47 by 李海燕
    我剛才看了你上面說的轉換方式,以及與此相關的相關內容,我自己做了一個blog,我們公司也有自己的網站但是我試著用了以上你所說的方法,發現好象沒有達到預期的效果,例如我用了你說的怎樣把html轉換為xml語言的代碼,但是發現它是自動轉換為html的,并且在預瀏覽時看不到預期如你所說的效果,到底是什么原因我最后看到的還是html語言,他們到底如何實現有效的轉換呢?請高手指教,我的msn是xglhyaizhongguo@msn.com,希望您可以和我探討這個問題。謝謝!。。。。。

    # re: 漫談OCL概念、特征和實踐  回復  更多評論   

    2005-12-26 18:14 by wxb_nudt
    你的回帖貼錯地方了吧?這篇隨筆沒有提到從HTML到XML的轉換啊。那應該是XSLT相關的內容吧。
    我不用MSN的,qq和郵箱都有,你可以用郵件和我聯系。

    # re: 漫談OCL概念、特征和實踐  回復  更多評論   

    2006-09-05 17:41 by Martin Li
    你好,我是最近才接觸到OCL的,想對它有一些了解,別人給我推薦的書就是Object Constraint Language, The: Getting Your Models Ready for MDA, Second Edition。你那里有電子版嗎,如果有能否發給我一份謝謝,我的郵箱fflgy@yahoo.com.cn

    # 文章巨好,頂!!  回復  更多評論   

    2007-09-09 09:43 by MDA中人
    斑竹,你好,我一直在找OCL的相關規范,你看的Jos Warmer的Object Constraint Language, The: Getting Your Models Ready for MDA, Second Edition。你那里有電子版嗎,如果有能否發給我一份謝謝,我的郵箱zh.hdong@163.com。

    # re: 漫談OCL概念、特征和實踐  回復  更多評論   

    2007-12-05 13:22 by 千尋
    你好,我最近才接解MDA相關的,也想看看你推薦的這本OCL書籍,如果有電子版的話,能否給我發一份,謝謝了哈,偶的郵箱是hongyuanjx2002@163.com

    # re: 漫談OCL概念、特征和實踐  回復  更多評論   

    2009-01-14 17:45 by 初學MDA
    你好,我是剛剛接觸MDA,關于OCL的書籍(中文的更好!),能給我也發一份電子版的嗎?謝謝!我的郵箱:hellochenyj@163.com

    # re: 漫談OCL概念、特征和實踐  回復  更多評論   

    2013-01-12 10:28 by lincoln
    文章寫得很好!贊一個!

    我想問一下《Object Constraint Language, The: Getting Your Models Ready for MDA, Second Edition》這本書有沒有隨書光盤或者書中示例文件的下載地址?

    我想看著實際例子來學,效果會非常好。
    主站蜘蛛池模板: 四虎国产精品免费视| 亚洲午夜精品一区二区| 国产在线播放线91免费| 亚洲一区免费观看| 日本无吗免费一二区| 国产无遮挡无码视频免费软件| 亚洲国产精品张柏芝在线观看| 国产精品酒店视频免费看| 免费无码又爽又刺激一高潮| 国产亚洲精品bv在线观看| 亚洲宅男天堂在线观看无病毒| 1024免费福利永久观看网站| 一本久久A久久免费精品不卡| 亚洲男女一区二区三区| 亚洲日本一区二区一本一道 | 最近免费视频中文字幕大全| 亚洲AV永久无码精品放毛片| 亚洲中文字幕无码一久久区| 最近中文字幕mv手机免费高清| a级日本高清免费看| 亚洲成a人片在线观看天堂无码| 亚洲av日韩av天堂影片精品| 免费一级毛片在线观看| 91香蕉视频免费| 国内精品免费视频精选在线观看| 校园亚洲春色另类小说合集 | 麻豆亚洲AV成人无码久久精品 | 日本特黄特色aa大片免费| 亚洲电影免费在线观看| 一级毛片在线播放免费| 亚洲砖码砖专无区2023| 亚洲高清在线mv| 亚洲国产精品无码成人片久久| 性做久久久久免费观看| 美女被免费喷白浆视频| 一级毛片不卡片免费观看| 中文字幕av无码不卡免费| 国产精品观看在线亚洲人成网| 亚洲粉嫩美白在线| 亚洲国产高清在线精品一区 | 亚洲人成色在线观看|