[英]How do I find a UML object if I only know the value of one of its attributes in OCL?
我有一个具有属性id
的 UML class Student
。 我想在 OCL 中编写一个查询,仅通过知道它的id
来查找特定的Student
。 我应该使用allInstances()
吗? 还是派生? 我对OCL不是很熟悉。
通常 OCL 用于表达对 UML model 的一些约束,与给定的 class 实例( context
或self
)相关,您将从特定实例开始导航。
但是 OCL 是作为一种正式的规范语言开发的,它不仅可以用来指定约束,特别是 7.1 节中解释的查询。 的 OCL 规范。
如果您想表达有关 class MyClass
的所有可能实例的内容,则可以从以下内容开始您的子句:
MyClass.allInstances()
Wich 是包含给定 class 的所有实例的集合。 通常,您将在此集合上进行操作以进一步指定一些 model 功能。
例如,为了表达一个 id 的唯一性,你可以在这个集合上写一个 Boolean 子句(基于 OCL 规范的第 7.5.10 节的例子)
MyClass.allInstances()->forAll(e1, e2 | e1 <> e2 implies e1.id <> e2.id)
您可以对此类集合执行的操作之一是通过选择与特定条件匹配的元素来创建子集,这应该可以回答您的问题:
MyClass.allInstances()->select(c|c.id='...')
额外的想法:
OCL 是一种抽象语言。 没有说明如何实现这个表达式。 这可能是对内存中集合的一次低效迭代,或者是非常有效的 SQL 查询。 OCL 将帮助您定义结果应该是什么,而不是如何真正得到它。 因此,在这个抽象级别上,性能不应该是您关心的问题。
现在,您没有说明 OCL 查询的目的。 如果要解释如何执行数据库查询,您可以看到关注点分离的一些优势:识别相关类和可重用查询并使用存储库模式丰富您的 model:存储库是(单一)class MyClassRepository
充当数据库中给定MyClass
的所有对象的容器。 然后,您将定义操作和查询数据库的操作。 通常,您将有几个getXxxx()
操作,例如 getById( getById()
,它们返回一个或一组多个实例。 首先,它将明确将要实现的数据库功能,其次,新操作可用于简化一些 OCL 表达式。
是的。 allInstances() 是最简单的解决方案,但可能效率最低且不一定灵活。
如果您的应用程序和约束(针对一所学校)扩展到多所学校,您可能会意识到实际上您想要特定学校的学生,因此通常最好将 go 到逻辑上下文并调用学校上的方法以返回给学生。 也许这就是您所说的“派生”。 School.students->at(id) 的实现很可能使用 Map 提供多重收益,通过不为每次访问搜索整个 model 并通过快速访问您已经获得的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.