【问题标题】:OCL collection operation on list attribute对列表属性的 OCL 收集操作
【发布时间】:2019-08-30 12:51:10
【问题描述】:

我正在模拟一个问题,其中有 学生课程。 每门课程都有一些其他课程作为先决条件,我想对学生的“joinCourse()”操作进行 OCL 约束,以允许他们在完成必修课程时加入课程。

这是我制作的 uml 类图的草稿:

现在,我的问题是: 是否可以进行collection 操作,例如在finishedCourses 之类的“list 属性” 上进行“includeAll”?

我做了这个 ocl 约束:

context Student::joinCourse(c: Course)
pre: self.finishedCourses->includesAll(c.requiredCourses)

正确吗?

先谢谢了!

【问题讨论】:

  • 不幸的是,您的“蓝图”(类图?)不可见,因为您问题中提供的网址需要注册。能不能换个方式分享一下?
  • 我建议您使用 OCL 评估器,例如 Eclipse OCL Interactive Xtext OCL Console 来练习您的 OCL 评估。

标签: class collections uml software-design ocl


【解决方案1】:

简而言之:是的,它是正确的。

理由

UML 2.5 specifications 中,多重性和集合之间有明确的联系:

7.5.3.2。 MultiplicityElement 是可以以某种方式实例化以表示值集合的元素。 (...)

OCL specification 解释了 self 与上下文的关系(第 7.3.4 条):

OCL 表达式可以是前置条件或后置条件的一部分, 对应于 «precondition» 和 «postcondition» 的刻板印象 与操作或其他行为特征相关的约束。 上下文实例 self 然后是拥有的类型的实例 操作或方法作为特征。

所以在你的表达式中,self 指的是一个Student,一个点允许访问它的属性,例如 self.finishedCourse 指的是一个集合属性。

OCL 定义了集合类型(第 11.6 条)和所有集合的格式良好的一般操作(第 11.7.1 条):

includesAll(c2 : Collection(T)) : Boolean
self 是否包含 c2 的所有元素?
发帖:result = c2->forAll(elem | self->includes(elem))

所以self.finishedCourses->includesAll(c.requiredCourses) 是一个有效的表达式,在您所期望的情况下是真或假。

补充说明

属性可以表示分类器的属性或关联的成员端。您可以将finishedCourse 表示为StudentCourse 之间第二次关联的结束(要理解的是,所有课程都不一定完成)。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2020-07-19
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多