1、第八章第八章 对象约束语言对象约束语言4第一节第一节 OCL概述概述 4第二节第二节 OCL语法语法 4第三节第三节 标准标准OCL类型类型 4第四节第四节 OCL表达式表达式 4第五节第五节 OCL在在UML建模中的应用建模中的应用 第一节第一节 OCL概述概述UML的图形如类图、用例图等,通常不可的图形如类图、用例图等,通常不可能详细地表达系统的各个细节,为了表达这些细能详细地表达系统的各个细节,为了表达这些细节问题,需要为建模对象添加一些约束。这些约节问题,需要为建模对象添加一些约束。这些约束可以使用自然语言来表达,但是自然语言的二束可以使用自然语言来表达,但是自然语言的二义性增加了约束
2、表达的复杂性和不可确定性。义性增加了约束表达的复杂性和不可确定性。为解决约束表达的问题,为解决约束表达的问题,OCL应运而生应运而生了。了。第一节第一节 OCL概述概述对象约束语言对象约束语言(Object Constrain Language,简,简称称OCL)是是UML的子标准,是一种能用于构造软的子标准,是一种能用于构造软件模型的建模语言。件模型的建模语言。第一节第一节 OCL概述概述OCL的特性:的特性:OCL是一种精确的、无二义性的形式化语言,是一种精确的、无二义性的形式化语言,易于掌握和使用。易于掌握和使用。OCL既具有良好的数学背景,又没有使用晦既具有良好的数学背景,又没有使用晦
3、涩的数学符号。涩的数学符号。OCL的基础是的基础是集合论和三值集合论和三值Kleene逻辑逻辑,并且它有一个形式化的数学语义,并且它有一个形式化的数学语义,因此它可以明确地、无歧异地表示模型元素。因此它可以明确地、无歧异地表示模型元素。第一节第一节 OCL概述概述OCL是是强类型强类型的语言,任何表达式的值都属的语言,任何表达式的值都属于一个类型。于一个类型。这个类型可以是预定义的标准类型这个类型可以是预定义的标准类型(如如String或或Integer型型),也可以是,也可以是UML图中的元图中的元素素(如具体的对象如具体的对象),还可以是这些元素构成的集,还可以是这些元素构成的集合合(如对
4、象的如对象的Set,Bag和和sequence types等等)。作为。作为类型语言,类型语言,OCL表达式的校验是在建模期间而不表达式的校验是在建模期间而不是执行期间进行的,因此,模型中的错误能在早是执行期间进行的,因此,模型中的错误能在早期就被发现并修改。期就被发现并修改。第一节第一节 OCL概述概述OCL是是声明式声明式的语言,其表达式的计算将返的语言,其表达式的计算将返回一个值,不会改变系统的状态,没有副作用,回一个值,不会改变系统的状态,没有副作用,从而使得从而使得UML中的表达式被提升到了纯建模的中的表达式被提升到了纯建模的领域。而不必考虑实现时的细节和具体语言。领域。而不必考虑实
5、现时的细节和具体语言。OCL是一种制定是一种制定约束和查询约束和查询的文本语言,除的文本语言,除了可用于编写导航表达式、布尔表达式和其他查了可用于编写导航表达式、布尔表达式和其他查询语句外,还可用于构建约束、监护条件、动作、询语句外,还可用于构建约束、监护条件、动作、前置和后置条件、断言和其他前置和后置条件、断言和其他UML表达式。表达式。第一节第一节 OCL概述概述OCL是一种规范说明性语言,所有与实现有是一种规范说明性语言,所有与实现有关的问题都不能用关的问题都不能用OCL来表达。来表达。OCL不是一种程序设计语言,不能用不是一种程序设计语言,不能用OCL编写程序逻辑和控制流程。编写程序逻
6、辑和控制流程。第一节第一节 OCL概述概述OCL具体语言可以用于许多不同的目的:具体语言可以用于许多不同的目的:作为一种查询语言。作为一种查询语言。在类模型中,指定与类和类型有关的不变式。在类模型中,指定与类和类型有关的不变式。为原型和属性指定一种类型不变式。为原型和属性指定一种类型不变式。为属性指定派生规则。为属性指定派生规则。描述关于操作和方法的前置条件和后置条件。描述关于操作和方法的前置条件和后置条件。描述迁移。描述迁移。为消息和动作指定一个目标和一个目标集合。为消息和动作指定一个目标和一个目标集合。第一节第一节 OCL概述概述 在在UML模型中指定任意表达式,如与行模型中指定任意表达式
7、,如与行为(为(Behavior)、参数()、参数(Parameters)、变更触)、变更触发器(发器(ChangeTriggers)和时间触发器)和时间触发器(TimeTriggers)、及生命线()、及生命线(LifeLines)相关)相关联的那些表达式。联的那些表达式。第二节第二节 OCL语法语法OCL2.0在两个层次上定义对象约束语言,在两个层次上定义对象约束语言,一个是一个是抽象语法抽象语法(或元模型或元模型),另一个是,另一个是具体语法具体语法。后者真正用于在后者真正用于在UML模型中指定约束和进行查模型中指定约束和进行查询。询。元模型定义元模型定义OCL概念和应用该概念的规则概念
8、和应用该概念的规则(或抽象语法),这与(或抽象语法),这与UML元模型对图的概念元模型对图的概念和用于和用于UML图的规则进行定义的方式相同。具图的规则进行定义的方式相同。具体语法实现抽象语法。体语法实现抽象语法。第二节第二节 OCL语法语法41)抽象语法)抽象语法抽象语法指的是抽象语法指的是OCL语言定义的语言定义的概念层概念层。在。在UML中,抽象语法表示为解释中,抽象语法表示为解释“类是什么类是什么”或或“操作是什么操作是什么”等的元模型(等的元模型(M2层),而不是层),而不是创建一个具体的类或操作,创建一个具体的类或操作,UML M2层一般将类层一般将类描述为描述为“具有相同的特征、
9、约束和语义说明的一具有相同的特征、约束和语义说明的一组对象组对象”,并将类解释为可以与任何数目的特性,并将类解释为可以与任何数目的特性(或属性)、操作、关系甚至嵌套类相关联。(或属性)、操作、关系甚至嵌套类相关联。第二节第二节 OCL语法语法42)具体语法)具体语法与面向规则的抽象语法相反,具体语法应用与面向规则的抽象语法相反,具体语法应用抽象语法的规则来创建可以在运行时段计算的表抽象语法的规则来创建可以在运行时段计算的表达式。达式。OCL表达式与类元相关联,应用于该类元表达式与类元相关联,应用于该类元自身或某个属性、操作或参数。不论哪种情况,自身或某个属性、操作或参数。不论哪种情况,约束都是
10、根据其位移(约束都是根据其位移(replacement)、上下文)、上下文类元(类元(contextual classifier)和)和OCL表达式的自表达式的自身实例(身实例(self instances)来定义的。)来定义的。第二节第二节 OCL语法语法u“位移位移”是是UML模型中使用的模型中使用的OCL表达式所表达式所处的位置,即作为依附某个类元的不变式、依附处的位置,即作为依附某个类元的不变式、依附于某个操作的前置条件或依附于某个参数的默认于某个操作的前置条件或依附于某个参数的默认值。值。u“上下文类元上下文类元”定义在其中计算表达式的名定义在其中计算表达式的名字空间。例如,前置条件
11、的字空间。例如,前置条件的“上下文类元上下文类元”是在是在其中定义该前置条件的操作所归属的那个类。也其中定义该前置条件的操作所归属的那个类。也就是说,该类中的所有模型元素就是说,该类中的所有模型元素(如属性、关联如属性、关联和操作和操作)都可以在都可以在OCL表达式中被引用。表达式中被引用。第二节第二节 OCL语法语法u “自身实例自身实例”是对计算该表达式的对象的是对计算该表达式的对象的引用。它总是引用。它总是“上下文类元上下文类元”的一个实例。的一个实例。也就是说,也就是说,OCL表达式对该表达式对该“上下文类上下文类元元”的每个实例计算结果可能不同。因此,的每个实例计算结果可能不同。因此
12、,OCL可以用于计算测试数据。可以用于计算测试数据。第三节第三节 标准标准OCL类型类型OCL是一种强类型语言,每一表达式的值都是一种强类型语言,每一表达式的值都属于某一类型。图属于某一类型。图8-1显示了显示了OCL中预定义的类中预定义的类型以及从型以及从UML模型派生的类型的层次结构。模型派生的类型的层次结构。u“Classfier”是一个基本类型,包含是一个基本类型,包含UML基基础结构的分类器的所有子类型。础结构的分类器的所有子类型。VoidType是一个是一个与所有类型均具有一致性的类型。与所有类型均具有一致性的类型。VoidType类型类型只有一个实例,称为只有一个实例,称为Ocl
13、Void。uTupleType类型(非正式的记录类型或结构类型(非正式的记录类型或结构体类型)将不同类型组合到一起形成一个新的类体类型)将不同类型组合到一起形成一个新的类型。型。第三节第三节 标准标准OCL类型类型图图8-1 OCL类型核心元模型的抽象语法层次结构类型核心元模型的抽象语法层次结构第三节第三节 标准标准OCL类型类型4 OCL标准库定义了多种类型,如图标准库定义了多种类型,如图8-2所所示。示。u 注意:注意:OCL标准库中定义的类型都是其抽标准库中定义的类型都是其抽象语法类的实例。象语法类的实例。标准库处在建模层即标准库处在建模层即M1层层,抽象语法处于元模型层即抽象语法处于元
14、模型层即M2层层。第三节第三节 标准标准OCL类型类型图图8-2 OCL标准库中的类型定义标准库中的类型定义第三节第三节 标准标准OCL类型类型41、OclAny和和OclVoid 类型类型 42、OclMessage类型类型 43、基本类型、基本类型 44、集合类型、集合类型 45、类型一致性、类型一致性 46、类型转换、类型转换 1、OclAny和和OclViod 类型类型1)OclAny在在OCL标准库中,标准库中,OclAny类型是所有类型是所有UML模型和基本类型的模型和基本类型的超类型超类型,UML模型所有的类模型所有的类都继承由都继承由OclAny定义的特性。定义的特性。为了避免
15、模型特性的名字与从为了避免模型特性的名字与从OclAny继承继承的特性名字发生冲突,的特性名字发生冲突,OclAny特性名字都以特性名字都以“Ocl”开头。开头。1、OclAny和和OclViod 类型类型OclAny类型上的操作表类型上的操作表1、OclAny和和OclViod 类型类型2)OclVoid类型类型OclVoid与其它所有类型都具有一致性与其它所有类型都具有一致性。OclVoid仅有一个称为仅有一个称为OclUndefined的实例。的实例。context OclVoid inv:OclVoid.allinstances()-size()=1除除oclIsUndefined()
16、操作之外,任何应用在操作之外,任何应用在OclUndefined类型上的属性调用结果都是类型上的属性调用结果都是OclUndefined类型。类型。2、OclMessage类型类型4OclMessage事实上是一个带有参数事实上是一个带有参数“T”的的模板类型,一个具体的模板类型,一个具体的OclMessage类型通过传递类型通过传递一个操作或信号参数代替一个操作或信号参数代替“T”而被创建。而被创建。下表是有关下表是有关OclMessage的操作。的操作。3、基本类型、基本类型4定义在定义在OCL标准库中的基本类型有:标准库中的基本类型有:Integer,Real,String 和和Bool
17、ean。4除此之外,除此之外,OCL还在基本类型上定义了一些操作,还在基本类型上定义了一些操作,如下表所示。如下表所示。4、集合类型、集合类型4OCL中还定义了一些较为高级的标准中还定义了一些较为高级的标准OCL类型,称为集合类型。类型,称为集合类型。集合类型是成组的对象或集合类型是成组的对象或元素,可以作表达式计算过程的结果。元素,可以作表达式计算过程的结果。在在OCL标准库中,集合类型包括标准库中,集合类型包括Collection抽象类型,还有抽象类型,还有Set、Bag、OrderedSet和和Sequence。:1)Collection类型类型Collection类型是其他集合类型的超
18、类型。类型是其他集合类型的超类型。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
19、包含参数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与c2 Collection的迪卡尔积Iterate()访问集合中的元素并
20、查询或计算表达式4、集合类型、集合类型42)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
21、的交集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中出现的次数a
22、sSet():Set(T)返回指定Set本身asOrderedSet():OrderedSet(T)返回指定Set中移除所有重复元素后,所有元素以随机顺序组成的OrderedSetasSequence():Sequence(T)返回指定Set中所有元素的以随机顺序组成的SequenceasBag():Bag(T)返回包含Set中所有元素的Bag4、集合类型、集合类型3)OrderedSet类型类型OrderedSet类型是不包括重复元素,并且有类型是不包括重复元素,并且有序的对象组。序的对象组。4、集合类型、集合类型定义在定义在OrderedSet类型上的操作类型上的操作 操作操作说明说明ap
23、pend(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)返回指定Ordered
24、Set中从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类型上
25、的操作类型上的操作 操作操作说明说明=(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的交集incl
26、uding(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中移除所有重复元素后所有元素以随
27、机顺序组成的OrderedSet4、集合类型、集合类型5)Sequence类型类型Sequence类型和类型和Bag类型类似,也类型类似,也可以包含可以包含重复元素重复元素,不过,不过Sequence类型中的元素类型中的元素是有序的是有序的。4、集合类型、集合类型 定义在定义在Sequence类型上的操作类型上的操作 操作操作说明说明count(object:T):Integer返回参数对象在指定Sequence中出现的次数=(s:Sequence(T):Boolean当指定Sequence与参数Sequence中包含相同的元素、相同的元素出现次数以及相同的元素顺序时,返回真(s:Sequen
28、ce(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,ob
29、ject: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返回Seque
30、nce中的第一个元素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中移除所有重复元素后所有
31、元素组成的SetasOrderedSet():OrderedSet(T)返回指定Sequence中移除所有重复元素后所有元素组成的OrderedSet5、类型一致性、类型一致性4OCL的类型层次结构决定了不同类型之间的的类型层次结构决定了不同类型之间的一致性。一致性。例如不能让例如不能让Integer类型的变量跟类型的变量跟Boolean或或String的变量进行比较。的变量进行比较。4只有满足类型一致性的表达式才是有效的表只有满足类型一致性的表达式才是有效的表达式。达式。如果出现类型不匹配时,如果出现类型不匹配时,OCL就会包含类型一致就会包含类型一致性错误。如果无论任何时候性错误。如果无论
32、任何时候type1的一个实例均能用的一个实例均能用type2的一个实例来代替,那么称类型的一个实例来代替,那么称类型Type1与类型与类型Type2一致。一致。5、类型一致性、类型一致性类型一致性规则:类型一致性规则:任何类型都与它的任何类型都与它的超(上级)类型一致超(上级)类型一致 类型一致性具有类型一致性具有可传递性可传递性 类型一致性具体类型一致性具体自反性自反性 5、类型一致性、类型一致性 OCL中类型一致性表中类型一致性表 类型一致于条件Set(T1)Collection(T2)if T1 conforms to T2Sequence(T1)Collection(T2)if T1
33、conforms to T2Bag(T1)Collection(T2)if T1 conforms to T2IntegerRealOclVoidThe other type in OCL6、类型转换、类型转换4某些情况下,我们希望能够使用一个对象的某些情况下,我们希望能够使用一个对象的属性,这个属性的类型是当前已知类型的子类型。属性,这个属性的类型是当前已知类型的子类型。由于其类型在当前类型范围内未定义,这将导致由于其类型在当前类型范围内未定义,这将导致类型一致性错误。类型一致性错误。当确定两个类型一致之后,对象可以使用当确定两个类型一致之后,对象可以使用oclAsType(OclType)
34、操作进行类型转换。例如,操作进行类型转换。例如,可以用如下表达式将类型为可以用如下表达式将类型为Type1的对象转换为的对象转换为Type2类型的对象。类型的对象。object.oclAsType(Type2)-evaluates to object with type Type2第四节第四节 OCL表达式表达式OCL表达式核心元模型的抽象语法层次结构表达式核心元模型的抽象语法层次结构参见参见图图8-3 ,充分体现了,充分体现了OCL与与UML元模型之元模型之间的关系。间的关系。定义了了OCL中可以使用的各种表达式类型。第四节第四节 OCL表达式表达式图8-3 OCL表达式核心元模型的抽象语法
35、层次结构第四节第四节 OCL表达式表达式图8-4 ModelPropertyCallExp类型细节图第四节第四节 OCL表达式表达式4ModelPropertyCallExtp表达式涉及模型中表达式涉及模型中的属性、操作或关联端。的属性、操作或关联端。ModelPropertyCallExtp元类有三个子类型:元类有三个子类型:AttributeCallExp、OperationCallExp和和AssociationEndCallExp,表示,表示source的特征。因的特征。因为其它一些对象常常要调用这些属性,一个为其它一些对象常常要调用这些属性,一个ModelPropertyCallEx
36、tp有一个有一个OclExpression作作为为Source。4例如,在表达式例如,在表达式Employee.getsalary()中,中,Employee是是OclExpression,它是,它是getsalary()部分的部分的source,而,而getsalary()部分是部分是ModelpropertyCallExp的一个实例。的一个实例。第四节第四节 OCL表达式表达式4 作用于作用于collection上的循环表达式是上的循环表达式是LoopExp元类的实例。元类的实例。例如,例如,collectionforA11(elem|elem staitisfies a conditio
37、n)其中的其中的forAll操作是循环表达式操作是循环表达式LooPExepressions的一个实例。每个循环表达式的一个实例。每个循环表达式都有一个都有一个source,该,该source是一个是一个collection或一或一个作为个作为collection来处理的实例,并可以用来处理的实例,并可以用OCL表表达式来描述。循环体部分表明达式来描述。循环体部分表明collection的哪些元的哪些元素需要被考虑。素需要被考虑。第四节第四节 OCL表达式表达式4 IfExp用于描述依据判断条件二选一的抽用于描述依据判断条件二选一的抽象语法。象语法。4 OclMessageExp多用于描述通信
38、(操作调多用于描述通信(操作调用或信号发送)发生。用或信号发送)发生。4 VariableExp是指变量相关表达式,包括是指变量相关表达式,包括 self、result所指的变量以及由所指的变量以及由Let表达式所定义表达式所定义的变量。的变量。4 LiteralExp是一个无参数的表达式,产生是一个无参数的表达式,产生一个值,这个值通常是一个符号表达式,比如,一个值,这个值通常是一个符号表达式,比如,一个一个Integer类型的数值类型的数值“1”,或者是一个文本串,或者是一个文本串“this is a LiteralExp”。第四节第四节 OCL表达式表达式41、OCL表达式的特点表达式的
39、特点 42、OCL的表达式示例与语法的表达式示例与语法 43、中缀运算符、中缀运算符 44、操作符优先级、操作符优先级 45、关键字、关键字 46、注释、注释 1、OCL表达式的特点表达式的特点OCL表达式用于对一个表达式用于对一个OCL类型求值,它类型求值,它具有如下特点:具有如下特点:1)OCL表达式可以表达式可以附加在模型元素上附加在模型元素上,模,模型元素的所有实例都应该满足表达式的条件。型元素的所有实例都应该满足表达式的条件。2)OCL表达式可以表达式可以附加在操作上附加在操作上,附加在,附加在操作上的表达式要指定执行一个操作前应该满足操作上的表达式要指定执行一个操作前应该满足的条件
40、(的条件(前置条件前置条件)或一个操作完成后必须满足)或一个操作完成后必须满足的条件(的条件(后置条件后置条件)。)。1、OCL表达式的特点表达式的特点3)OCL表达式可以指定附加在模型元素上表达式可以指定附加在模型元素上的的监护条件监护条件。4)OCL表达式的计算原则是表达式的计算原则是从左到右从左到右。计。计算子表达式得到一个具体的值或一个具体类型的算子表达式得到一个具体的值或一个具体类型的对象。对象。5)OCL表达式既可以使用表达式既可以使用基本类型基本类型又可以又可以使用使用集合类型集合类型。2、OCL的表达式示例与语法的表达式示例与语法4字符和变量是最简单的表达式,字符和变量是最简单
41、的表达式,self表达式表达式引用类元的一个实例。引用类元的一个实例。23 字符表达式字符表达式V 变量表达式变量表达式self self表达式表达式.P.name()操作调用操作调用p.name.substring(2)嵌套操作调用嵌套操作调用Set1,2-size 集合上的操作调用集合上的操作调用3+2 中缀表达式中缀表达式self.age 属性访问属性访问2、OCL的表达式示例与语法的表达式示例与语法通过操作调用及通过操作调用及“if-then-else”结构可建立起结构可建立起复杂的表达式。复杂的表达式。if x.mod(2)=0 then evene1seoddEndif if表达式
42、表达式2、OCL的表达式示例与语法的表达式示例与语法OCL表达式的语法用扩展的巴斯科范式表达式的语法用扩展的巴斯科范式(EBNF)定义,在)定义,在EBNF中,中,“|”表示选择,表示选择,“?”表示可选项,表示可选项,“*”表示零次或多次,表示零次或多次,“+”表示一次或多次表示一次或多次。OCL基本表达式的语法用基本表达式的语法用EBNF定义如下:定义如下:uPrimaryExpression:=Literalcollection|Literal|Pathname time Expression?featureCallParameters?|”(“expression”)”|ifExpre
43、ssion2、OCL的表达式示例与语法的表达式示例与语法uLiteral:=|”#”utimeExpression:=”ufeatrueCallParameters:=”(“declarator”)?(actualParameterList)?”)”uifExpression:=”if”expression“then”expression“else”expression“endif”2、OCL的表达式示例与语法的表达式示例与语法从上面的定义可以看出,从上面的定义可以看出,OCL的基本表达式的基本表达式可以是一个可以是一个Literalcollection,Literalcollection代代
44、表表Literal的集合类型。的集合类型。OCL的基本表达式可以是一个的基本表达式可以是一个Literal,Literal可以是一个字符串、数字或者是可以是一个字符串、数字或者是“#”后面后面跟一个模型元素或操作的名字。跟一个模型元素或操作的名字。2、OCL的表达式示例与语法的表达式示例与语法OCL的基本表达式可以是一个包含可选项的的基本表达式可以是一个包含可选项的路径名,后面的可选项中包括时间表达式路径名,后面的可选项中包括时间表达式(timeExpression)、限定符()、限定符(Qualifer)、或特)、或特征调用参数(征调用参数(featrueCallParameters)。)。
45、OCL的基本表达式还可以是一个的基本表达式还可以是一个条件表达式条件表达式“ifExpression”。3、中缀运算符、中缀运算符OCL的的中缀运算符中缀运算符有:有:+、-、*、/、=、And、Or、Xor等。等。4、操作符优先级、操作符优先级操作符的操作符的优先级优先级:按照从高到低来进行;使用小括:按照从高到低来进行;使用小括号时,从最内到最外进行计算。号时,从最内到最外进行计算。5、关键字、关键字与程序设计语言一样,与程序设计语言一样,OCL也定义了一些也定义了一些关关键字键字。and、attr、context、def、else、endif、endpackage、if、implies、
46、in、inv、let、not、oper、or、package、post、pre、then、xor。以上以上OCL关键字是保留字,它们不能作为一关键字是保留字,它们不能作为一个包(个包(package)、类型()、类型(type)或者属性)或者属性(property)等的名称在表达式中出现。)等的名称在表达式中出现。6、注释、注释在在OCL中,使用中,使用两个连续短划线两个连续短划线表示注释符,表示注释符,从这两个短划线开始,一直到换行符为止的内容从这两个短划线开始,一直到换行符为止的内容都是注释。例如:都是注释。例如:-this is a comment第五节第五节 OCL在在UML建模中的应
47、用建模中的应用 为了便于本节的描述,我们使用图为了便于本节的描述,我们使用图8-5所所示的类图作为本节的例子。示的类图作为本节的例子。第五节第五节 OCL在在UML建模中的应用建模中的应用图图8-5 UML类图示例类图示例第五节第五节 OCL在在UML建模中的应用建模中的应用41、OCL与与UML元模型元模型 42、用、用OCL表达对象性质约束表达对象性质约束 43、OCL的支持工具的支持工具 1、OCL与与UML元模型元模型1)上下文)上下文(context)上下文是约束所依附的模型元素。上下文是约束所依附的模型元素。UML模模型中型中OCL上下文是用以保留字上下文是用以保留字“contex
48、t”开头的开头的表达式来描述的。例如,表达式来描述的。例如,context Person:income(d:Date):Integerpost:result=5000 此例中,后置条件约束的上下文为Person类的income(d:Date)操作。1、OCL与与UML元模型元模型2)包的上下文)包的上下文当用作分类器的包与外界环境关系清晰时,当用作分类器的包与外界环境关系清晰时,上述的上下文声明已经足够精确。当情况复杂时,上述的上下文声明已经足够精确。当情况复杂时,为了说明不变量、前置条件、后置约束条件为了说明不变量、前置条件、后置约束条件属于属于哪个包哪个包,这些约束可以包含在,这些约束可以
49、包含在“package”和和“endpackage”声明之间。声明之间。1、OCL与与UML元模型元模型包上下声明语法如下:包上下声明语法如下:package Package:SubPackagecontext X inv:.some invariant.context X:operationName(.)pre:.some precondition.endpackage 1、OCL与与UML元模型元模型3)self每一个每一个OCL表达式都存在于一个具体描述类表达式都存在于一个具体描述类型实例的上下文中。型实例的上下文中。OCL表达式中,用保留字表达式中,用保留字“self”来表示上下文实例
50、来表示上下文实例。例如,。例如,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
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。