节选自我写的《软件方法(下)》: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在《企业应用架构模式》中讲述“值对象”模式时,提到了这一点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cz7RESUN-1633656738640)(https://mmbiz.qpic.cn/sz_mmbiz_png/GmehiaiamM62pJ9jYoFYZpVaUjXQBAfut3iaHGLDzGIiaGb246hbicfQEjzuPqoAIbQ6GMjbhxiaJKCFic84skdMibKAkQ/640?wx_fmt=png)]

图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中的表述。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oYKjrEs7-1633656738644)(https://mmbiz.qpic.cn/sz_mmbiz_png/GmehiaiamM62pJ9jYoFYZpVaUjXQBAfut3I57dX2cwu3on0UjENtH75GStSNETIDDo5yujYm2dUK6uXgoykFkJaw/640?wx_fmt=png)]

图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 本书关于“值对象”的观点

(待续)

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

  1. 如何运用DDD(一):值对象

    作为领域驱动设计战术模式中最为核心的一个部分--值对象,一直是被大多数愿意尝试或者正在使用DDD的开发者提及最多的概念之一.但是在学习过程中,大家会因为受到传统开发模式的影响,往往很难去运用值对象这一 ...

  2. DDD如何区分实体和值对象

    前言 实体和值对象的区分是领域驱动设计中的老大难问题,建模过程中是必然会遇到的问题,我们在落地领域驱动设计过程中就遭遇了这类问题,下面介绍下我们落地过程中的经验. 实体 实体是指在你这个领域存在的一个 ...

  3. DDD单根 聚合根 实体 值对象

    前言 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称E ...

  4. DDD之3实体和值对象

    图中是一个别墅的模型,代表实体,可以真实的看得到.那么在DDD设计方法论中,实体和值对象是什么呢? 背景 实体和值对象是领域模型中的领域对象,是组成领域模型的基础单元,一起实现实体最基本的核心领域逻辑 ...

  5. DDD之实体与值对象

    传统的系统架构设计阶段,通常我们会将关注点放在数据上面,而不是领域上面.这种设计风格在软件开发中,使数据库占据了主导地位,我们总是有限考虑数据的属性(对应数据库的列)和关联关系(外键关联),而不是富有 ...

  6. 二值图像分析:OpenCV中的二值化阈值操作

    二值图像分析:OpenCV中的二值化阈值操作 1.二值图像的定义 2.OpenCV中的基本阈值操作 3.OTSU二值寻找算法 3.1 OTSU二值寻找算法介绍 3.2 OTSU二值寻找算法分析 3.2 ...

  7. 二值神经网络(Binary Neural Networks)最新综述

    作者|秦浩桐.龚睿昊.张祥国 单位|北京航空航天大学 研究方向|网络量化压缩 本文介绍了来自北京航空航天大学刘祥龙副教授研究团队的最新综述文章 Binary Neural Networks: A Su ...

  8. cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线

    点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 问题 前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像: 怎么得到白色Blob中心线,他希望的 ...

  9. 神经网络损失函数特别大_二值神经网络(Binary Neural Networks)最新综述

    作者|秦浩桐.龚睿昊.张祥国 单位|北京航空航天大学 研究方向|网络量化压缩 本文介绍了来自北京航空航天大学刘祥龙副教授研究团队的最新综述文章 Binary Neural Networks: A Su ...

最新文章

  1. Git011--分支管理策略
  2. java多线程-阻塞队列BlockingQueue
  3. 访问一个HTTPS的网站的大致流程
  4. JQuery中html、append、appendTo、after、insertAfter系列方法
  5. nowcoder20C 位数差
  6. js 栈(进制转换)
  7. 括号配对问题http://acm.nyist.net/JudgeOnline/problem.php?pid=2
  8. Jar运行的几个方法
  9. 百度图神经网络学习——day04:图神经网络算法(二)
  10. matlab脑电打码,matlab 脑电信号特征提取程序
  11. Win7连接蓝牙4.0鼠标
  12. 概率论实验 04 - | 基于Matlab的匹配滤波器
  13. udhcpc 移植和使用
  14. 传感器检测技术——概论
  15. win7系统启动到一半停止_win7系统装到一半电脑死机怎么办
  16. 你写论文时发现了哪些神网站?
  17. Cloud Rush—聚是一团火
  18. 计算两条线或多边形的交点(LineString | MultiLineString | Polygon )
  19. 广义相对论和量子力学在哪些地方发生了严重的冲突(转)
  20. 关于如何发挥最好的学习状态的思考暨《自控力》一书读后感

热门文章

  1. wps的计算机在哪里设置密码,怎么在电脑版WPS中修改密码?
  2. 力天创见客流分析功能需求
  3. 数据分析 时间序列分析 概述
  4. Couldn’t load custom C++ ops.
  5. OrientDB入门
  6. mysql忘记初始密码与更改密码
  7. 自定义圆形进度条 自定义倒计时进度条
  8. 圣诞节用代码写一颗圣诞树【html5写的3D逼真圣诞树外加python无延迟的豪华圣诞树】
  9. Java黑皮书课后题第2章:2.4(将磅转换为千克)编写程序,将磅数转换为千克数。程序提示用户输入磅数,然后转换为千克并显示结果。1磅等于0.454千克
  10. java 雷达图_Android雷达图(蜘蛛网图),自定义view之雷达图,正五边雷达图,分数图...