一个受训者一次最多属于一个受训项目
这可以通过一个约束来证明,即对于给定的受训者,项目的日期永远不会重叠。
在 OCL 中,约束可以写成:
context Trainee inv:
self.ProjectHistory->forAll(h1,h2 |
h1<>h2 implies (h1.dateCompleted < h2.dateStarted) or
(h1.dateStarted > h2.dateCompleted))
还有:
context ProjectHistory inv:
self.dateStarted <= self.dateCompleted
假设dateCompleted设置为项目正在进行时的当前日期,并且我们知道项目正在通过另一种方式进行。
如果在项目进行时dateCompleted值为 0:
context ProjectHistory inv:
(self.dateStarted > 0) and
((self.dateCompleted = 0) or (self.dateStarted <= self.dateCompleted))
context Trainee inv:
self.ProjectHistory->select(dateCompleted = 0)->size() <= 1
context Trainee inv:
self.ProjectHistory
->forAll(h1,h2 |
h1<>h2 implies
if h1.dateCompleted = 0 then
h1.dateStarted > h2.dateCompleted
else
if h2.dateCompleted = 0 then
h2.dateStarted > h1.dateCompleted
else
(h1.dateCompleted < h2.dateStarted) or
(h1.dateStarted > h2.dateCompleted)
endif
endif
)
除此之外,使用关联类是正确的方法。
随着时间的推移,受训者可能会参加一个以上的项目。
所以任何数字,多重性0..1
必须是0..*
或快捷方式 *
。
0..1
如果该规则和以前的规则被替换为(随着时间的推移)一个受训者最多属于 1 个受训项目,则乘法必须是
一个部分可以运行多个项目。
所以任何数字,多重性1..*
必须是0..*
或捷径 *
一个项目可以有可能的受训者
may明显很多,所以高数不是 1。
只是有a project have many trainees
可能意味着最小数字是 ,1 但can have
最小数字是 0 而不是 1。
所以最后多样性是0..*
或捷径 *
,而不是1..1
以前的项目如何保留?
这要归功于多样性,0..*
而不是0..1
受训者与正在进行的项目(如果存在)没有关系。
总结一下:
对象图示例:
您可以检查是否遵循所有规则。
在某些情况下,您的属性名称包含类名称,例如projectName和traineeId,这是没有用的,我建议您删除属性名称中的类名称。