<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相關(guān)的Blog
    posts - 53, comments - 494, trackbacks - 0, articles - 2
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Profile,Stereotype,TaggedValue與OCL漫談

    Posted on 2005-09-12 11:09 wxb_nudt 閱讀(2289) 評論(0)  編輯  收藏 所屬分類: 技術(shù)雜談

    Profile,Stereotype,TaggedValueOCL漫談

    起因

    事情的起因是由于我需要在一篇文章中使用一個(gè)UML Profile for Design Pattern,就是在上一篇blog中提到的那個(gè)Profile。但是當(dāng)我使用OCL來描述一些約束時(shí),突然發(fā)現(xiàn)我不知道如何去取得PatternClass這個(gè)Stereotype中的TaggedValue的一個(gè)名字為role的值。并非我對OCL不熟悉,而是由于我對StereotypeTaggedValue的精確關(guān)系不甚了解。于是我在qq群中求助,從而和阿飛展開了長達(dá)兩個(gè)多小時(shí)的討論,最后在他的幫助下總算略有所得,遂記之。

    問題的描述

    為了文章的完整性,我還是再簡要描述一下那個(gè)UML Profile for Design Pattern[1],如下所示:

    這個(gè)Profile中引入了三個(gè)Stereotype和三個(gè)標(biāo)簽值,其具體含義列表如下:

    Stereotype

    Applies To

    Definition

    <<PatternClass>>

    Class

    指出這個(gè)Class是設(shè)計(jì)模式中的一部分

    <<PatternAttribute>>

    Attribute

    指出這個(gè)Attribute是設(shè)計(jì)模式中的一部分

    <<PatternOperation>>

    Operation

    指出這個(gè)Operation是設(shè)計(jì)模式中的一部分

    TaggedValue表如下:

    Tagged Value

    Applies to

     

    Name

    Value

    pattern

    <name[instance],role>

    <<PatternClass>>

    指出了被附著的class在名為name的設(shè)計(jì)模式實(shí)例instance中扮演了role這個(gè)角色。

    pattern

    <name[instance],role>

    <<PatternAttribute>>

    指出了被附著的Attribute在名為name的設(shè)計(jì)模式實(shí)例instance中扮演了role這個(gè)角色。

    pattern

    <name[instance],role>

    <<PatternOperation>>

    指出了被附著的Operation在名為name的設(shè)計(jì)模式實(shí)例instance中扮演了role這個(gè)角色。

    具體的含義我已經(jīng)在上篇
    blog中介紹過。

    對于這樣一個(gè)Profile,我希望在使用OCL描述約束時(shí),能夠?qū)τ?/SPAN>TaggedValue中的nameinstancerole的具體值有所規(guī)定。例如一個(gè)具體的類MyDAO,它的Stereotype和標(biāo)簽值如下:<}>>。如果我希望有一個(gè)約束,表明MyDAO類的TaggedValuerole必須是DataAccessObject。則OCL如下:

    context MyDAO inv:

    ??????

    問題就在于如何使用OCL來描述這個(gè)與StereotypeTaggedValue相關(guān)的約束。因?yàn)閷τ?/SPAN>ClassStereotypeTaggedValue的關(guān)系不甚明了。

    問題的討論

    問題的討論是非常煩雜的,我偷個(gè)懶,把聊天記錄整理上來:

    wxb_nudt 19:48:35

    有這么一個(gè)OCL的問題。

    wxb_nudt 19:49:38

    一個(gè)Class,它有一個(gè)StereotypePatternClass),并且這個(gè)Stereotype有一個(gè)TaggedValue,如何在OCL表達(dá)式中引用這個(gè)標(biāo)簽值的值?

    wxb_nudt 19:49:48

    是不是

     Class inv:

     self.stereotype.taggedvalue.value?

    wxb_nudt 19:51:53

    老阿飛,出來跟俺討論一下吧,只有你通讀過UML2.0規(guī)范吧?

    阿飛外傳 21:42:29

    上面的是UML1.x的元模型吧

    wxb_nudt 22:06:15

    能說說我那個(gè)OCL應(yīng)該怎么寫么?

    阿飛外傳 22:11:45

    image001.jpgwxb_nudt 22:13:09

    讓我看看啊

    wxb_nudt 22:14:09

    modelElement可以直接引用stereotype

    wxb_nudt 22:14:48

    但是steretype可以直接引用taggedvalue么?stereotypemodelElement的一種么?

    wxb_nudt 22:14:53

    好像是的。

    wxb_nudt 22:15:11

    那么應(yīng)該是class.stereotype.taggedvalue.value!

    wxb_nudt 22:15:27

    是不是啊?阿飛?這個(gè)圖哪兒來的?

    阿飛外傳 22:19:04

    modelElement可以直接引用stereotype --- right

    但是steretype可以直接引用taggedvalue么?--- sure, but will go through TagDefinition

    stereotypemodelElement的一種么? --- right

    阿飛外傳 22:21:04

    是不是啊?阿飛?這個(gè)圖哪兒來的? --- UML1.4 semantic01-09-73

    阿飛外傳 22:22:21

    The data value of a tagged value must conform to the data type specified by the tagType

    attribute of the tag definition.

    -- cannot be specified with OCL (requires an OCL function that

    converts a string name into a corresponding metatype)

    阿飛外傳 22:29:26

    一個(gè)Class,它有一個(gè)StereotypePatternClass),并且這個(gè)Stereotype有一個(gè)TaggedValue,如何在OCL表達(dá)式中引用這個(gè)標(biāo)簽值的值?

    inv:

    self.taggedValue->forAll(v | v.dataValue = "theStringRepresentationOftheValue" imples v.type.tagType ="the

    TypeName")

    wxb_nudt 22:45:14

    wait

    wxb_nudt 22:47:23

    <>:

    self.taggedValue.value.name -> notEmpty

    這是一篇文章中的。

    wxb_nudt 22:49:25

    對于一個(gè)class,不需要引用Stereotype,直接使用self.taggedValue可以么?這個(gè)TagValue是附加在這個(gè)Stereotype上面的。

    wxb_nudt 22:51:55

    對于String類型的值,應(yīng)該可以直接這樣得到

    self.taggedValue.theStringRepresentationOftheValue

    wxb_nudt 22:52:20

    錯(cuò)了,應(yīng)該是self.taggedValue.theValuename

    阿飛外傳 22:53:55

    image002.jpg
    阿飛外傳
    22:55:16

    http://www.erp5.cn/forum/dispbbs.asp?boardID=3&ID=329&page=1

    wxb_nudt 22:55:22

    看看

    阿飛外傳 22:57:29

    <>:

    self.taggedValue.value.name -> notEmpty

    這是一篇文章中的。 --- 很可能是不正確的。

    wxb_nudt 22:58:11

    嗯,難道現(xiàn)在的UML2.0規(guī)范中沒有很明確的指出這些關(guān)系么?就像上面這張圖一樣的?

    wxb_nudt 22:59:28

    還有一個(gè)問題

    wxb_nudt 23:00:18

    taggedValue可以附加于每一個(gè)模型元素。如果一個(gè)Class,有一個(gè)Stereotype擴(kuò)展了它,這個(gè)Stereotype有一個(gè)標(biāo)簽值,那么這個(gè)標(biāo)簽值是否同時(shí)屬于這個(gè)class

    阿飛外傳 23:00:53

    對于一個(gè)class,不需要引用Stereotype,直接使用self.taggedValue可以么? --- 可以,也是profile的語用之一。

    這個(gè)TagValue是附加在這個(gè)Stereotype上面的。----- TagValueStereotype沒有什么包含關(guān)系, 一個(gè)TagValue的定義(TagDefinition)只是從值(TagValue)到型的一種聲明,是一種由值到類型的自底向上的宣告式分類方法。

    wxb_nudt 23:02:27

    有點(diǎn)明白了,StereotypeTagDefinition都是用來定義類型的,通俗的說。

    ClassTaggedValue就是這些類型的實(shí)例,是不是這樣的?

    wxb_nudt 23:02:55

    因此,從Class直接引用TaggedValue是很自然的。

    阿飛外傳 23:05:40

    taggedValue可以附加于每一個(gè)模型元素。如果一個(gè)Class,有一個(gè)Stereotype擴(kuò)展了它,這個(gè)Stereotype有(只是偶然關(guān)聯(lián)而不是"")一個(gè)標(biāo)簽值,

    那么這個(gè)標(biāo)簽值是否同時(shí)屬于這個(gè)class--- 標(biāo)記值屬于某個(gè)class,并不是Stereotype or TagDefinition使然,完全是用戶不小心加到某個(gè)class上的亂帖的小標(biāo)簽,至于這個(gè)標(biāo)簽,有什么有分類完全是另一回事。

    阿飛外傳 23:06:34

    至于這個(gè)標(biāo)簽,有沒有分類,是什么分類完全是另一回事。 

    阿飛外傳 23:06:53

    這是動態(tài)類型(分類)面向的。

    阿飛外傳 23:07:19

    或者說是:值面向的

    阿飛外傳 23:08:37

    或者說:值就是存在,并不需要類型的存在而存在。

    wxb_nudt 23:10:00

     似乎有點(diǎn)明白了。

    阿飛外傳 23:10:26

    因此基于profile機(jī)制的UML元對象(M2級物理實(shí)例)的(虛)slot可以動態(tài)擴(kuò)張的

    阿飛外傳 23:11:39

    這是由(ModelElement, taggedValue)關(guān)聯(lián)建立起來的

    wxb_nudt 23:12:16

    意思就是說,在模型元素上面,可以附加任意的值,這些值就用tag value來表示就可以了。

    阿飛外傳 23:13:51

    UML::ModelElement而言相當(dāng)于這樣:

    class UML::ModelElement {  List tagValue; //(虛)slot擴(kuò)展點(diǎn) } 

    阿飛外傳 23:14:04

    對。

    wxb_nudt 23:14:10

    嗯,現(xiàn)在明白了。

    wxb_nudt 23:14:19

    thank you

    阿飛外傳 23:15:17

    class UML::ModelElement { 

       List stereotypes ; //(虛)子類型擴(kuò)展點(diǎn)

       List tagValue; //(虛)slot擴(kuò)展點(diǎn)

    }  

    阿飛外傳 23:16:23

    class UML::ModelElement { 

       List stereotypes ; //(虛)子類型擴(kuò)展點(diǎn)

       List tagValue; //(虛)slot擴(kuò)展點(diǎn)

    } 

    wxb_nudt 23:16:25

    每個(gè)Class只能有一個(gè)Stereotype的,所以不應(yīng)該用   List stereotypes ;

    wxb_nudt 23:16:49

    因?yàn)楹髞淼?/SPAN>Stereotype會替換前面的。

    阿飛外傳 23:17:09

    每個(gè)Class只能有一個(gè)Stereotype --- 每個(gè)類不可能有多個(gè)子類?

    wxb_nudt 23:17:10

    UML2.0是這樣的,我不知道前面的規(guī)范如何。

    wxb_nudt 23:17:19

    我剛剛讀過。

    wxb_nudt 23:19:43

    找不到了,不過我記得是這樣的。

    阿飛外傳 23:20:16

      image003.jpg

    wxb_nudt 23:21:59

    可能我的方向搞反了,對于RemoteHome,它們都擴(kuò)展了Interface,而對于Interface,它可以擴(kuò)展為多個(gè)Stereotype

    wxb_nudt 23:22:22

    我的意思是,一個(gè)具體的Class,只能擁有一個(gè)Stereotype

    wxb_nudt 23:22:36

    你的意思是,一個(gè)模型元素可以擴(kuò)展為多個(gè)Stereotype

    wxb_nudt 23:24:29

    在一個(gè)系統(tǒng)中,這么寫:

    class UML::ModelElement { 

       List stereotypes ; //(虛)子類型擴(kuò)展點(diǎn)

       List tagValue; //(虛)slot擴(kuò)展點(diǎn)

    } 

    是正確的。因?yàn)樗磉@個(gè)系統(tǒng)中的某個(gè)模型元素?cái)U(kuò)展了哪些內(nèi)容。

    阿飛外傳 23:25:02

    一個(gè)具體的Class,只能擁有一個(gè)Stereotype --- 因?yàn)?/SPAN>OO的用戶級(M1)一個(gè)用戶設(shè)計(jì)對象只能歸屬到一個(gè)分類。

    一個(gè)模型元素可以擴(kuò)展為多個(gè)Stereotype --- 因?yàn)?/SPAN>M2的類型系統(tǒng)中,一個(gè)類可以有多個(gè)子類。

    wxb_nudt 23:25:17

    我的意思和你一樣。

    wxb_nudt 23:26:38

    TagDefinition中的TagType:Name

    Name是一個(gè)數(shù)據(jù)類型么?

    阿飛外傳 23:27:03

    TagDefinition中的TagType:Name

    Name是一個(gè)數(shù)據(jù)類型的名字

    wxb_nudt 23:28:51

    Tagged Value   Applies to             

    Name      Value                    

    pattern       <>   指出了被附著的class在名為name的設(shè)計(jì)模式實(shí)例instance中扮演了role這個(gè)角色。   

    wxb_nudt 23:29:14

    這樣一個(gè)TagValue,它的TagType的值是什么?

    wxb_nudt 23:30:45

    我對TaggedValueTagDefinition的關(guān)系感到很迷惑。

    阿飛外傳 23:31:11

    Tagged Value   Applies to             

    Name      Value                    

    pattern       <>   指出了被附著的class在名為name的設(shè)計(jì)模式實(shí)例instance中扮演了role這個(gè)角色。--- 這是一張表么,看不太清楚,能帖一圖么。

    wxb_nudt 23:31:20

    wait

    wxb_nudt 23:31:36

    image004.jpg
    阿飛外傳
    23:35:09

    相當(dāng)于:

    struct PatternAtt { String name; String role }

    class PatternClass

    {

       PatternAtt pa;

    }

    wxb_nudt 23:36:04

    其實(shí)我就想知道如何在OCL中表達(dá)role的取值。

    阿飛外傳 23:38:13

    它能給出具體的例子么

     wxb_nudt 23:38:53

    這么一個(gè)類 <}>>ConnectionPool

    wxb_nudt 23:40:02

    顯然它的TaggedValue的兩個(gè)值是nameAbstract FactoryroleAbstractFactory

    stereotype=PatternClass

    阿飛外傳 23:42:31

    [instance]是什么

    wxb_nudt 23:42:56

    它可以不出現(xiàn),你忽視它好了。

    阿飛外傳 23:43:34

    (前面我說的有誤,確實(shí)可以從作為導(dǎo)航入口點(diǎn),導(dǎo)航到TaggedValue

    wxb_nudt 23:44:39

    怎么導(dǎo)航呢?

    wxb_nudt 23:45:57

    ClassStereotypeTagDefinitionTaggedValue

    阿飛外傳 23:47:00

    因?yàn)?/SPAN>Stereotype 繼承自GeneralizedElement,后者繼承自ModelElement,而ModelElement有到TaggedValue的包括關(guān)聯(lián)。

    wxb_nudt 23:47:44

    那就是可以直接從ClassStereotype然后到TaggedValue

    wxb_nudt 23:48:14

    這個(gè)問題解決了,但是如何表達(dá)那個(gè)role的取值呢?

    wxb_nudt 23:50:06

    it's a big problem.

    wxb_nudt 23:55:16

    主要問題是如何從dataValue中取得role的值?

     

    阿飛外傳 23:55:14

    context PatternClass inv:

    self.stereotype.definedTag->forAll(td : TagDefinition |

        td.tagType = "AbstractFactory" imples td.typedValue.dataValue ="Abstract Factory[instance],AbstractFactory") and

    self.stereotype.definedTag->forAll(td : TagDefinition |

        td.tagType = "Iterator" imples td.typedValue.dataValue ="Iterator [instance],Iterator") and

    ...

    阿飛外傳 23:55:47

    需要串的操作設(shè)施。

    wxb_nudt 23:57:22

    我認(rèn)為td.tagType = "Pattern"

    wxb_nudt 23:59:39

    主要問題是如何從dataValue中取得role的值?

    role這個(gè)名字不是白定義了的。

    阿飛外傳 00:05:18

    因?yàn)檫@個(gè)paper把這些信息用串記錄在TaggedValuedataValue字段中,所以需要串處理。你可以用其它方式(actually, i am not suremaybe more detailed stereotype or taggedvalue

    wxb_nudt 00:10:57

    好吧,謝謝你了,我明天再仔細(xì)研究吧,晚安阿飛!

    結(jié)論整理

    結(jié)論一,UML的擴(kuò)展機(jī)制

    首先,對于Stereotype和標(biāo)簽值的擴(kuò)展機(jī)制,顯然下面這個(gè)式子是成立的:

    class UML::ModelElement {

       List stereotypes ; //(虛)子類型擴(kuò)展點(diǎn)

       List tagValue; //(虛)slot擴(kuò)展點(diǎn)

    } 

        它表明,對于某個(gè)UML的模型元素,可以擴(kuò)展為不同的Stereotype,也可以附加很多的標(biāo)簽值。有兩點(diǎn)需要注意的是:第一,對于某個(gè)具體的模型元素,它只能屬于一個(gè)Stereotype;第二,對于某個(gè)模型元素的標(biāo)簽值,標(biāo)簽值的名字是唯一的。也就是說,如果某個(gè)模型元素有多個(gè)標(biāo)簽值,并且它們的名字相同,那么它們是同一個(gè)標(biāo)簽值。

    結(jié)論二,模型元素、StereotypeTaggedValue的導(dǎo)航關(guān)系

    通過觀察上面的圖可以得知:ClassStereotype都屬于模型元素,它們都可以直接通過taggedValue導(dǎo)航到自己擁有的標(biāo)簽值。另外,Class可以通過stereotype導(dǎo)航到自己所屬的構(gòu)造型。

    結(jié)論三,TaggedValueTagDefinition的關(guān)系

    TaggedValue只有一個(gè)屬性,就是dataValue,它是一個(gè)String[*],可以包含字符串?dāng)?shù)組。所有的標(biāo)簽值的值都存儲在這個(gè)dataValue中。

    TagDefinition是標(biāo)簽值的數(shù)據(jù)結(jié)構(gòu)的描述,它有兩個(gè)屬性,tagTypeName,和mutiplicityMutiplicityNameMutiplicity都是數(shù)據(jù)類型,它們聯(lián)合起來定義了TaggedValue的數(shù)據(jù)結(jié)構(gòu)。

    TaggedValueTagDefinition之間可以通過typetypedValue來互相導(dǎo)航。

    結(jié)論四,如何表達(dá)tuple形式的TaggedValue

    這是昨晚沒有解決的問題,但是今天在一篇文章[2]中看見了相應(yīng)的例子。

    <>:

    self.baseClass = Class and self.taggedValue -> exists

    (tv:taggedValue | tv.name = "pattern" and tv.dataValue =

    "tuple")

    對于一個(gè)tuple來說,可以直接取值他的一個(gè)部分,就使用這個(gè)部分的名字即可。

    因此可以這樣得到role的值:

    class.stereotype.taggedValue.dataValue.role

    那篇文章中的一個(gè)表達(dá)式證實(shí)了這一點(diǎn):

    <>:

    self.taggedValue.dataValue.role -> notEmpty

    問題的解決

    一個(gè)具體的類MyDAO,它的Stereotype和標(biāo)簽值如下:<}>>。我希望有一個(gè)約束,表明MyDAO類的TaggedValuerole必須包含DataAccessObject角色。則OCL如下:

    context MyDAO inv:

    self.stereotype.taggedValue.dataValue.role->exists(“DataAccessObject”)

     

     Reference

    [1].    Extending UML To Visualize Design Patterns In Class Diagrams

    [2].    Visualizing Design Patterns With A UML Profile

     

    主站蜘蛛池模板: 久久久久亚洲精品美女| a级大片免费观看| 亚洲精品mv在线观看| av无码东京热亚洲男人的天堂| 久久免费的精品国产V∧| 免费无码专区毛片高潮喷水| 亚洲xxxxxx| 亚洲午夜久久影院| 国产亚洲精品无码拍拍拍色欲| 日本久久久免费高清| 国产精品入口麻豆免费观看| 成全高清在线观看免费| 无码AV动漫精品一区二区免费 | 久久精品亚洲日本波多野结衣| 内射干少妇亚洲69XXX| 亚洲精品无码AV人在线播放| 国产成人精品123区免费视频| 久久久久久国产a免费观看黄色大片 | 亚洲精品国自产拍在线观看| 最新中文字幕电影免费观看| 中文字幕亚洲免费无线观看日本| 怡红院免费全部视频在线视频| 日韩大片免费观看视频播放| 亚洲av日韩av永久无码电影| 亚洲成a人片在线看| 亚洲码一区二区三区| 亚洲AV无码成人精品区蜜桃| 亚洲无av在线中文字幕| 亚洲综合色成在线播放| 亚洲精品国产自在久久| 亚洲午夜AV无码专区在线播放| 一本久到久久亚洲综合| 国产成人免费网站在线观看| 四虎永久在线精品视频免费观看| 午夜一级免费视频| 国产嫩草影院精品免费网址| 香蕉视频在线观看免费国产婷婷| 免费看www视频| 在线观看永久免费视频网站| 日本久久久免费高清| 免费在线看片网站|