前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DDD话语评价之二:“值对象”是DDD的创新吗(上)

DDD话语评价之二:“值对象”是DDD的创新吗(上)

作者头像
用户6288414
发布2021-10-13 10:51:51
4610
发布2021-10-13 10:51:51
举报
文章被收录于专栏:软件方法软件方法

节选自《软件方法(下)》:http://www.umlchina.com/book/softmeth.html,添加了一些内容。

8.2.8 评价DDD话语中的“值对象”

在识别类的时候,有的建模人员受到DDD话语体系的影响,会着急去分辨哪个类是实体(Entity),哪个类是值对象(Value Object),这是没有必要的,而且很容易成为遮掩无能的遮羞布。

8.2.8.1 历史回顾:不可变对象

1986年,Barbara Liskov和John Guttag在其讲述面向对象思想和CLU编程语言的书“Abstraction and Specification in Program Development”中,提到有两种对象:可变的(mutable)和不可变的(immutable),如图8-62。

图8-62 摘自Abstraction and Specification in Program Development, Liskov B. & Guttag. J. , 1986

******

CLU是Barbara Liskov和她的学生在1974-1975年间创造的编程语言,对后来的面向对象编程语言有重要影响。2008年,Barbara Liskov因在数据抽象、分布式计算和容错方面的贡献获得图灵奖。

Abstraction and Specification in Program Development无中译本。2000年,这两位作者又出了一本Program Development in Java: Abstraction, Specification, and Object-Oriented Design,所用的编程语言改成了Java。这本书有中译本,如图8-63。

******

图8-63 摘自《程序开发原理:抽象、规格与面向对象设计》,Liskov B. & Guttag. J. 著,裘健译,英文原版出版于2000年

再列早期一些使用“不可变对象”的文献,如图8-64和8-65。

图8-64 摘自Seamless Object-Oriented Software Architecture, Walden K. , & Nerson J. , 1994(本书无中译本)

******

Seamless Object-Oriented Software Architecture基于Bertrand Meryer的思想,作者是ISE Eiffel 2.2开发环境的主要开发者和BON(Business Object Notation)的发明者。ISE Eiffel是Interactive Software Engineering(由Bertrand Meryer创建)开发的Eiffel语言IDE,最初发布于1986年,现已改名为EiffelStudio,最新版本20.11。BON是类似于UML的建模表示法。

******

图8-65 摘自Non-Interference Properties of a Concurrent Object-Based Language: Proofs Based on an Operational Semantics, Hodges S. & Jones C. , 1995

现在,“不可变对象”依然在广泛使用,如图8-66。除了面向对象的书籍之外,更多的是出现在讲述函数范式的书籍中。

图8-66 摘自Seriously Good Software: Code that Works, Survives, and Wins, Faella M. , 2020

******

Seriously Good Software的中译本起名《你真的会写代码吗》,已于2021年7月出版。此处非广告。我未和出版社联系过,也不欣赏中译本乱改名的行为。提到此书只是随手举例,不代表推荐或不推荐阅读。

******

8.2.8.2 历史回顾:值对象

Martin Fowler和Kendall Scott在“UML Distilled”的第一版使用了“值对象(Value Object)”一词,如图8-67。

图8-67 摘自UML Distilled: Applying the Standard Object Modeling Language, Fowler, M. & Scott, K. , 1997(此版本无中译本)

Martin Fowler在他后续出版的书中继续使用“值对象”,如图8-68和图8-69。

图8-68 摘自《重构:改善既有代码的设计》,Martin Fowler 著,侯捷、熊节 译,英文原版出版于1999年

图8-69 摘自《企业应用架构模式》,Martin Fowler 著,王怀民、周斌 译,英文原版出版于2003年

J2EE话语体系也曾使用“值对象”,但有另外一种含义,相当于数据传输对象(Data Transfer Object),如图8-70。Martin Fowler在《企业应用架构模式》中讲述“值对象”模式时,提到了这一点。

图8-70 摘自《J2EE核心模式》,Alur D. 等 著,牛志奇 译,英文原版出版于2001年

******

《J2EE核心模式》(第2版)已不用“值对象”,改用“传输对象(Transfer Object)”。

******

“值对象”目前主要用在DDD话语体系中。您可以观察近年出版的书籍,里面提到“值对象”的地方,很可能在这个词的周围还会提到“实体”“领域驱动设计”“DDD”等。

也许有人会说“值对象”和“不可变对象”不是一回事。你看,名字都不一样嘛,说明侧重点不同。“不可变对象”可以有标识,Eric Evans甚至还说“值对象”可以改变属性值。

其实,相对于“值对象”的命名,“不可变对象”的命名更本质。我们更在意的是属性值是否可变,而不是有没有标识、如何判断相等。在8.2.8.4会进一步讲述。

8.2.8.3 回顾历史,警惕伪创新

翻出历史来,意思是说“值对象”的概念不是Eric Evans发明的,也不是Eric Evans给起的名字。

这一点并非所有人都了解,如图8-71中的表述。

图8-71 摘自《解构领域驱动设计》,张逸 著,2021

******

顺便再吐槽一下,图8-71中“面向对象设计的基本原则,如信息专家模式”的表达是不严谨的,原则和模式不是一个级别的东西。

以面向对象来说,被归纳的“原则”的数量最多也就两位数,最出名的是所谓的SOLID,而“模式”的数量就多了去了。

GoF(1995)有23个模式;Kent Beck的Smalltalk Best Practice Patterns(1997)有92个模式(就是格式不太规范);POSA(面向模式的软件架构)系列从1996年到2007年出了5本,作者说有114个模式;PLoPD(程序设计模式语言)系列从1995年到2006年也出了5本,其中收录的模式数目查不到,我也没得数,但PLoPD每一本的页数是对应POSA的近两倍;Fowler的《企业应用架构模式》有51个模式(“值对象”就是其中一个)……现在每年依然有新的模式书出版,去除那些变着花样复刻GoF赚流量的垃圾书后,还是有一些书贡献了新模式。

还有,PLoP年年开会,今年是第28届了。

******

如果不了解历史,就有可能会被某些伪创新的宣传所蒙骗。永动机、水变油的伪创新过一段时间就会改头换面出来收智商税,原因就是我们对历史教训的记忆太容易消失了。

如果人们得知一个东西曾经存在过,那么当这个东西再次被拿出来宣传时,人们会对宣传保持较多的理性,“这东西如果真的这么厉害,那之前怎么……”,宣传的人也会收敛,不至于那么夸张。

伪创新会选择换个名字,称自己是“全新的”、“革命性的”,给人一种从未有过的、从天而降的感觉。因为是“全新的”,所以再怎么夸大宣传,人们也还是会给一个机会,毕竟是“新”的,没准人家真的有这么牛呢。

正如前文(8.2.6.2)所说,伪创新还会有意割裂和已有知识的联系——我是“新”的,不受已有知识的约束。这样,在受到他人批评时,就可以巧妙辩解“你说的鹿和我说的鹿不一样”。

伪创新的宣传中往往会带有“艺术”、“禅”、“道”等字眼,有意无意地朝宗教、艺术、玄学方向引导——这些东西信仰是主要的,道理是次要的。

以上内容并非说“值对象”是伪创新,而是说要警惕过分的宣传——同样适用于UML及其他。

8.2.8.4 本书关于“值对象”的观点

(待续)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 UMLChina 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档