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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第八章對象約束語言第一節(jié)OCL概述第二節(jié)OCL語法第三節(jié)標準OCL類型第四節(jié)OCL表達式第五節(jié)OCL在UML建模中的應用

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

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

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

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

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

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

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

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

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

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

定義在Set類型上的操作

操作說明union(s:Set(T)):Set(T)返回指定Set與參數(shù)s的聯(lián)合體,結果是Set類型union(bag:Bag(T)):Bag(T)返回指定Set與參數(shù)bag的聯(lián)合體,結果是Bag類型=(s:Set(T)):Boolean當指定Set與s包含相同的元素時,返回真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ù)對象的Setexcluding(object:T):Set(T)返回指定Set中的除參數(shù)對象以外的所有元素的SetsymmetricDifference(s:Set(T)):Set(T)返回包含在指定Set和參數(shù)Set中,但不同時包含在這兩個Set中的元素組成的Setcount(object:T):Integer返回參數(shù)對象在指定Set中出現(xiàn)的次數(shù)asSet():Set(T)返回指定Set本身asOrderedSet():OrderedSet(T)返回指定Set中移除所有重復元素后,所有元素以隨機順序組成的OrderedSetasSequence():Sequence(T)返回指定Set中所有元素的以隨機順序組成的SequenceasBag():Bag(T)返回包含Set中所有元素的Bag4、集合類型3)OrderedSet類型OrderedSet類型是不包括重復元素,并且有序的對象組。

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

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

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

操作說明=(bag:Bag(T)):Boolean當指定Bag與參數(shù)bag包含相同的元素時,返回真<>(bag:Bag(T)):Boolean當指定Bag與參數(shù)bag不包含相同的元素時,返回真union(bag:Bag(T)):Bag(T)返回指定Bag與參數(shù)bag的聯(lián)合體,結果是Bag類型union(set:Set(T)):Bag(T)返回指定Bag與參數(shù)set的聯(lián)合體,結果是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ù)對象的Bagexcluding(object:T):Bag(T)返回指定Bag中除參數(shù)對象以外的所有元素的Bagcount(object:T):Integer返回參數(shù)對象在指定Bag中出現(xiàn)的次數(shù)asBag():Bag(T)返回指定Bag本身asSequence():Sequence(T)返回以隨機順序包含Bag中所有元素的SequenceasSet():Set(T)返回Bag中移除所有重復元素后所有元素組成的SetasOrderedSet():OrderedSet(T)返回Bag中移除所有重復元素后所有元素以隨機順序組成的OrderedSet4、集合類型5)Sequence類型Sequence類型和Bag類型類似,也可以包含重復元素,不過Sequence類型中的元素是有序的。

4、集合類型

定義在Sequence類型上的操作

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

定義在Sequence類型上的操作

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

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

OCL中類型一致性表

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

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

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

staitisfiesacondition)

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

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

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

VariableExp是指變量相關表達式,包括self、result所指的變量以及由Let表達式所定義的變量。

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

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

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

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

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

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

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

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

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

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

Typename::attributeName:Typeinit:--someexpressionrepresentingtheinitialvaluecontext

Typename::assocRoleName:Typederive:--someexpressionrepresentingthederivationrule

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

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

underAgethen

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

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

thenincome<100elseincome>=100endif1、OCL與UML元模型8)definition約束為了能夠讓變量或操作在多個OCL表達式中重用,OCL使用definition約束定義在計算上下文類元的任何時候都可使用的變量的方式。definition約束必須依附于類,并且只能包含變量或者操作,作用域只能在同一個上下文。其語法與Let表達式類似,但每個屬性和操作都以“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表達對象性質約束所謂對象性質,就是一個對象的屬性、操作等與對象有關的特性,在建模中具體是指定義的模型元素的特性。以下是用OCL表達對模型元素的性質的約束幾種常見情況。

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

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

inv

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

totalscore:Integer=self.score->sumIfnoAddingsthen

totalscore<=80Else

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

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

3、OCL的支持工具ModelRun有如下特點:對模型中的OCL表達式作語法檢查和類型檢查。約束可用來驗證模型,在該工具中,可對創(chuàng)建的對象執(zhí)行模型的約束。OLC表達式編輯器允許手工引入約束并可使用編輯器中提供的選項,這些選項主要是為構建正確的OCL表達式提供向導作用。像其它的OCL工具一樣,ModelRun不會直接修改UML模型。UML模型的引入是通過XML文件來進行。OCL表達式分析器是ModelRun的一部分,因此不能使用它作為模型獨立的工具。比如,該分析器不能用來對單獨的OCL表達式作語法分析。3、OCL的支持工具2)OCLCheckerOCLChekcer是Jos

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

UML元模型

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

UML元模型

模型是系統(tǒng)的完整抽象,圖則是模型或模型子集的圖形表示。按照面向對象的問題解決方案以及建立系統(tǒng)模型的要求,UML語言從4個抽象層次對UML語言的概念、模型元素和結構進行了全面定義,并規(guī)定了相應的表示法和圖形符號。

UML體系結構

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

UML體系結構

圖F-1UML的四層體系結構

UML體系結構

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

UML體系結構

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

溫馨提示

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

評論

0/150

提交評論