[答疑]《领域驱动设计》书上Tire的mileage不变式是否也有问题

DDD领域驱动设计批评文集

做强化自测题获得“软件方法建模师”称号

《软件方法》各章合集


Seven 2024-5-31 21:23

潘老师,我记得您写过要注意不变式写成等式的情况,领域驱动书上面的这个图,圈出的不变式是一个等式,是不是也有问题?

图片

UMLChina潘加宇

应该是有问题的。

Tire的mileage属性是一个冗余,花括号里的“不变式”其实是这个冗余属性的算式,说Tire的mileage是怎样算出来的。

我在文章《续1-续3:你的医书是假的!》里批评的“不变式”,有可能就是模仿这个图。

★在之前的答疑《领域驱动设计》里的这个不变式是不是也是错的,也列出了圈子对书中另一张错误图的模仿。

如果这样可以,领域驱动设计投资少、见效快、产量高、门槛低、仪式感十足的特点真的要充分发挥了。

我们可以随意添加可计算的冗余:

例如,在Car类中也加一个mileage属性,然后,再加一个“不变式”{mileage=sum(Tile. mileage)}。

例如,在Car类中再加一个positionstimeperiod集合属性,记录该Car的所有Tire的所有Position的time period,然后再配上一个“不变式”(此处作者删除若干字。删除?我看你是写不出来吧?)

*****以下是扩展*****

什么情况下不变式可以是等式?

涉及到的属性(关联)不是冗余的就行。知识点看《软件方法》第8章(umlchina.com/url/softmeth2024.html),可重点看“8.2.5 审查类和属性”和“8.3.4.1 关联是不得不记住的关系”。

我还是用《续1-续3:你的医书是假的!》里的订单例子举例,像下面这个不行:

图片

这个图和问题中的图是类似的,总价是可计算的冗余属性,本来就不应该存在。

下面这个可以:

图片

订单的配送项信息不是(也不能)从订单的订单项信息计算出来。订单的配送项存在多种可能,但不管是哪一种,上图最左侧关于“订单”的约束必须要遵守。

上图最左侧的约束是以自然语言表达的,严格来说只能算是约束的名称或描述,如果用OCL等形式化语言来表达约束内容,这个表达式就比较复杂了。以下是在AI帮助下得到的,看起来像是对的(OCL语法我也不熟):先定义两个统计集合,然后比较两个统计集合。

图片

(严格来说,应该是已完成的订单,此处就不花精力完善了。)

  • 44
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值