软件建模与UML第八章对象约束语言_第1页
软件建模与UML第八章对象约束语言_第2页
软件建模与UML第八章对象约束语言_第3页
软件建模与UML第八章对象约束语言_第4页
软件建模与UML第八章对象约束语言_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章对象约束语言第一节OCL概述第二节OCL语法第三节标准OCL类型第四节OCL表达式第五节OCL在UML建模中的应用

第一节OCL概述UML的图形如类图、用例图等,通常不可能详细地表达系统的各个细节,为了表达这些细节问题,需要为建模对象添加一些约束。这些约束可以使用自然语言来表达,但是自然语言的二义性增加了约束表达的复杂性和不可确定性。为解决约束表达的问题,OCL应运而生了。

第一节OCL概述对象约束语言(ObjectConstrainLanguage,简称OCL)是UML的子标准,是一种能用于构造软件模型的建模语言。第一节OCL概述OCL的特性:OCL是一种精确的、无二义性的形式化语言,易于掌握和使用。OCL既具有良好的数学背景,又没有使用晦涩的数学符号。OCL的基础是集合论和三值Kleene逻辑,并且它有一个形式化的数学语义,因此它可以明确地、无歧异地表示模型元素。

第一节OCL概述OCL是强类型的语言,任何表达式的值都属于一个类型。这个类型可以是预定义的标准类型(如String或Integer型),也可以是UML图中的元素(如具体的对象),还可以是这些元素构成的集合(如对象的Set,Bag和sequencetypes等)。作为类型语言,OCL表达式的校验是在建模期间而不是执行期间进行的,因此,模型中的错误能在早期就被发现并修改。第一节OCL概述OCL是声明式的语言,其表达式的计算将返回一个值,不会改变系统的状态,没有副作用,从而使得UML中的表达式被提升到了纯建模的领域。而不必考虑实现时的细节和具体语言。OCL是一种制定约束和查询的文本语言,除了可用于编写导航表达式、布尔表达式和其他查询语句外,还可用于构建约束、监护条件、动作、前置和后置条件、断言和其他UML表达式。第一节OCL概述OCL是一种规范说明性语言,所有与实现有关的问题都不能用OCL来表达。OCL不是一种程序设计语言,不能用OCL编写程序逻辑和控制流程。第一节OCL概述OCL具体语言可以用于许多不同的目的:作为一种查询语言。在类模型中,指定与类和类型有关的不变式。为原型和属性指定一种类型不变式。为属性指定派生规则。描述关于操作和方法的前置条件和后置条件。描述迁移。为消息和动作指定一个目标和一个目标集合。第一节OCL概述

在UML模型中指定任意表达式,如与行为(Behavior)、参数(Parameters)、变更触发器(ChangeTriggers)和时间触发器(TimeTriggers)、及生命线(LifeLines)相关联的那些表达式。第二节OCL语法OCL2.0在两个层次上定义对象约束语言,一个是抽象语法(或元模型),另一个是具体语法。后者真正用于在UML模型中指定约束和进行查询。元模型定义OCL概念和应用该概念的规则(或抽象语法),这与UML元模型对图的概念和用于UML图的规则进行定义的方式相同。具体语法实现抽象语法。

第二节OCL语法1)抽象语法抽象语法指的是OCL语言定义的概念层。在UML中,抽象语法表示为解释“类是什么”或“操作是什么”等的元模型(M2层),而不是创建一个具体的类或操作,UMLM2层一般将类描述为“具有相同的特征、约束和语义说明的一组对象”,并将类解释为可以与任何数目的特性(或属性)、操作、关系甚至嵌套类相关联。第二节OCL语法2)具体语法与面向规则的抽象语法相反,具体语法应用抽象语法的规则来创建可以在运行时段计算的表达式。OCL表达式与类元相关联,应用于该类元自身或某个属性、操作或参数。不论哪种情况,约束都是根据其位移(replacement)、上下文类元(contextualclassifier)和OCL表达式的自身实例(selfinstances)来定义的。第二节OCL语法“位移”是UML模型中使用的OCL表达式所处的位置,即作为依附某个类元的不变式、依附于某个操作的前置条件或依附于某个参数的默认值。“上下文类元”定义在其中计算表达式的名字空间。例如,前置条件的“上下文类元”是在其中定义该前置条件的操作所归属的那个类。也就是说,该类中的所有模型元素(如属性、关联和操作)都可以在OCL表达式中被引用。第二节OCL语法

“自身实例”是对计算该表达式的对象的引用。它总是“上下文类元”的一个实例。也就是说,OCL表达式对该“上下文类元”的每个实例计算结果可能不同。因此,OCL可以用于计算测试数据。第三节标准OCL类型OCL是一种强类型语言,每一表达式的值都属于某一类型。图8-1显示了OCL中预定义的类型以及从UML模型派生的类型的层次结构。“Classfier”是一个基本类型,包含UML基础结构的分类器的所有子类型。VoidType是一个与所有类型均具有一致性的类型。VoidType类型只有一个实例,称为OclViod。TupleType类型(非正式的记录类型或结构体类型)将不同类型组合到一起形成一个新的类型。第三节标准OCL类型图8-1OCL类型核心元模型的抽象语法层次结构第三节标准OCL类型

OCL标准库定义了多种类型,如图8-2所示。注意:OCL标准库中定义的类型都是其抽象语法类的实例。标准库处在建模层即M1层,抽象语法处于元模型层即M2层。第三节标准OCL类型图8-2OCL标准库中的类型定义第三节标准OCL类型1、OclAny和OclViod类型2、OclMessage类型3、基本类型4、集合类型5、类型一致性6、类型转换

1、OclAny和OclViod类型1)OclAny在OCL标准库中,OclAny类型是所有UML模型和基本类型的超类型,UML模型所有的类都继承由OclAny定义的特性。为了避免模型特性的名字与从OclAny继承的特性名字发生冲突,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事实上是一个带有参数“T”的模板类型,一个具体的OclMessage类型通过传递一个操作或信号参数代替“T”而被创建。

下表是有关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中的元素个数count(object:T):Integer返回参数对象在指定Collection中出现的次数includes(object:T):Boolean当对象是指定Collection的一个元素时,返回真excludes(object:T):Boolean当对象不被包含在指定Collection中时,返回真includesAll(c2:Collection(T)):Boolean当指定Collection包含参数c2中所有元素时,返回真excludesAll(c2:Collection(T)):Boolean当指定Collection不包含参数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与参数s的联合体,结果是Set类型union(bag:Bag(T)):Bag(T)返回指定Set与参数bag的联合体,结果是Bag类型=(s:Set(T)):Boolean当指定Set与s包含相同的元素时,返回真intersection(s:Set(T)):Set(T)返回指定Set与参数s的交集intersection(bag:Bag(T)):Set(T)返回指定Set与参数bag的交集–(s:Set(T)):Set(T)返回指定Set与参数s的差集including(object:T):Set(T)返回包含在指定Set中的所有元素以及参数对象的Setexcluding(object:T):Set(T)返回指定Set中的除参数对象以外的所有元素的SetsymmetricDifference(s:Set(T)):Set(T)返回包含在指定Set和参数Set中,但不同时包含在这两个Set中的元素组成的Setcount(object:T):Integer返回参数对象在指定Set中出现的次数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所有元素,并在后面加上参数对象object组成的OrderedSetprepend(object:T):OrderedSet(T)返回参数对象object并在后面加上指定OrderedSet所有元素组成的OrderedSetinsertAt(index:Integer,object:T):rderedSet(T)返回在指定位置插入参数对象object后所组成的OrderedSetsubOrderedSet(lower:Integer,upper:Integer):OrderedSet(T)返回指定OrderedSet中从lower到upper位置元素组成的子OrderedSetat(i:Integer):T返回指定OrderedSet中第i个位置的元素indexOf(obj:T):Integer返回参数对象obj在指定OrderedSet中出现有位置索引first():T返回指定OrderedSet的第一个元素last():T返回指定OrderedSet的最后一个元素4、集合类型4)Bag类型Bag类型也是对象组,Bag类型与Set类型的不同之处在于Bag类型中可以包含重复元素。

4、集合类型定义在Bag类型上的操作

操作说明=(bag:Bag(T)):Boolean当指定Bag与参数bag包含相同的元素时,返回真<>(bag:Bag(T)):Boolean当指定Bag与参数bag不包含相同的元素时,返回真union(bag:Bag(T)):Bag(T)返回指定Bag与参数bag的联合体,结果是Bag类型union(set:Set(T)):Bag(T)返回指定Bag与参数set的联合体,结果是Bag类型intersection(bag:Bag(T)):Bag(T)返回指定Bag与参数bag的交集intersection(set:Set(T)):Set(T)返回指定Bag与参数set的交集including(object:T):Bag(T)返回包含在指定Bag中的所有元素以及参数对象的Bagexcluding(object:T):Bag(T)返回指定Bag中除参数对象以外的所有元素的Bagcount(object:T):Integer返回参数对象在指定Bag中出现的次数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返回参数对象在指定Sequence中出现的次数=(s:Sequence(T)):Boolean当指定Sequence与参数Sequence中包含相同的元素、相同的元素出现次数以及相同的元素顺序时,返回真<>(s:Sequence(T)):Boolean当指定Sequence与参数Sequence中不包含相同的元素、相同的元素出现次数以及相同的元素顺序时,返回真union(s:Sequence(T)):Sequence(T)返回指定Sequence与参数Sequence的联合序列,即联合后的Sequenceappend(object:T):Sequence(T)返回包含在指定Sequence中的所有元素,并在后面加上参数对象的Sequenceprepend(object:T):Sequence(T)返回由参数对象加上指定Sequence中的所有元素组成的SequenceinsertAt(index:Integer,object:T):Sequence(T)返回将参数对象object插入到给定index位置后,所有元素组成的SequencesubSequence(lower:Integer,upper:Integer):Sequence(T)返回指定Sequence中从lower到upper位置的元组成的子Sequenceat(i:Integer):T返回指定Sequence中第i个位置的元素indexOf(obj:T):Integer返回参数对象obj在指定Sequence中的索引号4、集合类型

定义在Sequence类型上的操作

操作说明first():T返回Sequence中的第一个元素last():T返回Sequence中的最后一个元素including(object:T):Sequence(T)返回包含在指定Sequence中的所有元素,并加上参数对象作为最后一个元素的Sequenceexcluding(object:T):Sequence(T)返回指定Sequence中除参数对象以外的所有元素的SequenceasBag():Bag(T)返回包含所有重复元素的在内的所有Sequence元素组成的BagasSequence():Sequence(T)返回指定Sequence本身asSet():Set(T)返回指定Sequence中移除所有重复元素后所有元素组成的SetasOrderedSet():OrderedSet(T)返回指定Sequence中移除所有重复元素后所有元素组成的OrderedSet5、类型一致性OCL的类型层次结构决定了不同类型之间的一致性。例如不能让Integer类型的变量跟Boolean或String的变量进行比较。只有满足类型一致性的表达式才是有效的表达式。如果出现类型不匹配时,OCL就会包含类型一致性错误。如果无论任何时候type1的一个实例均能用type2的一个实例来代替,那么称类型Type1与类型Type2一致。5、类型一致性类型一致性规则:

任何类型都与它的超(上级)类型一致类型一致性具有可传递性类型一致性具体自反性5、类型一致性

OCL中类型一致性表

类型一致于条件Set(T1)Collection(T2)ifT1conformstoT2Sequence(T1)Collection(T2)ifT1conformstoT2Bag(T1)Collection(T2)ifT1conformstoT2IntegerRealOclVoidTheothertypeinOCL6、类型转换某些情况下,我们希望能够使用一个对象的属性,这个属性的类型是当前已知类型的子类型。由于其类型在当前类型范围内未定义,这将导致类型一致性错误。当确定两个类型一致之后,对象可以使用oclAsType(OclType)操作进行类型转换。例如,可以用如下表达式将类型为Type1的对象转换为Type2类型的对象。object.oclAsType(Type2)--evaluatestoobjectwithtypeType2第四节OCL表达式OCL表达式核心元模型的抽象语法层次结构参见图8-3

,充分体现了OCL与UML元模型之间的关系。定义了OCL中可以使用的各种表达式类型。第四节OCL表达式图8-3OCL表达式核心元模型的抽象语法层次结构第四节OCL表达式图8-4ModelPropertyCallExp类型细节图第四节OCL表达式ModelPropertyCallExtp表达式涉及模型中的属性、操作或关联端。ModelPropertyCallExtp元类有三个子类型:AttributeCallExp、OperationCallExp和AssociationEndCallExp,表示source的特征。因为其它一些对象常常要调用这些属性,一个ModelPropertyCallExtp有一个OclExpression作为Source。例如,在表达式Employee.getsalary()中,Employee是OclExpression,它是getsalary()部分的source,而getsalary()部分是ModelpropertyCallExp的一个实例。第四节OCL表达式

作用于collection上的循环表达式是LoopExp元类的实例。例如,collection→forA11(elem|elem

staitisfiesacondition)

其中的forAll操作是循环表达式LooPExepressions的一个实例。每个循环表达式都有一个source,该source是一个collection或一个作为collection来处理的实例,并可以用OCL表达式来描述。循环体部分表明collection的哪些元素需要被考虑。第四节OCL表达式

IfExp用于描述依据判断条件二选一的抽象语法。

OclMessageExp多用于描述通信(操作调用或信号发送)发生。

VariableExp是指变量相关表达式,包括self、result所指的变量以及由Let表达式所定义的变量。

LiteralExp是一个无参数的表达式,产生一个值,这个值通常是一个符号表达式,比如,一个Integer类型的数值“1”,或者是一个文本串“’thisisaLiteralExp”。第四节OCL表达式1、OCL表达式的特点2、OCL的表达式示例与语法3、中缀运算符4、操作符优先级5、关键字6、注释

1、OCL表达式的特点OCL表达式用于对一个OCL类型求值,它具有如下特点:1)OCL表达式可以附加在模型元素上,模型元素的所有实例都应该满足表达式的条件。2)OCL表达式可以附加在操作上,附加在操作上的表达式要指定执行一个操作前应该满足的条件(前置条件)或一个操作完成后必须满足的条件(后置条件)。1、OCL表达式的特点3)OCL表达式可以指定附加在模型元素上的监护条件。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可以是一个字符串、数字或者是“#”后面跟一个模型元素或操作的名字。2、OCL的表达式示例与语法OCL的基本表达式可以是一个包含可选项的路径名,后面的可选项中包括时间表达式(timeExpression)、限定符(Qualifer)、或特征调用参数(featrueCallParameters)。OCL的基本表达式还可以是一个条件表达式“ifExpression”。3、中缀运算符OCL的中缀运算符有:+、-、*、/、<、>、<>、<=、>=、And、Or、Xor等。4、操作符优先级操作符的优先级:按照从高到低来进行;使用小括号时,从最内到最外进行计算。

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)等的名称在表达式中出现。6、注释在OCL中,使用现两个连续短划线表示注释符,从这两个短划线开始,一直到换行符为上的内容都是注释。例如:--thisisacomment第五节OCL在UML建模中的应用为了便于本节的描述,我们使用图8-5所示的类图作为本节的例子。第五节OCL在UML建模中的应用图8-5UML类图示例第五节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)包的上下文当用作分类器的包与外界环境关系清晰时,上述的上下文声明已经足够精确。当情况复杂时,为了说明不变量、前置条件、后置约束条件属于那个包,这些约束可以包含在“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元模型操作体表达式的类型必须与操作返回的类型一致。与前置、后置条件一样,表达式中也可使用参数。在操作声明之后,前置、后置条件表达式,操作体表达式可以混合使用。例如:contextPerson::getCurrentSpouse():Personpre:self.isMarried=truebody:self.mariages->select(m|m.ended=false).spouse1、OCL与UML元模型5)初始值和派生值OCL表达式可以表示属性或关联端的初始值和派生值。语法如下:context

Typename::attributeName:Typeinit:--someexpressionrepresentingtheinitialvaluecontext

Typename::assocRoleName:Typederive:--someexpressionrepresentingthederivationrule

1、OCL与UML元模型此处,初始值和派生值表达式的类型必须跟属性的结果类型一致。当上下文是关联端时,如果关联端的多重性为0..1,表达式类型必须与关联端分类器一致。如果关联端的多重性为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对象执行此操作的值,属性age@pre的值为此操作前的值,即前置条件初始值。1、OCL与UML元模型6)前置条件中的初值的表示方法前置条件中对象属性的值是上次操作后的返回值。为了引用操作前的值,OCL使用“@pre”后缀来达到获取操作前值的目的。例如,ContextPerson::birthdayHappens()Post:age=age@pre+1属性age的值是一个Person对象执行此操作的值,属性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)属性约束建模不变量:常用于附加在模型元素上,在属性的生命期内一直保持为真的规则。例如ContextPersoninv:Self.allInstances->forAll(P1,P2|P1<>P2impliesP1.PId<>P2.PId)2、用OCL表达对象性质约束多数情况下,上下文十分明确,关键字“self”可以省略。可以定义一个不同的名称代替“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表达式附加操作上可以规定一个前置条件或后置条件。前置条件指的是操作开始执行前必须为真的条件,后置条件指的是操作成功执行后必须为真的条件。前置条件用保留字“Pre”标识,后置条件用保留字“post”标识。contextTypename::operationName(param1:Type1,...):ReturnTypepre:param1>...post:result=...2、用OCL表达对象性质约束参数名也可以在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的支持工具一般具有如下主要功能。语法分析类型检查逻辑一致性检查代码生成动态验证不变式动态验证前/后置条件测试自动化与CASE工具的集成3、OCL的支持工具下面是几种典型的OCL工具。1)ModelRun

ModelRun由Boldsoft公司所开发,用于验证模型。它是一个对OCL表达式进行处理的商业化工具。该工具支持的建模工具有RationalRoes2、BoldforDelphi等。

3、OCL的支持工具ModelRun有如下特点:对模型中的OCL表达式作语法检查和类型检查。约束可用来验证模型,在该工具中,可对创建的对象执行模型的约束。OLC表达式编辑器允许手工引入约束并可使用编辑器中提供的选项,这些选项主要是为构建正确的OCL表达式提供向导作用。像其它的OCL工具一样,ModelRun不会直接修改UML模型。UML模型的引入是通过XML文件来进行。OCL表达式分析器是ModelRun的一部分,因此不能使用它作为模型独立的工具。比如,该分析器不能用来对单独的OCL表达式作语法分析。3、OCL的支持工具2)OCLCheckerOCLChekcer是Jos

Warrmer开发的一种直观易用的OCL表达式分析器,其最终版支持OCLI.4规范,OCLChecker由单个文件(ocl.jar)组成。OCLChecker仅仅能被用作为独立于模型的工具,因为它没有提供与UML模型连接的方式。相对其它的OCL分析器而言,OCLChekcer的主要缺点是其功能仅限于对OCL语言作语法分析,它既没有考虑类型检查也没有考虑约束的一致性检查。3、OCL的支持工具3)DresdenOCL编译器:一种开源的模块化工具,它是Dresdne技术大学FrankFinger开发的,其目的是由OCL表达式生成Java代码,并且在运行时计算OCL表达式。3、OCL的支持工具DresdenOCL编译器包含四个功能模块:解析器、语义分析、规范化、代码生成。解析器是由SableCC解析器生成器根据OCL文法产生的。解析器把输入的OCL表达式转化为抽象语法树,抽象语法树为该工具中的其它功能模块构成了通用数据表示。语义分析作简单的一致性检查和类型检查。规范化通过简化解析器产生的抽象语法树使得代码生成阶段变得更容易,也即减少了代码生成的复杂性。代码生成模块的作用是把OCL表达式转化为相应的可执行代码。3、OCL的支持工具4)USE:由Bremen大学MarkRichters开发的一种OCL工具。其功能如下:对UML和OCL描述进行语法检查。通过对对象、属性、联系的操纵来产生系统状态。表示出系统的状态图中的对象。3、OCL的支持工具监视模型的本质特性和类图中的不变式。执行操作并监视其前置条件和后置条件。表示出顺序图中的操作的调用顺序。用OCL表达式查询系统状态。3、OCL的支持工具该工具主要的组件是一个模拟器和一个OCL解释器。模拟器用于模拟UML模型,解释器则主要是用于验证模型中的OCL约束。模型是系统的描述,系统状态则是运行着的系统快照。USE工具用于操纵系统快照,并且因此根据系统的要求验证模型。在USE规范中,OCL约束描述了系统的要求,所以操纵系统快照期间验证了这些约束。

UML元模型

UML是通过一个元模型来正式定义的,元模型就是UML中结构的模型。元模型本身也是用UML来表达的。这是一个元循环解释的例子,即一种用自己来定义自己的语言。但也不完全是循环的,用于定义元模型的只是UML的一个小子集。从理论上说,可以从一个更基本的定义自行引导出这种定义的支点。但在实践中,进行这种探讨是没有必要的。因此,本书将其纳入附录以供读者参阅。

UML元模型

模型是系统的完整抽象,图则是模型或模型子集的图形表示。按照面向对象的问题解决方案以及建立系统模型的要求,UML语言从4个抽象层次对UML语言的概念、模型元素和结构进行了全面定义,并规定了相应的表示法和图形符号。

UML体系结构

UML具有一个四层体系结构,每个层次是根据该层中元素的一般性程度来划分的。从一般到具体依次为元元模型层、元模型层、模型层和用户对象层。图F-1给出了UML的四层体系结构。

UML体系结构

图F-1UML的四层体系结构

UML体系结构

1)元元模型(meta-metamodel)层的主要任务是定义用于规定元模型的语言,因此形成了元模型建模层次结构的基础。元元模型通常比它所描述的元模型具有更高的抽象级别、更加简洁。一个元元模型可以定义多个元模型,而每个元模型也可以与多个元元模型相关联。在元元模型上的元元对象的例子有:元类、元属性和元操作。

UML体系结构

2)元模型(metamodel)是元元模型的实例,该层的主要任务是定义用于规定模型的语言

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论