我今天在OCL与一位教授进行了讨论。他认为在定义的函数上下文中允许不变量,后置条件和前置条件。
我的软件开发人员让我想要相信OCL会允许将一般约束放在模型上。像这个模型中的所有对象Person的约束都具有男性的性别,或者所有类车的对象都有四个轮子看起来非常有用,并且对我的模型使用声明性范例感觉是对的。
我有点像物质世界一样。如果我们将螺母拧在螺栓上,则允许螺母以一种方式安装。这些都是物理限制,无论我们采取什么行动,比如将螺母拧到螺栓上,并且不能违反,或者我们已经从根本上使模型无效。
他的观点是,在OCL中,我们只能在提供上下文的函数中定义约束(前置和后置条件/不变量)。
有人可以为我清楚吗?
答案 0 :(得分:2)
不确定我是否真的明白你的功能背景是什么意思。但是,OCL超越了不变量/前/后条件。
从OMG OCL 2.3.1规范[1] 7.2.1 在何处使用OCL :
OCL可用于多种用途:
所以,换句话说,你是对的,你可以在你描述的模型类上有一个约束(不确定你的意思)。
答案 1 :(得分:2)
你可以肯定地定义类的约束,如你所说。你需要澄清你对上下文的意思,因为你(和你的教授)可能互相误解了。
OCL有一个名为context的关键字,它基本上可以引用任何UML分类器(类型,类,接口,关联,数据类型......)。
您提到的示例实际上是通过简单表达式(例如:
)在OCL中最容易解决的context Person inv: self.age< = 120
context Person inv: self.countChildren()< = 20
答案 2 :(得分:1)
根据UML规范(编写时仍为2.5),约束上下文的上下文是模型的任何NameSpace,包括分类(Classes)。可以通过定义的OpaqueExpression指定约束,例如,通过OCL。
作为示例,请考虑以下帖子:http://lowcoupling.com/post/57689107913/constraining-uml-models-through-ocl
答案 3 :(得分:0)
As already noted, a Constraint may be placed on any UML namespace. However the semantics of invariants is only defined for classes. An invariant defined on a package is unspecified, which is unfortunate since it requires the definition of universal truth (on allInstances()) to be associated with each instance of some class potentially leading to redundant re-evaluation in naive OCL tooling. Look forward to inclusion of package invariants in a future OCL.