“**领域驱动设计”中的这个不变式是不是多余
道可道 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的“祖师爷”或者“大神”那里学来的不变式示例?因此又翻看了“经典书籍”。
下图是《领域驱动设计》截图,还好,没有出现红字的情况。
《实现领域驱动设计》没有和问题图或上图类似的图例,作者虽然在书中多次提到不变式,但相关内容的质量嘛……
下面这页截图中的文字,应该是《实现领域驱动设计》中对不变式的定义了,还举了个例子。结合之前所给的类图一看,这不正是一一对应吗,每个“实体”都可以这样刷一遍,投资少,见效快,产量大,这个“不变式”真是妙哉!
《实现领域驱动设计》书中还有很多处提到不变式,不过好像也只有下图这一处勉强算是不变式的举例了,可惜还是错的——这是不变式?还是讲故事?
请暂时忽略其中的翻译问题。翻译问题我在
*猴子掰玉米?比较不同版《领域驱动设计》说“不变式”、“聚合”>>
说过。