軟件建模與UML第八章對(duì)象約束語(yǔ)言_第1頁(yè)
軟件建模與UML第八章對(duì)象約束語(yǔ)言_第2頁(yè)
軟件建模與UML第八章對(duì)象約束語(yǔ)言_第3頁(yè)
軟件建模與UML第八章對(duì)象約束語(yǔ)言_第4頁(yè)
軟件建模與UML第八章對(duì)象約束語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩106頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第八章對(duì)象約束語(yǔ)言第一節(jié)OCL概述第二節(jié)OCL語(yǔ)法第三節(jié)標(biāo)準(zhǔn)OCL類型第四節(jié)OCL表達(dá)式第五節(jié)OCL在UML建模中的應(yīng)用

第一節(jié)OCL概述UML的圖形如類圖、用例圖等,通常不可能詳細(xì)地表達(dá)系統(tǒng)的各個(gè)細(xì)節(jié),為了表達(dá)這些細(xì)節(jié)問(wèn)題,需要為建模對(duì)象添加一些約束。這些約束可以使用自然語(yǔ)言來(lái)表達(dá),但是自然語(yǔ)言的二義性增加了約束表達(dá)的復(fù)雜性和不可確定性。為解決約束表達(dá)的問(wèn)題,OCL應(yīng)運(yùn)而生了。

第一節(jié)OCL概述對(duì)象約束語(yǔ)言(ObjectConstrainLanguage,簡(jiǎn)稱OCL)是UML的子標(biāo)準(zhǔn),是一種能用于構(gòu)造軟件模型的建模語(yǔ)言。第一節(jié)OCL概述OCL的特性:OCL是一種精確的、無(wú)二義性的形式化語(yǔ)言,易于掌握和使用。OCL既具有良好的數(shù)學(xué)背景,又沒(méi)有使用晦澀的數(shù)學(xué)符號(hào)。OCL的基礎(chǔ)是集合論和三值Kleene邏輯,并且它有一個(gè)形式化的數(shù)學(xué)語(yǔ)義,因此它可以明確地、無(wú)歧異地表示模型元素。

第一節(jié)OCL概述OCL是強(qiáng)類型的語(yǔ)言,任何表達(dá)式的值都屬于一個(gè)類型。這個(gè)類型可以是預(yù)定義的標(biāo)準(zhǔn)類型(如String或Integer型),也可以是UML圖中的元素(如具體的對(duì)象),還可以是這些元素構(gòu)成的集合(如對(duì)象的Set,Bag和sequencetypes等)。作為類型語(yǔ)言,OCL表達(dá)式的校驗(yàn)是在建模期間而不是執(zhí)行期間進(jìn)行的,因此,模型中的錯(cuò)誤能在早期就被發(fā)現(xiàn)并修改。第一節(jié)OCL概述OCL是聲明式的語(yǔ)言,其表達(dá)式的計(jì)算將返回一個(gè)值,不會(huì)改變系統(tǒng)的狀態(tài),沒(méi)有副作用,從而使得UML中的表達(dá)式被提升到了純建模的領(lǐng)域。而不必考慮實(shí)現(xiàn)時(shí)的細(xì)節(jié)和具體語(yǔ)言。OCL是一種制定約束和查詢的文本語(yǔ)言,除了可用于編寫(xiě)導(dǎo)航表達(dá)式、布爾表達(dá)式和其他查詢語(yǔ)句外,還可用于構(gòu)建約束、監(jiān)護(hù)條件、動(dòng)作、前置和后置條件、斷言和其他UML表達(dá)式。第一節(jié)OCL概述OCL是一種規(guī)范說(shuō)明性語(yǔ)言,所有與實(shí)現(xiàn)有關(guān)的問(wèn)題都不能用OCL來(lái)表達(dá)。OCL不是一種程序設(shè)計(jì)語(yǔ)言,不能用OCL編寫(xiě)程序邏輯和控制流程。第一節(jié)OCL概述OCL具體語(yǔ)言可以用于許多不同的目的:作為一種查詢語(yǔ)言。在類模型中,指定與類和類型有關(guān)的不變式。為原型和屬性指定一種類型不變式。為屬性指定派生規(guī)則。描述關(guān)于操作和方法的前置條件和后置條件。描述遷移。為消息和動(dòng)作指定一個(gè)目標(biāo)和一個(gè)目標(biāo)集合。第一節(jié)OCL概述

在UML模型中指定任意表達(dá)式,如與行為(Behavior)、參數(shù)(Parameters)、變更觸發(fā)器(ChangeTriggers)和時(shí)間觸發(fā)器(TimeTriggers)、及生命線(LifeLines)相關(guān)聯(lián)的那些表達(dá)式。第二節(jié)OCL語(yǔ)法OCL2.0在兩個(gè)層次上定義對(duì)象約束語(yǔ)言,一個(gè)是抽象語(yǔ)法(或元模型),另一個(gè)是具體語(yǔ)法。后者真正用于在UML模型中指定約束和進(jìn)行查詢。元模型定義OCL概念和應(yīng)用該概念的規(guī)則(或抽象語(yǔ)法),這與UML元模型對(duì)圖的概念和用于UML圖的規(guī)則進(jìn)行定義的方式相同。具體語(yǔ)法實(shí)現(xiàn)抽象語(yǔ)法。

第二節(jié)OCL語(yǔ)法1)抽象語(yǔ)法抽象語(yǔ)法指的是OCL語(yǔ)言定義的概念層。在UML中,抽象語(yǔ)法表示為解釋“類是什么”或“操作是什么”等的元模型(M2層),而不是創(chuàng)建一個(gè)具體的類或操作,UMLM2層一般將類描述為“具有相同的特征、約束和語(yǔ)義說(shuō)明的一組對(duì)象”,并將類解釋為可以與任何數(shù)目的特性(或?qū)傩裕?、操作、關(guān)系甚至嵌套類相關(guān)聯(lián)。第二節(jié)OCL語(yǔ)法2)具體語(yǔ)法與面向規(guī)則的抽象語(yǔ)法相反,具體語(yǔ)法應(yīng)用抽象語(yǔ)法的規(guī)則來(lái)創(chuàng)建可以在運(yùn)行時(shí)段計(jì)算的表達(dá)式。OCL表達(dá)式與類元相關(guān)聯(lián),應(yīng)用于該類元自身或某個(gè)屬性、操作或參數(shù)。不論哪種情況,約束都是根據(jù)其位移(replacement)、上下文類元(contextualclassifier)和OCL表達(dá)式的自身實(shí)例(selfinstances)來(lái)定義的。第二節(jié)OCL語(yǔ)法“位移”是UML模型中使用的OCL表達(dá)式所處的位置,即作為依附某個(gè)類元的不變式、依附于某個(gè)操作的前置條件或依附于某個(gè)參數(shù)的默認(rèn)值。“上下文類元”定義在其中計(jì)算表達(dá)式的名字空間。例如,前置條件的“上下文類元”是在其中定義該前置條件的操作所歸屬的那個(gè)類。也就是說(shuō),該類中的所有模型元素(如屬性、關(guān)聯(lián)和操作)都可以在OCL表達(dá)式中被引用。第二節(jié)OCL語(yǔ)法

“自身實(shí)例”是對(duì)計(jì)算該表達(dá)式的對(duì)象的引用。它總是“上下文類元”的一個(gè)實(shí)例。也就是說(shuō),OCL表達(dá)式對(duì)該“上下文類元”的每個(gè)實(shí)例計(jì)算結(jié)果可能不同。因此,OCL可以用于計(jì)算測(cè)試數(shù)據(jù)。第三節(jié)標(biāo)準(zhǔn)OCL類型OCL是一種強(qiáng)類型語(yǔ)言,每一表達(dá)式的值都屬于某一類型。圖8-1顯示了OCL中預(yù)定義的類型以及從UML模型派生的類型的層次結(jié)構(gòu)。“Classfier”是一個(gè)基本類型,包含UML基礎(chǔ)結(jié)構(gòu)的分類器的所有子類型。VoidType是一個(gè)與所有類型均具有一致性的類型。VoidType類型只有一個(gè)實(shí)例,稱為OclViod。TupleType類型(非正式的記錄類型或結(jié)構(gòu)體類型)將不同類型組合到一起形成一個(gè)新的類型。第三節(jié)標(biāo)準(zhǔn)OCL類型圖8-1OCL類型核心元模型的抽象語(yǔ)法層次結(jié)構(gòu)第三節(jié)標(biāo)準(zhǔn)OCL類型

OCL標(biāo)準(zhǔn)庫(kù)定義了多種類型,如圖8-2所示。注意:OCL標(biāo)準(zhǔn)庫(kù)中定義的類型都是其抽象語(yǔ)法類的實(shí)例。標(biāo)準(zhǔn)庫(kù)處在建模層即M1層,抽象語(yǔ)法處于元模型層即M2層。第三節(jié)標(biāo)準(zhǔn)OCL類型圖8-2OCL標(biāo)準(zhǔn)庫(kù)中的類型定義第三節(jié)標(biāo)準(zhǔn)OCL類型1、OclAny和OclViod類型2、OclMessage類型3、基本類型4、集合類型5、類型一致性6、類型轉(zhuǎn)換

1、OclAny和OclViod類型1)OclAny在OCL標(biāo)準(zhǔn)庫(kù)中,OclAny類型是所有UML模型和基本類型的超類型,UML模型所有的類都繼承由OclAny定義的特性。為了避免模型特性的名字與從OclAny繼承的特性名字發(fā)生沖突,OclAny特性名字都以“Ocl”開(kāi)頭。1、OclAny和OclViod類型OclAny類型上的操作表1、OclAny和OclViod類型2)OclVoid類型OclVoid與其它所有類型都具有一致性。OclVoid僅有一個(gè)稱為OclUndefined的實(shí)例。contextOclVoidinv:OclVoid.allinstances()->size()=1除oclIsUndefined()操作之外,任何應(yīng)用在OclUndefined類型上的屬性調(diào)用結(jié)果都是OclUndefined類型。2、OclMessage類型OclMessage事實(shí)上是一個(gè)帶有參數(shù)“T”的模板類型,一個(gè)具體的OclMessage類型通過(guò)傳遞一個(gè)操作或信號(hào)參數(shù)代替“T”而被創(chuàng)建。

下表是有關(guān)OclMessage的操作。3、基本類型定義在OCL標(biāo)準(zhǔn)庫(kù)中的基本類型有:Integer,Real,String和Boolean。除此之外,OCL還在基本類型上定義了一些操作,如下表所示。4、集合類型OCL中還定義了一些較為高級(jí)的標(biāo)準(zhǔn)OCL類型,稱為集合類型。集合類型是成組的對(duì)象或元素,可以作表達(dá)式計(jì)算過(guò)程的結(jié)果。在OCL標(biāo)準(zhǔn)庫(kù)中,集合類型包括Collection抽象類型,還有Set、Bag、OrderedSet和Sequence。:1)Collection類型Collection類型是其他集合類型的超類型。4、集合類型定義在Collection類型上的操作

操作說(shuō)明size():Integer返回指定Collection中的元素個(gè)數(shù)count(object:T):Integer返回參數(shù)對(duì)象在指定Collection中出現(xiàn)的次數(shù)includes(object:T):Boolean當(dāng)對(duì)象是指定Collection的一個(gè)元素時(shí),返回真excludes(object:T):Boolean當(dāng)對(duì)象不被包含在指定Collection中時(shí),返回真includesAll(c2:Collection(T)):Boolean當(dāng)指定Collection包含參數(shù)c2中所有元素時(shí),返回真excludesAll(c2:Collection(T)):Boolean當(dāng)指定Collection不包含參數(shù)c2中任何元素時(shí),返回真isEmpty():Boolean當(dāng)指定Collection不包含任何元素時(shí),返回真notEmpty():Boolean當(dāng)指定Collection至少有一個(gè)元素時(shí),返回真sum():T返回指定Collection中所有元素的和product(c2:Collection(T2)):Set(Tuple(first:T,second:T2))返回指定Collection與c2Collection的迪卡爾積Iterate()訪問(wèn)集合中的元素并查詢或計(jì)算表達(dá)式4、集合類型2)Set類型Set類型是不包括重復(fù)元素的對(duì)象組,Set類型中的元素是無(wú)序的。4、集合類型

定義在Set類型上的操作

操作說(shuō)明union(s:Set(T)):Set(T)返回指定Set與參數(shù)s的聯(lián)合體,結(jié)果是Set類型union(bag:Bag(T)):Bag(T)返回指定Set與參數(shù)bag的聯(lián)合體,結(jié)果是Bag類型=(s:Set(T)):Boolean當(dāng)指定Set與s包含相同的元素時(shí),返回真intersection(s:Set(T)):Set(T)返回指定Set與參數(shù)s的交集intersection(bag:Bag(T)):Set(T)返回指定Set與參數(shù)bag的交集–(s:Set(T)):Set(T)返回指定Set與參數(shù)s的差集including(object:T):Set(T)返回包含在指定Set中的所有元素以及參數(shù)對(duì)象的Setexcluding(object:T):Set(T)返回指定Set中的除參數(shù)對(duì)象以外的所有元素的SetsymmetricDifference(s:Set(T)):Set(T)返回包含在指定Set和參數(shù)Set中,但不同時(shí)包含在這兩個(gè)Set中的元素組成的Setcount(object:T):Integer返回參數(shù)對(duì)象在指定Set中出現(xiàn)的次數(shù)asSet():Set(T)返回指定Set本身asOrderedSet():OrderedSet(T)返回指定Set中移除所有重復(fù)元素后,所有元素以隨機(jī)順序組成的OrderedSetasSequence():Sequence(T)返回指定Set中所有元素的以隨機(jī)順序組成的SequenceasBag():Bag(T)返回包含Set中所有元素的Bag4、集合類型3)OrderedSet類型OrderedSet類型是不包括重復(fù)元素,并且有序的對(duì)象組。

4、集合類型定義在OrderedSet類型上的操作

操作說(shuō)明append(object:T):OrderedSet(T)返回指定OrderedSet所有元素,并在后面加上參數(shù)對(duì)象object組成的OrderedSetprepend(object:T):OrderedSet(T)返回參數(shù)對(duì)象object并在后面加上指定OrderedSet所有元素組成的OrderedSetinsertAt(index:Integer,object:T):rderedSet(T)返回在指定位置插入?yún)?shù)對(duì)象object后所組成的OrderedSetsubOrderedSet(lower:Integer,upper:Integer):OrderedSet(T)返回指定OrderedSet中從lower到upper位置元素組成的子OrderedSetat(i:Integer):T返回指定OrderedSet中第i個(gè)位置的元素indexOf(obj:T):Integer返回參數(shù)對(duì)象obj在指定OrderedSet中出現(xiàn)有位置索引first():T返回指定OrderedSet的第一個(gè)元素last():T返回指定OrderedSet的最后一個(gè)元素4、集合類型4)Bag類型Bag類型也是對(duì)象組,Bag類型與Set類型的不同之處在于Bag類型中可以包含重復(fù)元素。

4、集合類型定義在Bag類型上的操作

操作說(shuō)明=(bag:Bag(T)):Boolean當(dāng)指定Bag與參數(shù)bag包含相同的元素時(shí),返回真<>(bag:Bag(T)):Boolean當(dāng)指定Bag與參數(shù)bag不包含相同的元素時(shí),返回真union(bag:Bag(T)):Bag(T)返回指定Bag與參數(shù)bag的聯(lián)合體,結(jié)果是Bag類型union(set:Set(T)):Bag(T)返回指定Bag與參數(shù)set的聯(lián)合體,結(jié)果是Bag類型intersection(bag:Bag(T)):Bag(T)返回指定Bag與參數(shù)bag的交集intersection(set:Set(T)):Set(T)返回指定Bag與參數(shù)set的交集including(object:T):Bag(T)返回包含在指定Bag中的所有元素以及參數(shù)對(duì)象的Bagexcluding(object:T):Bag(T)返回指定Bag中除參數(shù)對(duì)象以外的所有元素的Bagcount(object:T):Integer返回參數(shù)對(duì)象在指定Bag中出現(xiàn)的次數(shù)asBag():Bag(T)返回指定Bag本身asSequence():Sequence(T)返回以隨機(jī)順序包含Bag中所有元素的SequenceasSet():Set(T)返回Bag中移除所有重復(fù)元素后所有元素組成的SetasOrderedSet():OrderedSet(T)返回Bag中移除所有重復(fù)元素后所有元素以隨機(jī)順序組成的OrderedSet4、集合類型5)Sequence類型Sequence類型和Bag類型類似,也可以包含重復(fù)元素,不過(guò)Sequence類型中的元素是有序的。

4、集合類型

定義在Sequence類型上的操作

操作說(shuō)明count(object:T):Integer返回參數(shù)對(duì)象在指定Sequence中出現(xiàn)的次數(shù)=(s:Sequence(T)):Boolean當(dāng)指定Sequence與參數(shù)Sequence中包含相同的元素、相同的元素出現(xiàn)次數(shù)以及相同的元素順序時(shí),返回真<>(s:Sequence(T)):Boolean當(dāng)指定Sequence與參數(shù)Sequence中不包含相同的元素、相同的元素出現(xiàn)次數(shù)以及相同的元素順序時(shí),返回真union(s:Sequence(T)):Sequence(T)返回指定Sequence與參數(shù)Sequence的聯(lián)合序列,即聯(lián)合后的Sequenceappend(object:T):Sequence(T)返回包含在指定Sequence中的所有元素,并在后面加上參數(shù)對(duì)象的Sequenceprepend(object:T):Sequence(T)返回由參數(shù)對(duì)象加上指定Sequence中的所有元素組成的SequenceinsertAt(index:Integer,object:T):Sequence(T)返回將參數(shù)對(duì)象object插入到給定index位置后,所有元素組成的SequencesubSequence(lower:Integer,upper:Integer):Sequence(T)返回指定Sequence中從lower到upper位置的元組成的子Sequenceat(i:Integer):T返回指定Sequence中第i個(gè)位置的元素indexOf(obj:T):Integer返回參數(shù)對(duì)象obj在指定Sequence中的索引號(hào)4、集合類型

定義在Sequence類型上的操作

操作說(shuō)明first():T返回Sequence中的第一個(gè)元素last():T返回Sequence中的最后一個(gè)元素including(object:T):Sequence(T)返回包含在指定Sequence中的所有元素,并加上參數(shù)對(duì)象作為最后一個(gè)元素的Sequenceexcluding(object:T):Sequence(T)返回指定Sequence中除參數(shù)對(duì)象以外的所有元素的SequenceasBag():Bag(T)返回包含所有重復(fù)元素的在內(nèi)的所有Sequence元素組成的BagasSequence():Sequence(T)返回指定Sequence本身asSet():Set(T)返回指定Sequence中移除所有重復(fù)元素后所有元素組成的SetasOrderedSet():OrderedSet(T)返回指定Sequence中移除所有重復(fù)元素后所有元素組成的OrderedSet5、類型一致性O(shè)CL的類型層次結(jié)構(gòu)決定了不同類型之間的一致性。例如不能讓Integer類型的變量跟Boolean或String的變量進(jìn)行比較。只有滿足類型一致性的表達(dá)式才是有效的表達(dá)式。如果出現(xiàn)類型不匹配時(shí),OCL就會(huì)包含類型一致性錯(cuò)誤。如果無(wú)論任何時(shí)候type1的一個(gè)實(shí)例均能用type2的一個(gè)實(shí)例來(lái)代替,那么稱類型Type1與類型Type2一致。5、類型一致性類型一致性規(guī)則:

任何類型都與它的超(上級(jí))類型一致類型一致性具有可傳遞性類型一致性具體自反性5、類型一致性

OCL中類型一致性表

類型一致于條件Set(T1)Collection(T2)ifT1conformstoT2Sequence(T1)Collection(T2)ifT1conformstoT2Bag(T1)Collection(T2)ifT1conformstoT2IntegerRealOclVoidTheothertypeinOCL6、類型轉(zhuǎn)換某些情況下,我們希望能夠使用一個(gè)對(duì)象的屬性,這個(gè)屬性的類型是當(dāng)前已知類型的子類型。由于其類型在當(dāng)前類型范圍內(nèi)未定義,這將導(dǎo)致類型一致性錯(cuò)誤。當(dāng)確定兩個(gè)類型一致之后,對(duì)象可以使用oclAsType(OclType)操作進(jìn)行類型轉(zhuǎn)換。例如,可以用如下表達(dá)式將類型為T(mén)ype1的對(duì)象轉(zhuǎn)換為T(mén)ype2類型的對(duì)象。object.oclAsType(Type2)--evaluatestoobjectwithtypeType2第四節(jié)OCL表達(dá)式OCL表達(dá)式核心元模型的抽象語(yǔ)法層次結(jié)構(gòu)參見(jiàn)圖8-3

,充分體現(xiàn)了OCL與UML元模型之間的關(guān)系。定義了OCL中可以使用的各種表達(dá)式類型。第四節(jié)OCL表達(dá)式圖8-3OCL表達(dá)式核心元模型的抽象語(yǔ)法層次結(jié)構(gòu)第四節(jié)OCL表達(dá)式圖8-4ModelPropertyCallExp類型細(xì)節(jié)圖第四節(jié)OCL表達(dá)式ModelPropertyCallExtp表達(dá)式涉及模型中的屬性、操作或關(guān)聯(lián)端。ModelPropertyCallExtp元類有三個(gè)子類型:AttributeCallExp、OperationCallExp和AssociationEndCallExp,表示source的特征。因?yàn)槠渌恍?duì)象常常要調(diào)用這些屬性,一個(gè)ModelPropertyCallExtp有一個(gè)OclExpression作為Source。例如,在表達(dá)式Employee.getsalary()中,Employee是OclExpression,它是getsalary()部分的source,而getsalary()部分是ModelpropertyCallExp的一個(gè)實(shí)例。第四節(jié)OCL表達(dá)式

作用于collection上的循環(huán)表達(dá)式是LoopExp元類的實(shí)例。例如,collection→forA11(elem|elem

staitisfiesacondition)

其中的forAll操作是循環(huán)表達(dá)式LooPExepressions的一個(gè)實(shí)例。每個(gè)循環(huán)表達(dá)式都有一個(gè)source,該source是一個(gè)collection或一個(gè)作為collection來(lái)處理的實(shí)例,并可以用OCL表達(dá)式來(lái)描述。循環(huán)體部分表明collection的哪些元素需要被考慮。第四節(jié)OCL表達(dá)式

IfExp用于描述依據(jù)判斷條件二選一的抽象語(yǔ)法。

OclMessageExp多用于描述通信(操作調(diào)用或信號(hào)發(fā)送)發(fā)生。

VariableExp是指變量相關(guān)表達(dá)式,包括self、result所指的變量以及由Let表達(dá)式所定義的變量。

LiteralExp是一個(gè)無(wú)參數(shù)的表達(dá)式,產(chǎn)生一個(gè)值,這個(gè)值通常是一個(gè)符號(hào)表達(dá)式,比如,一個(gè)Integer類型的數(shù)值“1”,或者是一個(gè)文本串“’thisisaLiteralExp”。第四節(jié)OCL表達(dá)式1、OCL表達(dá)式的特點(diǎn)2、OCL的表達(dá)式示例與語(yǔ)法3、中綴運(yùn)算符4、操作符優(yōu)先級(jí)5、關(guān)鍵字6、注釋

1、OCL表達(dá)式的特點(diǎn)OCL表達(dá)式用于對(duì)一個(gè)OCL類型求值,它具有如下特點(diǎn):1)OCL表達(dá)式可以附加在模型元素上,模型元素的所有實(shí)例都應(yīng)該滿足表達(dá)式的條件。2)OCL表達(dá)式可以附加在操作上,附加在操作上的表達(dá)式要指定執(zhí)行一個(gè)操作前應(yīng)該滿足的條件(前置條件)或一個(gè)操作完成后必須滿足的條件(后置條件)。1、OCL表達(dá)式的特點(diǎn)3)OCL表達(dá)式可以指定附加在模型元素上的監(jiān)護(hù)條件。4)OCL表達(dá)式的計(jì)算原則是從左到右。計(jì)算子表達(dá)式得到一個(gè)具體的值或一個(gè)具體類型的對(duì)象。5)OCL表達(dá)式既可以使用基本類型又可以使用集合類型。2、OCL的表達(dá)式示例與語(yǔ)法字符和變量是最簡(jiǎn)單的表達(dá)式,self表達(dá)式引用類元的一個(gè)實(shí)例。23——字符表達(dá)式V一一變量表達(dá)式self——self表達(dá)式.P.name()——操作調(diào)用.substring(2)一一嵌套操作調(diào)用Set{1,2}->size——集合上的操作調(diào)用3+2——中綴表達(dá)式self.age——屬性訪問(wèn)2、OCL的表達(dá)式示例與語(yǔ)法通過(guò)操作調(diào)用及“if-then-else”結(jié)構(gòu)可建立起復(fù)雜的表達(dá)式。ifx.mod(2)=0then‘even’e1se‘odd’Endif——if表達(dá)式2、OCL的表達(dá)式示例與語(yǔ)法OCL表達(dá)式的語(yǔ)法用擴(kuò)展的巴斯科范式(EBNF)定義,在EBNF中,“|”表示選擇,“?”表示可選項(xiàng),“*”表示一次或多次。OCL基本表達(dá)式的語(yǔ)法用EBNF定義如下:PrimaryExpression:=Literalcollection|Literal|PathnametimeExpression?featureCallParameters?|”(“expression”)”|ifExpression2、OCL的表達(dá)式示例與語(yǔ)法Literal:=<String>|<number>|”#”<name>timeExpression:=”@”<name>featrueCallParameters:=”(“declarator”)?(actualParameterList)?”)”ifExpression:=”if”expression“then”expression“else”expression“endif”2、OCL的表達(dá)式示例與語(yǔ)法從上面的定義可以看出,OCL的基本表達(dá)式可以是一個(gè)Literalcollection,Literalcollection代表Literal的集合類型。OCL的基本表達(dá)式可以是一個(gè)Literal,Literal可以是一個(gè)字符串、數(shù)字或者是“#”后面跟一個(gè)模型元素或操作的名字。2、OCL的表達(dá)式示例與語(yǔ)法OCL的基本表達(dá)式可以是一個(gè)包含可選項(xiàng)的路徑名,后面的可選項(xiàng)中包括時(shí)間表達(dá)式(timeExpression)、限定符(Qualifer)、或特征調(diào)用參數(shù)(featrueCallParameters)。OCL的基本表達(dá)式還可以是一個(gè)條件表達(dá)式“ifExpression”。3、中綴運(yùn)算符OCL的中綴運(yùn)算符有:+、-、*、/、<、>、<>、<=、>=、And、Or、Xor等。4、操作符優(yōu)先級(jí)操作符的優(yōu)先級(jí):按照從高到低來(lái)進(jìn)行;使用小括號(hào)時(shí),從最內(nèi)到最外進(jìn)行計(jì)算。

5、關(guān)鍵字與程序設(shè)計(jì)語(yǔ)言一樣,OCL也定義了一些關(guān)鍵字。and、attr、context、def、else、endif、endpackage、if、implies、in、inv、let、not、oper、or、package、post、pre、then、xor。以上OCL關(guān)鍵字是保留字,它們不能作為一個(gè)包(package)、類型(type)或者屬性(property)等的名稱在表達(dá)式中出現(xiàn)。6、注釋在OCL中,使用現(xiàn)兩個(gè)連續(xù)短劃線表示注釋符,從這兩個(gè)短劃線開(kāi)始,一直到換行符為上的內(nèi)容都是注釋。例如:--thisisacomment第五節(jié)OCL在UML建模中的應(yīng)用為了便于本節(jié)的描述,我們使用圖8-5所示的類圖作為本節(jié)的例子。第五節(jié)OCL在UML建模中的應(yīng)用圖8-5UML類圖示例第五節(jié)OCL在UML建模中的應(yīng)用1、OCL與UML元模型2、用OCL表達(dá)對(duì)象性質(zhì)約束3、OCL的支持工具

1、OCL與UML元模型1)上下文(context)上下文是約束所依附的模型元素。UML模型中OCL上下文是用以保留字“context”開(kāi)頭的表達(dá)式來(lái)描述的。例如,contextPerson::income(d:Date):Integerpost:result=5000此例中,后置條件約束的上下文為Person類的income(d:Date)操作。1、OCL與UML元模型2)包的上下文當(dāng)用作分類器的包與外界環(huán)境關(guān)系清晰時(shí),上述的上下文聲明已經(jīng)足夠精確。當(dāng)情況復(fù)雜時(shí),為了說(shuō)明不變量、前置條件、后置約束條件屬于那個(gè)包,這些約束可以包含在“package”和“endpackage”聲明之間。

1、OCL與UML元模型包上下聲明語(yǔ)法如下:package

Package::SubPackagecontextXinv:...someinvariant...context

X::operationName(..)pre:...someprecondition...endpackage

1、OCL與UML元模型3)self每一個(gè)OCL表達(dá)式都存在于一個(gè)具體描述類型實(shí)例的上下文中。OCL表達(dá)式中,用保留字“self”來(lái)表示上下文實(shí)例。例如,context

Person::getCurrentSpouse():Personpre:self.isMarried=truebody:self.mariages->select(m|m.ended=false).spouse

此例中,對(duì)操作約束的上下文是Company,self就指的是Company的一個(gè)實(shí)例。子表達(dá)式self.isMarried的值是對(duì)象Person(用self標(biāo)識(shí))屬性isMarried的值,其類型為Boolean。1、OCL與UML元模型4)操作體表達(dá)式一個(gè)OCL表達(dá)式可以用來(lái)說(shuō)明一個(gè)查詢操作的結(jié)果。語(yǔ)法如下:contextTypename::operationName(param1:Type1,...):ReturnTypebody:--someexpression1、OCL與UML元模型操作體表達(dá)式的類型必須與操作返回的類型一致。與前置、后置條件一樣,表達(dá)式中也可使用參數(shù)。在操作聲明之后,前置、后置條件表達(dá)式,操作體表達(dá)式可以混合使用。例如:contextPerson::getCurrentSpouse():Personpre:self.isMarried=truebody:self.mariages->select(m|m.ended=false).spouse1、OCL與UML元模型5)初始值和派生值OCL表達(dá)式可以表示屬性或關(guān)聯(lián)端的初始值和派生值。語(yǔ)法如下:context

Typename::attributeName:Typeinit:--someexpressionrepresentingtheinitialvaluecontext

Typename::assocRoleName:Typederive:--someexpressionrepresentingthederivationrule

1、OCL與UML元模型此處,初始值和派生值表達(dá)式的類型必須跟屬性的結(jié)果類型一致。當(dāng)上下文是關(guān)聯(lián)端時(shí),如果關(guān)聯(lián)端的多重性為0..1,表達(dá)式類型必須與關(guān)聯(lián)端分類器一致。如果關(guān)聯(lián)端的多重性為1..*,表達(dá)式的類型與Set或OrderedSet類型一致。初始值和派生值可以在同一個(gè)上下文中混合使用。

1、OCL與UML元模型例如:contextPerson::income:Integerinit:parents.income->sum()*1%--pocketallowancederive:if

underAgethen

parents.income->sum()*1%--pocketallowanceelse

job.salary--incomefromregularjobendif1、OCL與UML元模型前置條件中的初值的表示方法前置條件中對(duì)象屬性的值是上次操作后的返回值。為了引用操作前的值,OCL使用“@pre”后綴來(lái)達(dá)到獲取操作前值的目的。例如,ContextPerson::birthdayHappens()Post:age=age@pre+1屬性age的值是一個(gè)Person對(duì)象執(zhí)行此操作的值,屬性age@pre的值為此操作前的值,即前置條件初始值。1、OCL與UML元模型6)前置條件中的初值的表示方法前置條件中對(duì)象屬性的值是上次操作后的返回值。為了引用操作前的值,OCL使用“@pre”后綴來(lái)達(dá)到獲取操作前值的目的。例如,ContextPerson::birthdayHappens()Post:age=age@pre+1屬性age的值是一個(gè)Person對(duì)象執(zhí)行此操作的值,屬性age@pre的值為此操作前的值,即前置條件初始值。1、OCL與UML元模型7)Let表達(dá)式OCL可以使用Let表達(dá)式定義變量,一旦該變量被定義,就可以整個(gè)約束中使用這個(gè)變量。例如:contextPersoninv:letincome:Integer=self.job.salary->sum()inifisUnemployed

thenincome<100elseincome>=100endif1、OCL與UML元模型8)definition約束為了能夠讓變量或操作在多個(gè)OCL表達(dá)式中重用,OCL使用definition約束定義在計(jì)算上下文類元的任何時(shí)候都可使用的變量的方式。definition約束必須依附于類,并且只能包含變量或者操作,作用域只能在同一個(gè)上下文。其語(yǔ)法與Let表達(dá)式類似,但每個(gè)屬性和操作都以“def”為前綴。1、OCL與UML元模型例如:contextPersondef:income:Integer=self.job.salary->sum()def:nickname:String=’LittleRedRooster’def:hasTitle(t:String):Boolean=self.job->exists(title=t)2、用OCL表達(dá)對(duì)象性質(zhì)約束所謂對(duì)象性質(zhì),就是一個(gè)對(duì)象的屬性、操作等與對(duì)象有關(guān)的特性,在建模中具體是指定義的模型元素的特性。以下是用OCL表達(dá)對(duì)模型元素的性質(zhì)的約束幾種常見(jiàn)情況。

1)屬性約束建模不變量:常用于附加在模型元素上,在屬性的生命期內(nèi)一直保持為真的規(guī)則。例如ContextPersoninv:Self.allInstances->forAll(P1,P2|P1<>P2impliesP1.PId<>P2.PId)2、用OCL表達(dá)對(duì)象性質(zhì)約束多數(shù)情況下,上下文十分明確,關(guān)鍵字“self”可以省略??梢远x一個(gè)不同的名稱代替“self”,例如:Contextc:Company

inv:c.numberofEmployees>50可以把約束名稱寫(xiě)在保留字“inv”的后面,并允許用這個(gè)名稱引用它表的約束。下面這個(gè)例子中的約束名稱是enoughEmployees。Contextc:Company

inv

enoughEmployees:c.numberofEmployees>502、用OCL表達(dá)對(duì)象性質(zhì)約束變量約束:Let表達(dá)式附加在模型元素的屬性上,它通常用于定義約束中的一個(gè)變量。比如一個(gè)學(xué)生類的屬性綜合評(píng)分“totalscore”是由成績(jī)得分“score”和附加分“addings”組成的。ContextStudentinv:Let

totalscore:Integer=self.score->sumIfnoAddingsthen

totalscore<=80Else

totalscore>=20endif2、用OCL表達(dá)對(duì)象性質(zhì)約束2)對(duì)操作約束建模OCL表達(dá)式附加操作上可以規(guī)定一個(gè)前置條件或后置條件。前置條件指的是操作開(kāi)始執(zhí)行前必須為真的條件,后置條件指的是操作成功執(zhí)行后必須為真的條件。前置條件用保留字“Pre”標(biāo)識(shí),后置條件用保留字“post”標(biāo)識(shí)。contextTypename::operationName(param1:Type1,...):ReturnTypepre:param1>...post:result=...2、用OCL表達(dá)對(duì)象性質(zhì)約束參數(shù)名也可以在OCL表達(dá)式中使用。例如,對(duì)一個(gè)公司雇用員工的操作可以附加前置條件和后置條件:Contextcompany::hirEmployee(p:person)Pre:notemployee->include(p)--前置條件Post:employee->include(p)andstockprice()=stockprice@pre+5--后置條件2、用OCL表達(dá)對(duì)象性質(zhì)約束類似于不變量,前置條件和后置條件也可以有自己的條件名,分別寫(xiě)在保留字“pre”和“post”的后面,并可用條件名(前置或后置條件名)來(lái)引用它所代表的條件約束。例如:contextTypename::operationName(param1:Type1,...):ReturnTypepreparameterOk:param1>...postresultOk:result=...此OCL表達(dá)式中,使用前的置條件名稱為parameterOk,后置條件名稱為resultOk。UML元模型中,這些名稱是從模型元素(metElement)繼承而來(lái)的元類約束的屬性名稱的值。3、OCL的支持工具OCL的支持工具一般具有如下主要功能。語(yǔ)法分析類型檢查邏輯一致性檢查代碼生成動(dòng)態(tài)驗(yàn)證不變式動(dòng)態(tài)驗(yàn)證前/后置條件測(cè)試自動(dòng)化與CASE工具的集成3、OCL的支持工具下面是幾種典型的OCL工具。1)ModelRun

ModelRun由Boldsoft公司所開(kāi)發(fā),用于驗(yàn)證模型。它是一個(gè)對(duì)OCL表達(dá)式進(jìn)行處理的商業(yè)化工具。該工具支持的建模工具有RationalRoes2、BoldforDelphi等。

3、OCL的支持工具M(jìn)odelRun有如下特點(diǎn):對(duì)模型中的OCL表達(dá)式作語(yǔ)法檢查和類型檢查。約束可用來(lái)驗(yàn)證模型,在該工具中,可對(duì)創(chuàng)建的對(duì)象執(zhí)行模型的約束。OLC表達(dá)式編輯器允許手工引入約束并可使用編輯器中提供的選項(xiàng),這些選項(xiàng)主要是為構(gòu)建正確的OCL表達(dá)式提供向?qū)ё饔谩O衿渌腛CL工具一樣,ModelRun不會(huì)直接修改UML模型。UML模型的引入是通過(guò)XML文件來(lái)進(jìn)行。OCL表達(dá)式分析器是ModelRun的一部分,因此不能使用它作為模型獨(dú)立的工具。比如,該分析器不能用來(lái)對(duì)單獨(dú)的OCL表達(dá)式作語(yǔ)法分析。3、OCL的支持工具2)OCLCheckerOCLChekcer是Jos

Warrmer開(kāi)發(fā)的一種直觀易用的OCL表達(dá)式分析器,其最終版支持OCLI.4規(guī)范,OCLChecker由單個(gè)文件(ocl.jar)組成。OCLChecker僅僅能被用作為獨(dú)立于模型的工具,因?yàn)樗鼪](méi)有提供與UML模型連接的方式。相對(duì)其它的OCL分析器而言,OCLChekcer的主要缺點(diǎn)是其功能僅限于對(duì)OCL語(yǔ)言作語(yǔ)法分析,它既沒(méi)有考慮類型檢查也沒(méi)有考慮約束的一致性檢查。3、OCL的支持工具3)DresdenOCL編譯器:一種開(kāi)源的模塊化工具,它是Dresdne技術(shù)大學(xué)FrankFinger開(kāi)發(fā)的,其目的是由OCL表達(dá)式生成Java代碼,并且在運(yùn)行時(shí)計(jì)算OCL表達(dá)式。3、OCL的支持工具DresdenOCL編譯器包含四個(gè)功能模塊:解析器、語(yǔ)義分析、規(guī)范化、代碼生成。解析器是由SableCC解析器生成器根據(jù)OCL文法產(chǎn)生的。解析器把輸入的OCL表達(dá)式轉(zhuǎn)化為抽象語(yǔ)法樹(shù),抽象語(yǔ)法樹(shù)為該工具中的其它功能模塊構(gòu)成了通用數(shù)據(jù)表示。語(yǔ)義分析作簡(jiǎn)單的一致性檢查和類型檢查。規(guī)范化通過(guò)簡(jiǎn)化解析器產(chǎn)生的抽象語(yǔ)法樹(shù)使得代碼生成階段變得更容易,也即減少了代碼生成的復(fù)雜性。代碼生成模塊的作用是把OCL表達(dá)式轉(zhuǎn)化為相應(yīng)的可執(zhí)行代碼。3、OCL的支持工具4)USE:由Bremen大學(xué)MarkRichters開(kāi)發(fā)的一種OCL工具。其功能如下:對(duì)UML和OCL描述進(jìn)行語(yǔ)法檢查。通過(guò)對(duì)對(duì)象、屬性、聯(lián)系的操縱來(lái)產(chǎn)生系統(tǒng)狀態(tài)。表示出系統(tǒng)的狀態(tài)圖中的對(duì)象。3、OCL的支持工具監(jiān)視模型的本質(zhì)特性和類圖中的不變式。執(zhí)行操作并監(jiān)視其前置條件和后置條件。表示出順序圖中的操作的調(diào)用順序。用OCL表達(dá)式查詢系統(tǒng)狀態(tài)。3、OCL的支持工具該工具主要的組件是一個(gè)模擬器和一個(gè)OCL解釋器。模擬器用于模擬UML模型,解釋器則主要是用于驗(yàn)證模型中的OCL約束。模型是系統(tǒng)的描述,系統(tǒng)狀態(tài)則是運(yùn)行著的系統(tǒng)快照。USE工具用于操縱系統(tǒng)快照,并且因此根據(jù)系統(tǒng)的要求驗(yàn)證模型。在USE規(guī)范中,OCL約束描述了系統(tǒng)的要求,所以操縱系統(tǒng)快照期間驗(yàn)證了這些約束。

UML元模型

UML是通過(guò)一個(gè)元模型來(lái)正式定義的,元模型就是UML中結(jié)構(gòu)的模型。元模型本身也是用UML來(lái)表達(dá)的。這是一個(gè)元循環(huán)解釋的例子,即一種用自己來(lái)定義自己的語(yǔ)言。但也不完全是循環(huán)的,用于定義元模型的只是UML的一個(gè)小子集。從理論上說(shuō),可以從一個(gè)更基本的定義自行引導(dǎo)出這種定義的支點(diǎn)。但在實(shí)踐中,進(jìn)行這種探討是沒(méi)有必要的。因此,本書(shū)將其納入附錄以供讀者參閱。

UML元模型

模型是系統(tǒng)的完整抽象,圖則是模型或模型子集的圖形表示。按照面向?qū)ο蟮膯?wèn)題解決方案以及建立系統(tǒng)模型的要求,UML語(yǔ)言從4個(gè)抽象層次對(duì)UML語(yǔ)言的概念、模型元素和結(jié)構(gòu)進(jìn)行了全面定義,并規(guī)定了相應(yīng)的表示法和圖形符號(hào)。

UML體系結(jié)構(gòu)

UML具有一個(gè)四層體系結(jié)構(gòu),每個(gè)層次是根據(jù)該層中元素的一般性程度來(lái)劃分的。從一般到具體依次為元元模型層、元模型層、模型層和用戶對(duì)象層。圖F-1給出了UML的四層體系結(jié)構(gòu)。

UML體系結(jié)構(gòu)

圖F-1UML的四層體系結(jié)構(gòu)

UML體系結(jié)構(gòu)

1)元元模型(meta-metamodel)層的主要任務(wù)是定義用于規(guī)定元模型的語(yǔ)言,因此形成了元模型建模層次結(jié)構(gòu)的基礎(chǔ)。元元模型通常比它所描述的元模型具有更高的抽象級(jí)別、更加簡(jiǎn)潔。一個(gè)元元模型可以定義多個(gè)元模型,而每個(gè)元模型也可以與多個(gè)元元模型相關(guān)聯(lián)。在元元模型上的元元對(duì)象的例子有:元類、元屬性和元操作。

UML體系結(jié)構(gòu)

2)元模型(metamodel)是元元模型的實(shí)例,該層的主要任務(wù)是定義用于規(guī)定模型的語(yǔ)言

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論