“**领域驱动设计”中的这个不变式是不是多余

道可道 2022-7-17 14:45

潘老师:我正在看*老师的“**领域驱动设计”,有个问题请教一下,这副图上的不变量觉得很别扭,是不是多余了?您有没有进一步学习不变量的资料推荐呢,我也在追更您的下册,里面似乎没有说到。

UMLChina潘加宇

“Post必须至少有一个PostCategory”是多余的。

关联在PostCategory这一端的多重性下界为1,这就已经足够了。

除了多余之外,“Post必须至少有一个PostCategory”里的“必须”二字更是多余++。“至少有一个PostCategory”已经清楚表达了取值范围,没有必要加一个“必须”。

还有,不变式的位置应该在类上,类的不变式,主语Post也是不需要的。

但会有一些开发人员喜欢这样的“DDD实践”,投资少,见效快,产量大,而且仪式感十足(哇塞,不变式,高大上),实在是刷工作量的神兵利器。

(invariant是一个表达式,值为真/假,译为“不变式”更合适。译为“不变量”,会让人误解这个“量”还可以取整数值、实数值……)

我帮作者改一下吧。如果一定要用这个Post例子来示范不变式,可以改成这样(虽然规则有点怪):

每个PostCategory规定了一个minLength(最小长度)和maxLength(最大长度),而针对任何一个Post对象,它所属的PostCategory集合和它的length(长度)属性值不能违反以下约束:

Post所属的PostCategory集合cats中,不存在这样的PostCategory:Post的长度(length)大于该PostCategory允许的最大长度(maxLength)或者小于该PostCategory允许的最小长度(minLength)。

关于参考资料:

(1)Bertrand Meyer的"Object-Oriented Software Construction",第2版

Invariant在计算机科学中早就有了,什么时候开始用在面向对象领域,我也不知道,但Bertrand Meyer在1988年出版的"Object-Oriented Software Construction"第1版就已经有了,见下面第1版截图:

(2)任何一本比较深入的UML建模书,里面有OCL内容的,例如《UML对象、组件和框架:Catalysis方法》,Desmond Francis D'Souza 等 著,清华大学出版社,英文原版出版于1999年。

(3)《软件方法》,后面也会写到。


以下是扩展

我猜想,会不会作者是从DDD的“祖师爷”或者“大神”那里学来的不变式示例?因此又翻看了“经典书籍”。

下图是《领域驱动设计》截图,还好,没有出现红字的情况。

《实现领域驱动设计》没有和问题图或上图类似的图例,作者虽然在书中多次提到不变式,但相关内容的质量嘛……

下面这页截图中的文字,应该是《实现领域驱动设计》中对不变式的定义了,还举了个例子。结合之前所给的类图一看,这不正是一一对应吗,每个“实体”都可以这样刷一遍,投资少,见效快,产量大,这个“不变式”真是妙哉!

《实现领域驱动设计》书中还有很多处提到不变式,不过好像也只有下图这一处勉强算是不变式的举例了,可惜还是错的——这是不变式?还是讲故事?

请暂时忽略其中的翻译问题。翻译问题我在

*《实现领域驱动设计》的翻译错误>>

*猴子掰玉米?比较不同版《领域驱动设计》说“不变式”、“聚合”>>

说过。


weixinpanjiayu2