GB/T 28174.3-2011 统一建模语言(UML) 第3部分:对象约束语言(OCL)
- 名 称:GB/T 28174.3-2011 统一建模语言(UML) 第3部分:对象约束语言(OCL) - 下载地址2
- 下载地址:[下载地址2]
- 提 取 码:
- 浏览次数:3
发表评论
加入收藏夹
错误报告
目录| 新闻评论(共有 0 条评论) |
资料介绍
ICS 35. 080 L 77
中 华 人 民 共 和 国 国 家 标 准
GB/T 28174.3—2011
统一建模语言(UML)
第 3 部分 :对象约束语言(OCL)
Unified modelinglanguage(UML) —
Part3:Objectconstraintlanguage(OCL)
2011-12-30发布 2012-06-01实施
中华人民共和国国家质量监督检验检疫总局中 国 国 家 标 准 化 管 理 委 员 会
发
布
GB/T 28174.3—2011
目 次
前言 Ⅲ
引言 Ⅳ
1 范围 1
2 规范性引用文件 1
3 对象约束语言描述 1
4 抽象句法 23
5 具体句法 45
6 采用 UML描述的语义 75
7 OCL标准库 108
8 UML模型中 OCL表达式的使用 127
9 OCL、UML与 MOF三种元模型的衔接 136
Ⅰ
GB/T 28174.3—2011
前 言
GB/T 28174《统一建模语言(UML)》分为 4个部分 :
— 第 1部分 :基础结构 ;
— 第 2部分 :上层结构 ;
— 第 3部分 :对象约束语言(OCL) ;
— 第 4部分 : 图交换 。
本部分为 GB/T 28174的第 3部分 。
本部分按照 GB/T 1. 1—2009给出的规则起草 。
本部分参考面向对象工作组(OMG)的《统一建模语言 :对象约束语言(OCL)》2. 0 版 。
请注意本文件的某些内容可能涉及专利 。本文件的发布机构不承担识别这些专利的责任 。
本部分由全国信息技术标准化技术委员会(SAC/TC28)提出并归 口 。
本部分起草单位 :广东省广业信息产业集团有限公司 、广东万维博通信息技术有限公司 、镇江金钛软件有限公司 、北京大学 、中国电子技术标准化研究所 。
本部分主要起 草 人 : 许 立 勇 、周 伟 强 、唐 泽 欢 、江 善 东 、黄 孝 和 、杨 三 宝 、丁 力 、吴 炯 祥 、邓 海 强 、胡红林 、高健 。
Ⅲ
GB/T 28174.3—2011
引 言
统一建模语言(UML)是一种可视化规约语言 ,用于定义和构造计算机信息系统的制品,并将其文档化 。它是一种通用建模语言 ,可以和所有主流的面向对象和面向构件的方法一起使用 ,并适用于所有的应用领域和实现平台(如 :CORBA、J2EE、. NET等) 。
0. 1 统一建模语言不同版本之间的关系
由于 UML 的技术较新 ,所以该国际标准历经多次的版本演化 ,下面是 UML在 OMG 的演化过程 : 1997 UML1. 1
1998 UML1. 2
1999 UML1. 3
2001 UML1. 4
2003 UML2. 0
GB/T 28174的本部分正文中的 UML均指 UML2. 0 统一建模语言和 GB/T 28174。
0. 2 关于对读者的建议
需要了解语言中的元模型构造物 ,利用这些构造物进行元模型扩展或者是构造新的建模语言的用户可阅读基础结构部分(GB/T 28174. 1) 。
应用系统建模用户和建模工具制造方都需阅读上层结构部分(GB/T 28174. 2) 。但要注意 ,该部分的内容是交叉引用的 ,可不按目次顺序阅读 。
对于要精确地对模型进行约束的应用系统建模用户或要支持对象约束语言的建模工具制造方 ,需阅读对象约束语言部分(GB/T 28174. 3) 。
支持在不同的软件工具间平滑且无缝地交换文档的建模工具制造方 ,需阅读图交互部分 。
Ⅳ
GB/T 28174.3—2011
统一建模语言(UML)
第 3 部分 :对象约束语言(OCL)
1 范围
GB/T 28174的本部分规定了用于对各类软件系统进行可视化 、详述 、构造和文档化的统一建模语言 。本语言也可用于对其他领域进行建模 。
本部分是一种形式语言 ,它适用于描述 UML模型上的表达式 。这些表达式以规范的方式 ,规定了如何描述系统在建模过程中应成立的不变条件以及对模型中对象的查询 。
2 规范性引用文件
下列文件对于本文件的应用是必不可少的 。凡是注 日期的引用文件 ,仅注 日期的版本适用于本文件 。凡是不注日期的引用文件 ,其最新版本(包括所有的修改单)适用于本文件 。
GB/T 28174. 1 统一建模语言(UML) 第 1部分 :基础结构
GB/T 28174. 2 统一建模语言(UML) 第 2部分 :上层结构
3 对象约束语言描述
3. 1 OCL 的作用
UML 图(例如类图)通常不够精细 ,无法提供与规范有关的一切侧面 。 这其中就缺少描述模型中关于对象的添加约束 。这些约束常常采用自然语言描述 。 而实践表明 ,这样做经常造成歧义 。 为了写出无歧义的约束 , 已经开发出几种新的所谓 “形式语言 ”。传统上的形式语言 ,缺点是仅适合于有相当数学背景的人员 ,普通业务或系统建模者难以使用 。
OCL即为填补这一空白而研制出来 。它是一种保留了易读易写特点的形式语言 。 它已在 IBM 的保险分部作为一种业务建模语言开发出来 ,根植于 Syntropy方法 。
OCL是一种纯粹的规约语言 , 因而保证了 OCL表达式不带副作用 。 当对 一 OCL表达式求值时 ,只是返回一个值 。它不能改动模型中的任何事物 。 这意味着 , 系统的状态绝不因 OCL表达式的求值而改变 ,纵然能用 OCL表达式去规定一个状态的改变(例如 ,在后置条件中) 。
OCL不是编程语言 , 因此 ,不可能以 OCL写出程序逻辑或流控制 。在 OCL之内 ,不能启用进程或激活非查询操作 。 OCL本是一种建模语言 , 因此 OCL表达式按定义不能直接执行 。
OCL是一种类型化语言 ,其中每一 OCL表达式都有一类型 。 OCL表达式要成为良构的 , 就应符合该语言的类型符合性 规 则 。 例 如 , 不 能 拿 Integer与 String作 比 较 。 UML模 型 内 定 义 的 每 一 类 目 (Classifier) ,都 代 表 一 种 独 特 的 OCL类 型 。此 外 , OCL还 包 含 一 组 补 充 的 预 定 义 类 型(这 在 第 7 章“OCL标准库 ”中描述) 。
作为一种规约语言 ,所有实现问题都超出 OCL 的范围 ,不能以 OCL表达 。
对 OCL表达式的求值是瞬时的 。这就是说 ,模型中各对象的状态 ,在求值期间不能改变 。
3. 1. 1 OCL使用
OCL能用于若干不同 目的 :
a) 作为一种查询语言 ;
b) 在类模型中规定对类和类型的不变式 ;
c) 规定衍型(Stereotype)的类型不变式 ;
1
GB/T 28174.3—2011
d) 描述对操作(Operation)和方法(Method)的前置条件与后置条件 ;
e) 描述守卫(Guards) ;
f) 规定消息和动作的目标(集) ;
g) 规定对操作的约束 ;
h) 规定对属性的衍生规则 ;
i) 用于 UML模型中的任一表达式 。
3. 2 引言
3. 2. 1 图例
如下所示以 Courier字体写成的文本 ,是一个 OCL表达式 :
This is anOCL expression
关键字 context引入表达式的语境 。关键字 inv、pre 与post分别指代约束的衍型《invariant》、 《precondition》与《postcondition》。实际 OCL表达式跟在冒号之后 。
contextTypeName inv:
this is anOCL expression with stereotype《invariant》in the
在本部分的各(context)o种例子中(fTypeNa)m,O(e)L(a)关键(noth)e字以黑体(rstring)书 写 。 黑 体 没 有 形 式 意 义 , 只 为 使 表 达 式 更 易 阅 读 。
OCL表达式仅以 ASCII字符编写 。
各章条主要文本之内的英文用斜体字 ,指 OCL 的表达式部件 。
3. 2. 2 类图举例
图 1是用于本章中的例子 。
图 1 类图例子
2
GB/T 28174.3—2011
3. 3 与 UML元模型的关系
3. 3. 1 Self(自身)
OCL表达式在特定类型 实 例 的 语 境 中 写 成 。 在 OCL表 达 式 中 , 保 留 字 self用 以 引 用 语 境 的 实例 。例如 ,若语境是 Company(公司) ,则 self指 Company的一个实例 。
3. 3. 2 规定 UML语境
UML模型之内 OCL表达式的语境 ,能通过位于 OCL表达式开始处的所谓 context(语境)声明来规定 。约束的语境声明如以下各条所示 。
显示在图中的约束 ,若具有适当的衍型 ,并以虚线连至其语境元素时 ,测试该约束不需显式的语境声明 。语境声明是可选的 。
3. 3. 3 不变式
OCL表达式可以是衍型化为《invariant》的 Constraint(约束)的 Invariant(不变式)的部件 。 当此不变式与 Classifier关联时 ,后者在本章中称为一个 “类型 ”。OCL表达式是类型的一种不变式 ,并在任何时刻对该类型的所有实例都应为真(注意 :表达不变式的所有 OCL表达式都是 Boolean类型的) 。
例如 , 当处于图 1 的 Company类型的语境时 ,如下表达式就会规定雇员数应总是超过 50人的不变式 :
self. numberOfEmployees>50
其中 self是 Company类型的实例(能将 self视为从此处开始对该表达式求值的对象) 。这一不变式对此 Company类型的每一实例都成立 。
一个 OCL表达式的语境实例的类型 ,是不变式的一部分 , 写出时带有关键字 context跟以类型的名称 。标号inv:声明此约束是一种《invariant》约束 。
contextCompany inv:
self. numberOfEmployees>50
在多数情况下 ,关键字 self因语境清楚而能省去 ,像以上各例子的情形 。作为对 self的一种替代 ,能定义起到 self作用的不同名称 :
contextc:Company inv:
c. numberOfEmployees>50这一不变式与前者等价 。
此约束的名称 可 以 可 选 地 写 在 关 键 字 inv之 后 , 以 使 能 按 名 对 其 引 用 。 下 例 中 约 束 的 名 称 是enoughEmplogees。
contextc:Company inv enoughEmployees:
c. numberOfEmployees>50
3. 3. 4 前置条件与后置条件
OCL表达 式 可 以 是 Precondition(前 置 条 件) 或 Postcondition(后 置 条 件) 的 部 分 , 对 应 于 与Operation或与其他行为特征关联的 Constraint的《precondition》衍型或《postcondition》衍型 。 因此 ,语境实例 self是 一 个 拥 有 以 操 作 或 方 法 作 为 特 征 的 类 型 的 实 例 。 OCL 中 的 语 境 声 明 , 采 用 关 键 字context跟以类 型 和 操 作 声 明 。 约 束 的 衍 型 , 以 把 标 号 “pre:”和 “post:”置 于 实 际 Precondition 和postcondition之前来表明 。
contextTypename: :operationName(param1:Type1,. . . ) :ReturnType
pre:param1> . . .
名称(post): self(resu)l .于. 引用操作对其调用的对象的表达式 。保留字 result指代操作的结果(如果有时) 。
参数(param1)的名称也能用于 OCL表达式 。在此例图中 ,能写成 :
contextPerson: :income(d:Date) :Integer
3
GB/T 28174.3—2011
前置条件(post):后(su)置lt件的(000)名称 ,可以可选地写在关键字 pre或 post之后 , 以使对此约束能按名引用 。
在下面例子中 ,前置条件名是 parameterOK,后置条件名是 resultOK。在 UML元模型中 ,这些名称都是从 ModelElement中继承来的元类 Constraint的属性 name的值 。
contextTypename: :operationName(param1:Type1,. . . ) :ReturnType
pre parameterOk:param1> . . .
postresultOk:result= . . .
3. 3. 5 包语境
当 Classifier所属的包对环境清楚时 ,上述语境声明足够准确 。为了在包不变式中显式规定前后置条件 Constraints的所属 ,可将这些约束置于“package”语句与“endpackage”语句之间 。包语句有句法 :
packagePackage: :SubPackage
contextX inv:
. . . some invariant. . .
contextX: :operationName(. . )
pre:. . . some precondition . . .
endpackage
OCL文件(或 “流 ”)可包含任意数目的包语句 ,这使所有的不变式 、前置条件和后置条件都能写在并存在于一个文件之内 。这一文件可作为单独实体与 UML模型共存 。
3. 3. 6 操作主体表达式
OCL表达式可用于指明查询操作的结果 。采用如下句法就能做到这一点 :
contextTypename: :operationName(param1:Type1,. . . ) :ReturnType
body:--some expression
此表达式应与操作的结果类型符合 。像在前后置条件中那样 ,此表达式中可使用参数 。在操作语境之后 ,可把前置条件 、后置条件与主体表达式混在一起 。例如 :
contextPerson: :getCurrentSpouse() :Person
bod(pre)y:s:s(e)llfism(M)a(a)r(r)ia(r)ig(e)e(d)rsel(ue)ect(m |m. ended= false) . spouse
3. 3. 7 初始值与衍生值
OCL表达式可用于指明属性或关联端的初始值或衍生值 。采用如下句法就能做到这一点 : contextTypename: :attributeName:Type
init:--some expression representing the initialvalue
contextTypename: :assocRoleName:Type
derive:-- some expression representing the derivation rule
此表达式应与属性的结果类型符合 。在语境为关联端的情况下 , 当势域最多 1个时 ,此表达式应与该端的类目符合 ; 当势域可多于 1 时 ,应与 Set或 OrderSet符合 。在一个语境之后 ,初始表达式与衍生表达式可混在一起 。例如 :
contextPerson: :income:Integer
init:parents. income-> sum×1%--pocketallowance
derive:ifunderAge
then parents. income-> sum×1%--pocketallowance
elsejob. salary--income from regularjob
endif
4
GB/T 28174.3—2011
3. 3. 8 其他表达式类型
任何 OCL表达式都能用作 UML元类 Expression或其子类型之一的属性的值 。在这种情况下 , 由语义段描述该表达式的意义 。为此 ,采用一种专用的 Expression子类 ,称为 ExpressionInOcl。其定义见 8. 1“引言 ”。
3. 4 基本值与类型
在 OCL 中 ,有若干基本类型是预定义的 ,建模者随时可用 。这些预定义的值类型都独立于任何对象模型和 OCL定义的部件 。
OCL 中的最基 本 值 是 基 本 类 型 之 一 的 值 。 OCL 的 基 本 类 型 , 以 及 所 对 应 的 值 的 例 子 , 如 表 1所示 。
表 1 基本类型
类 型
值
布尔
真 ,假
整数
1、-5、2、34、26524, …
实数
1. 5、3. 14, …
串
“To beornotto be … ”
OCL定义了对预定义类型的若干操作 。 表 2 给出对这些预定义类型进行操作的例子 。 全部操作的一览表见 7. 4“原子类型 ”。
表 2 预定义类型上的操作
类 型
操 作
整数
* 、+ 、- 、/、abs()
实数
* 、+ 、- 、/、floor()
布尔
与 、或 、异或 、非 、蕴涵 、若-则-否则
串
contat() ,size() ,substring()
Collection(汇集) 、Set(集合) 、Bag(袋) 、Sequence(序列) 和 Tuple(元组) 也都是基本类型 。其规约在下面各条描述 。
3. 4. 1 出 自 UML模型的类型
每一 OCL表达式都在 UML模型 、若干类目(类型与类 , ……) 、类目的特征与关联及类目泛化的语境中写成 。UML模型中的所有类目 ,都是附接到该模型的 OCL表达式中的类型 。
3. 4. 2 枚举类型
枚举是 UML 中的 Datatype(数据类型)并有一名称 ,正如其他任何 Classifier那样 。一个枚举定义了若干枚举文字 , 即 该 枚 举 的 可 能 的 值 。 在 OCL 之 内 能 引 用 枚 举 的 值 。 当 在 举 例 模 型 中 具 有 取 值“男 ”或“女 ”的命名为 Gender(性别)的 Datatype时 ,能按如下方式使用 :
contextPerson inv:gender= Gender: :male
3. 4. 3 “令 ”(Let)表达式
有时 ,子表达式在一个约束中不只一次使用 。“令”表达式允许定义可在该约束中使用的变量 。
contextPerson inv:
5
GB/T 28174.3—2011
if(le)tisUnem(incom)ep:loyed(Integ)eth(r)n(s)elf. job. salary-> sum()in
income<100
else
endif income> = 100
“令 ”表达式可包括在任何种类的 OCL表达式内 。它仅在这一特定表达式之内是已知的 。
3. 4. 4 通过《definition》表达式定义添加操作与属性
“令 ”(Let)表达式使变量能用于 OCL表达式 。为了对多重 OCL表达式能重用变量与操作 ,可采用带衍型《definition》的 Constraint,其中定义了 helper变量与操作 。这一《definition》Constraint应附接到一个 Classifier,且只能包含变量与操作的定义 ,别无其他 。在《definition》约束中定义的所有变量和操作 ,在同一语境中都是已知的 ,与能用 Classifier的任何性质的地方一样 。这些变量和操作都是带有该类目的衍型《OclHelper》的属性和操作 。将其用于 OCL表达式时 ,与使用正常的属性或操作的方式完全相同 。属性或操作定义的句法类似于 “令 ”表达式 ,但每一属性和操作定义都以关键字“def”作为前缀 ,如以下所示 :
contextPerson
“sile:属(I)t(n):性(t):e:jl称lan(R)ld(a)l(l)e)isi性(t)le关(t))联端和操作的名称 ,两者不可冲突 。
利用这一定义句法 ,等同于在 UML 中定义带有衍型《OclHelper》(对其衍生附接有 OCL约束) 的属性或操作 。
3. 4. 5 类型符合性
OCL是一种类型化语言 ,其基本值类型按类型层次来组织 。这种层次关系确定了不同类型相互之间的符合性 。例如 ,不能拿 Integer与 Boolean或 String作比较 。
对 OCL表达式 ,其中所有类型都符合时才是有效的表达式 。 OCL表达式中的类型不符合时是无效的表达式 。它带有类型 符合性差错 。 当 type1 的实例在 type2 实例预期的任何部位都可被代换时 ,类型 type1 与 type2 才符合 。对于类图中的类型 ,类型符合性规则很简单 :
a) 每类型都与其每一超类型符合 ;
b) 类 型 符 合 性 具 有 传 递 性 : 若 type1 与 type2 符 合 , 且 type2 与 type3符 合 , 则 type1 与 type3符合 。
其效果是 ,一个类型与其超类及所有各上层超类都符合 。对 OCL标准库中的类型 ,类型符合性规则如表 3所列 。
表 3 类型符合性规则
类 型
与其符合或是其子类型
条 件
集合(T1)
汇集(T2)
当 T1与 T2符合时
序列(T1)
汇集(T2)
当 T1与 T2符合时
袋(T1)
汇集(T2)
当 T1与 T2符合时
整数
实数
各汇集类型之间的符合性关系 ,只有当它们是互相符合的元素类型的汇集时才成立 。对于汇集的符合性规则的完整描述 ,见 3. 5. 13“汇集类型层次与类型符合性规则 ”。
表 4是有效与无效表达式的举例 。
6
GB/T 28174.3—2011
表 4 有效与无效表达式
OCL表达式
是否有效
说明
1+2* 34
是
1+“motorcycle”
否
String类型与 Integer类型不符合
23* 假
否
Boolean类型与 Integer类型不符合
12+13. 5
是
3. 4. 6 重定类型或铸型
在某些情形下 ,所希望使用的对象性质 ,是在该对象当前已知类型的子类型上定义的 。 因为这一性质未在当前已知的类型上定义 ,所以造成类型符合性差错 。
当确信对象的实际类型是子类型时 , 能采用操作 oclAsType(OclType) 对该对象重定类型 。此操作得到同一对象 ,但已知类型是变元 OclType。 当有一类型 Type1 的对象 object, 而 Type2 是另一类型时 ,允许写成 :
object. oclAsType(Type2)--evaluates to objectwith type Type2
一个对象只能重定类型为其子类型之一 ; 因此 ,本例中的 Type2应是 Type1 的一个子类型 。
当对象的实际类型不是对其重定类型的类型的子类型时 ,表达式是未定义的(见 3. 4. 11“未定义的值 ”) 。
3. 4. 7 先后次序规则
OCL 中各操作的先后次序 ,从最高者起依次是 :
a) @pre;
b) 点与箭头操作 :“. ”与“→ ”;
c) 一元的 “非 ”与一元的负“- ”;
d) “* ”与 “/”;
e) “+ ”与二元“- ”;
f) “若-则-否则-结束若 ”;
)) “““ ”””、、,“““”“<“;””、“;> = ”;
j) “蕴涵 ”。
能用圆括号 “(”和 “) ”改变先后次序 。
3. 4. 8 中缀操作符的使用
中缀操作(OCL)符(中)。允当(许)某(使)一用类(中)型(缀)定(操)义(作)这(符)些。操“作(+)”符、“之-一”、并“带(*)”有、“正(/)”确、“特征(<)”、标“记时(>”)、“,将用(<>)作”、中“”作(和)。“表(>)式(”都):用作
a+b
在概念上等于表达式 :
a+(b)
这是启用对 a 的“+ ”操作 ,而 b作为该操作的参数 。
“< >对”某、“并(一)类”、“或(型定)”和(义)“异或(的中 缀)”,返(操)回(作)类(符) ,型应是 Bo(应 恰 有 一)o个lea类(数)型。的(对)。中 缀 操 作 符 “< ”、“> ”、“< = ”、“> = ”、
3. 4. 9 关键字
OCL 中的关键字都是保留字 。这就是说 ,关键字在 OCL表达式中任何地方都不能作为包 、类型或
7
GB/T 28174.3—2011
性质的名称出现 。关键字清单如下 :
and
attr
context
def
else
endif
endpackage
if
implies
in
inv
let
not
open
or
package
post
pre
then
xor
3. 4. 10 注释
OCL 中的注释 ,紧跟在相继的两个短横(减号) 之后写出 。 凡是直接紧跟两短横的 ,直至并包括行末都是注释部分 。例如 :
--this is a comment
3. 4. 11 未定义的值
某些表达式在求值时会有未定义的值 。 例如 ,对于对象不支持的类型以 OclAsType() 重定类型 ,或从空汇集中取出->first()(第 1 个) 元素 ,都会得到未定义值 。一般来说 ,表达式中部件之一未定义时 ,整个表达式就未定义 。不过对这一规则有若干重要例外 。首先 ,有几个逻辑运算符 :
a) “真 ”与一切为 “真 ”求 “或 ”;
b) “假 ”与一切为 “假 ”求 “并 ”;
c) “假 ”蕴涵一切为 “真 ”。
此处对 “或 ”与 “并 ”的规则都有效而不论各变元的次序 ,而且不论其他子表达式是否已知 。
“若 ”(IF)表达式是另一例外 。 只要选出的转移有效它就有效 ,而不论其他转移的值 。
最后 , 当表达式的值未定义时 ,有一种用于测试的显式操作 。 OclIsUndefined() 是对 OclAny的操作 , 当其变元未定义时结果为 “真 ”,否则为 “假 ”。
3. 5 对象与性质
OCL表达式能引用 Classifier,例如 ,类型 、类 、接口 、关联(起类型作用) 和数据类型 。此外 ,在这些类型等之上定义的无副作用的所有属性 、关联端 、方法和操作 , 均能加以使用 。 在类模型中 , 当操作的isQuery属性为真时 ,此操作或方法定义为无副作用的 。在本部分中 ,把属性 、关联端 、操作和无副作用的方法都称为性质 。性质是下列各项之一 :
a) Attribute;
b) AssociationEnd;
c) 其isQuery为真的 Operation;
d) 其isQuery为真的 Method。
8
GB/T 28174.3—2011
在类图中定义的对象的性质的值 ,在 OCL表达式中由一小点跟以该性质的名称来规定 :
contextAType inv:
self. property
若 self是对某一对象的引用 ,则 self. property是 self的性质 property 的值 。
3. 5. 1 性质 :属性
例如 ,一个 Person(人)的年龄写作 self. age:
contextPerson inv:
self. age>0
子表达式 self. age的值 ,是对以 self标识的 Person的特别实例的属性 age的值 。 这一子表达式的类型是属性 age的类型 ,它是标准的 Integer类型 。
使用属性和对基本值类型所定义的操作 ,能表达在类别类模型上的计算等 。例如 ,某业务规则有可能是“Person(人)的年龄永远大于零 。”这可陈述为上面的不变式 。
在 UML模型中 ,属性可以有势域 。 只要属性的势域大于 1,结果类型就是各值的汇集 。 OCL 中的汇集在本章后部描述 。
3. 5. 2 性质 :操作
操作中可以有参数 。例如前面所述的 Person这一对象 ,其收入以 日期的函数表达 。对 Person的aPerson和 日期 aDate,此操作可按如下方式访问 :
aPerson. income(aDate)
这一操作调用的结果是 该 操 作 返 回 类 型 的 值 , 这 在 本 例 中 是 Integer。 当 此 操 作 具 有 out或 兼 有 in/out参数时 ,这一操作的结果是包含 out、in/out的全部参数与返回值的元组 。例如 , 当收入操作有一out参数 bonus时 ,上述操作调用的结果是 Tuple(bonus: Integer,result: Integer) 类 型 的 。 可 采 用 out参数的名称和关键字 result来访问这些值 ,例如 :
s(s),ti(i)a(a)))在..r(b)l内(an)d。收入或 in/out全部参数的值都是必要的 。
对操作进行定义
操作本身可由后置条件约束来定义 。这是一种衍型化为《postcondition》的约束 。 由此操作返回的对象 ,能由 result加以引用 。所采用形式如下 :
contextPerson: :income(d:Date) :Integer
这(po)st一:义(su)l的(t)a侧(g)e,*可1引用(000)定义中的操作(即该定义可以是递归的) ,条件是这种递归不是无限的 。在
前置条件或后置条件之内 ,也可使用操作的参数 。 当操作中没有 out或 in/out参数时 ,result的类型是该操作的返回类型 ,这在上例中是 Integer。 当操作具有 out或 in/out参 数 时 , 如 前 所 述 , 返 回 类 型 是Tuple。带 out参数 bonus的收入操作的后置条件 ,可采用如下形式 :
contextPerson: :income(d:Date,bonus:Integer) :Integer
为了(post):引(r)e用(su)无ltslt(u)le操{.作(bo)n或}us法..,.带,空变元表的圆括号是必备的 :
contextCompany inv:
self. stockPrice() >0
3. 5. 3 性质 :关联端与导航
从某一特定对象开始 ,能按类图对关联进行导航 , 以引用其他对象及其性质 。 为此 ,采用相反关联端对此关联导航 :
object. associationEndName
此表达式的值是关联 associationEndName另一侧的对象的集合 。若此关联端的势域有最大值 1
9
GB/T 28174.3—2011
(“0…1”或“1”) ,则此表达式的值是一个对象 。 在此类图例子中 , 当在 Company(公司) 的语境启动(即self是 Company的实例)时 ,能写成 :
contextCompany
inv(inv):: self(self).. empl(mana)o(g)y(e)e(r)e.-ino(n)t(e)Em(mp)lpt(oy)y(e))= false
在第一个不变式中 ,self. manager是 一 Person, 原 因 是 该 关 联 的 势 域 为 1。 在 第 二 个 不 变 式 中 , self. employee将在 Person的 Set上求值 。按系统 设 定 , 导 航 将 得 到 一 个 Set。 当 类 图 上 的 关 联 带 有{ordered}时 ,导航得到一个 OrderSet。
Collections像 Sets、OrderedSets、Bags和 Sequences一样 ,都是 OCL 中的预定义类型 。 在其上有一大批预定义的操作 。汇集本身的性质 ,采用箭头“-> ”跟以该性质的名称进行访问 。下例是在一个人的语境之中 :
contextPerson inv:
self. employer-> size() <3
这应用于对 Setself. employer的性质 size,得到 Personself的雇主数 。
contextPerson inv:
self. employer->isEmpty()
这应用于对集合 self. employer的性质isEmpty。 当雇主集合为空时求值为真 ,否则为假 。缺失关联端名
当关联端的名称在关联的两端之一缺失时 ,在此关联端的类型名用作角色名 。 当导致歧义时 ,角色名是必备的 。这是例 如 自 反 性 关 联 中 未 命 名 角 色 名的 情 况 。 当 角 色 名 有 歧 义 时 , 便 不 能 在 OCL 中使用 。
对势域为零或一的关联的导航
因为角色管理者的势域为 1,所以 self. manager是类型 Person 的一个对象 。 这样的单一对象同样能用作一个 Set。 于是 ,其行为就好像是包含单个对象的 Set。作为一个集的用法 ,是通过箭头跟以Set的性质 。如下例所示 :
contextCompany inv:
子 表(se)l达(f). 式(m)ase(n)l(a)f(g)enag(size)e(r) 作(1) 一个 Set, 因为此箭头用以访问对集合的性质 size。这 一 表达式求值
为真 。
contextCompany inv:
self. manager->foo
子表达式 self. manager用作一个 Set, 因为箭头用以访问 Set上的性质 foo。这一表达式不正确 ,因为 foo不是 Set的已定义的性质 。
contextCompany inv:
self. manager. age>40
子表达式 self. manager用作一个 Person, 因为这里的小点用于访问 Person的性质 age。
在关联可选(势域 0…1) 的情况下 , 当对该关联导航时 ,检查是否存在一个对象特别有用 。对此例能写出 :
contextPerson inv:
将性质(se)l复(f). 合(w)ife->notEmpty()implies self. wife. gender= Gender: :female
能把性质复合起来构成更复杂的表达式 。一条重要的规则是 :OCL表达式总是对特定类型的特定对象进行求值 。在得到一个结果之后 ,能不断地将另一性质应用于该结果 , 以得到新的结果值 。 因此 ,每一 OCL表达式都能从左到右读出并求值 。
对类图举例运用经复合的性质的两种不变式如下 :
contextPerson inv:
self. wife->notEmpty()implies self. wife. age> = 18and
10
[1] 已婚者年龄 >= 18
GB/T 28174.3—2011
[2] 公(se)l司(f). 雇员最多(husband)-5(>)0(n)人(ot)Empty()implies self. husband. age> = 18
contextCompany inv:
self. employee-> size() <= 50
3. 5. 4 向关联类导航
为了规定向关联类(举例中的工作岗位 Job 和婚姻状况 Marriage)的导航 ,OCL采用一个小点和以首字符小写的关联类的名称 :
contextPerson inv:
self. job
子表达式 self. job对一个在所属公司的所有岗位的 Set求值 。在关联类的情况 ,类图中没有显式角色名 。在此导航中所用的名称 job,是以首字符小写的关联类的名称 ,其方式与前面 “缺失角色名 ”中所述的相似 。
对递归关联的情况 ,类与本身关联 ,仅有关联类的名称是不够的 。需要区分对关联导航的方向以及此关联类的名称 。 以图 2模型为例 。
相关推荐
- GB/T 25334.1-2023 铁路机车车体 第1部分:内燃机车
- GB∕T 40389-2021 烧结金属材料(不包括硬质合金) 表面粗糙度的测定
- GB/T 15135-2018 燃气轮机 词汇
- GB/T 34560.4-2017 结构钢 第4部分:淬火加回火高屈服强度结构钢板交货技术条件
- GB/T 18570.5-2005 涂覆涂料前钢材表面处理 表面清洁度的评定试
- GB∕T 10123-2022 金属和合金的腐蚀 术语
- GB/T 5680-2023 奥氏体锰钢铸件
- GB/T 13681-1992 焊接 六角螺母
- GB/T 42994-2023 管理咨询服务指南 项目管理 正式版
- GB/T 34119-2017 轨道交通 机车车辆用电连接器

