关于OCL中计算员工总薪资的表达式及标准示例的疑问
关于OCL中计算员工总薪资的表达式及标准示例的疑问
我太懂你这个困惑了!当初刚啃OCL标准的时候这段我也卡了好一会儿,咱们一步步理清楚:
首先你得知道OCL里有个很实用的语法糖——当你导航的关联是多值(也就是0..或1..)时,导航出来的结果本身就是集合,而且直接在后面加属性(比如.salary),就等价于对这个集合做了collect操作。
举个例子,你一开始想的写法:
p.job->collect(j : Job | j.salary)->sum()
其实和标准里写的:
self.job.salary->sum()
逻辑完全一致!因为self.job已经是该Person所有Job实例的集合了,self.job.salary会自动遍历集合里的每个Job,把它们的salary属性提取出来形成一个整数集合,再调用sum()就是总薪资。
至于标准里p.10的注释写“income from regular job”,大概率是文档里的表述简化——可能是举例时用“常规工作”来指代所有正式工作,但语法层面上job.salary已经覆盖了所有关联的Job实例,不是单指一个。
再回头看你担心的“是不是job被当成单个实例”:完全不会,因为你定义的Person和Job是0..*的关联,OCL会严格按照关联的基数来处理导航结果,所以self.job必然是Job的集合,不会是单个实例。标准里的写法只是用了OCL允许的简化语法,省略了显式的collect而已。
备注:内容来源于stack exchange,提问作者Xitog
相关产品推荐
相关产品推荐

