列表属性的 OCL 集合操作
OCL collection operation on list attribute
我正在对一个问题建模,其中有 学生 和 课程 。
每门课程都有一些其他课程作为先决条件,我想对学生的 "joinCourse()" 操作进行 OCL 约束,以允许他们在且仅当他们完成必修课程时才能加入课程。
这是我制作的 uml class 图的草稿:
现在,我的问题是:
可以在 "list attribute" 上进行 收集操作 ,如 "includeAll",如 finishedCourses?
我制作了这个 ocl 约束:
context Student::joinCourse(c: Course)
pre: self.finishedCourses->includesAll(c.requiredCourses)
正确吗?
提前致谢!
简而言之:是的,它是正确的。
理由
在UML 2.5 specifications中多重性和集合之间有明确的link:
7.5.3.2. A MultiplicityElement is an Element that may be instantiated in some way to represent a collection of values. (...)
OCL specification 解释了 self 与上下文的关系(条款 7.3.4):
The OCL expression can be part of a Precondition or Postcondition,
corresponding to «precondition» and «postcondition» stereotypes of
Constraint associated with an Operation or other behavioral feature.
The contextual instance self then is an instance of the type that owns
the operation or method as a feature.
所以在你的表达式中,self
指的是一个Student
,一个点允许访问它的属性,比如self.finishedCourse指的是一个集合属性。
OCL 定义了集合类型(条款 11.6)和对所有集合都具有良好格式的一般操作(条款 11.7.1):
includesAll(c2 : Collection(T)) : Boolean
Does self contain all the elements of c2
?
post: result = c2->forAll(elem | self->includes(elem))
所以 self.finishedCourses->includesAll(c.requiredCourses)
是一个有效的表达式,它在您期望的情况下是对还是错。
补充说明
一个属性可能表示分类器的一个属性或关联的成员端。您可以将 finishedCourse
表示为 Student
和 Course
之间的第二个关联的结束(请理解,所有课程不一定都完成)。
我正在对一个问题建模,其中有 学生 和 课程 。 每门课程都有一些其他课程作为先决条件,我想对学生的 "joinCourse()" 操作进行 OCL 约束,以允许他们在且仅当他们完成必修课程时才能加入课程。
这是我制作的 uml class 图的草稿:
现在,我的问题是: 可以在 "list attribute" 上进行 收集操作 ,如 "includeAll",如 finishedCourses?
我制作了这个 ocl 约束:
context Student::joinCourse(c: Course)
pre: self.finishedCourses->includesAll(c.requiredCourses)
正确吗?
提前致谢!
简而言之:是的,它是正确的。
理由
在UML 2.5 specifications中多重性和集合之间有明确的link:
7.5.3.2. A MultiplicityElement is an Element that may be instantiated in some way to represent a collection of values. (...)
OCL specification 解释了 self 与上下文的关系(条款 7.3.4):
The OCL expression can be part of a Precondition or Postcondition, corresponding to «precondition» and «postcondition» stereotypes of Constraint associated with an Operation or other behavioral feature. The contextual instance self then is an instance of the type that owns the operation or method as a feature.
所以在你的表达式中,self
指的是一个Student
,一个点允许访问它的属性,比如self.finishedCourse指的是一个集合属性。
OCL 定义了集合类型(条款 11.6)和对所有集合都具有良好格式的一般操作(条款 11.7.1):
includesAll(c2 : Collection(T)) : Boolean
Does self contain all the elements ofc2
?
post:result = c2->forAll(elem | self->includes(elem))
所以 self.finishedCourses->includesAll(c.requiredCourses)
是一个有效的表达式,它在您期望的情况下是对还是错。
补充说明
一个属性可能表示分类器的一个属性或关联的成员端。您可以将 finishedCourse
表示为 Student
和 Course
之间的第二个关联的结束(请理解,所有课程不一定都完成)。