You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 14:10:26