DDD 领域驱动设计-“臆想”中的实体和值对象
其他博文:
以下内容属于博主“臆想”,如有不当,请别当真。
![](http://images0.cnblogs.com/blog/435188/201411/231759223751444.jpg)
扯淡开始:
诺兰的最新电影《星际穿越》,最近非常的火热,每个人看完之后都会有不一样的感受,黑洞、虫洞、时间旅行、相对论、未来、人类、爱等等,这些都是这部电影的关键词,科学和艺术原来还可以这样子结合,真是令人叹服。网上有很多人去写一些东西进行分析探讨,也引发了全球“科学热”,这些都是好电影所蕴含的巨大影响力。人是很神奇的动物,每个人都有思考的能力,而且世界上没有完全相同的两个人,所以对待一种事物,每个人都有自己的看待角度,所以得出的结论也不尽相同。
宇宙只是界面,科技永远触摸不到世界的本原。
前段时间刚看完这部电影,然后无意间在园中,发现了一位园友写的一篇观后感,说实话,当时看过这篇博文之后只是有一个印象,并没有深入的去思考一些东西,上面的那段话就来自园友的这篇博文,现在仔细读起来确实很有深意,当然这只是对某一部分人来说,有的人看到也许会很不以为然。
和网上很多“观后感”所不同的是,大多数对于这部电影的探讨分析都是针对科学、宇宙、相对论、N 维空间、剧情等等,比如探讨电影中的黑洞、虫洞描述的是否正确?N 维空间具体是怎样的?“时间穿越”是否真的存在?电影剧情的衔接是否合理?。。。而这位园友的观后感非常”另类“,结合自己的理解,我大致再总结一下:
- 现实世界是我们与自然的“操作界面”。
- 虫洞是“操作界面”的一种“快捷方式”,黑洞相当于一个“目录夹”,存放各类文件。
- 科学家所总结的物理定律,可能只是指导如何玩宇宙这个“操作界面”的“初级手册”。
- 永恒不变的是人类的爱。
- 一切都是信息(anything is bit)。
小的时候,我经常在树下观察蚂蚁活动,看他们如何搬运食物,如何搭建巢穴等等,但他们却意识不到我的存在,而我却能观察他们的一举一动,或者他们也意识到我的存在了,只不过我不知道而已,又或者他们觉得我很另类,就像电影中墨菲所说“书架中的 Ghost”,Ghost 只不过是我们对一些不理解事物的统称,也许蚂蚁眼中的我也是“Ghost”吧,但细想一下,如果我们是蚂蚁呢?是不是也有像我一样观察蚂蚁的“我”呢?凡事都有相对性,只不过对一些事物我们不理解罢了。
把现实世界看作是与自然的“操作界面”,这一点内容我想也只有程序员能够想的到吧,但这一部分的想象确实有点太天马星空,不是一般人所能够理解的,但后面的两点内容对我触动很大,或者引发了与我的一些共鸣,上面也曾说过,人是很神奇的动物,因为人有思想,有思考的能力,有语言的能力等等,但最要的是人有情感,人类在不断的进行探索宇宙,但对于自身的探索却始终有限,就像电影中墨菲所说的“Ghost”,其实就是她未来的父亲,但不管过去与未来,父亲对女儿的爱是永恒不变的,这个话题就到这,说多了容易“烂”。
一切都是信息,就像我们玩的游戏,只不过是我们敲出的一行行代码,但表现出来却那么“真实”,引用园友博文中的一段话:
如果我做科幻片的编剧,我会让男主角历经千辛万苦,最后发现自己是一串 0 或 1 的数字。
反过来思考我们人类自身,从某一角度看待,我们何尝不是由“信息”组成的呢?比如生物学中的 DNA、基因、细胞等,这些都可以称之为“信息”,只不过表现方式不同罢了,不同的生物由不同的基因序列组成,但都属于基因,抽离出来它们本质上都是一样的,就像游戏中不同的人物,都是由 0 或 1 组成,只不过所不同的是,0 和 1 的数量和排序不同,但本质都是一样的,都是信息,世间万物抽离出来其实都是原子组成,但神奇的是组成出来的不同事物却完全不同,更为神奇的是人类本身,因为他可以思考他自身是由什么组成的。
由电影所引发的思考就不扯了,因为越扯越远,越扯越离谱。
回答标题的两个关键词:实体和值对象。
![](http://images0.cnblogs.com/blog/435188/201411/231803386255824.jpg)
曾在解道中看到有人这样描述实体和值对象之间的关系:
这个世界是事实和事物的集合。
这句话充分体现了实体对象和值对象的关系。我们所关心的事是事实,他是实体。而我们所关心的事实是由 0 到 N 个事物组成的集合。
如果觉得抽象的话,请用 DNA 来理解每个碱基( DNA 由“jian”基组成,具体哪个"jian"忘了)就是值对象,而拼凑成的 DNA 为实体,而且这个实体是唯一的,我们把他当作每一个人。
有一个大前提,就是当你关心到人的时候,这个世界上每一个人就是实体,而组成这个世界上所有的人的“jian”基就是值对象了。
那这么看来每一个人(事实)都由“jian”基(事物)所组成了。
其实这段描述信息量很大,简单说一下我所理解的,实体和值对象的区分是在“关注点”确定的情况下,也就是他所说的“大前提”,在这个大前提下,值对象其实就是信息,而实体就是由信息组成的一种事物,实体与实体之间的传递就是信息的传递,如果大前提变化了,所有的一切都是可以“逆向”的,也就是说实体可以变为值对象,值对象也可以变为实体,这种情况在现实生活中也很普遍,人口普查就是一个最好的示例。
对待一种事物,我所关心它,也就是说我必须先要区分它,然后接下来才能进行针对它的一些操作,这个“它”就是实体,那对于组成它,或者说描述它的一些信息,都可以看作是值对象,比如一个人的人名,我只需要知道这个值就可以了,但对于它所关联的对象,可以看作是实体,也可以看作是值对象,那具体怎么进行区分呢?主要看我关不关心“它”关联的对象,如果关心,那就是实体,如果不关心,那就是值对象。
在之前的一篇博文中,我常提到“双胞胎”的例子,我和我双胞胎哥哥出生在一所医院中,这个医院据说是“双胞胎的摇篮”,什么意思?因为出生在这个医院的有 80% 是双胞胎(有点扯),医院有个惯例,就是要对双胞胎的出生情况进行调查,比如要对双胞胎父母、以及出生地调查,用来计算出哪个地方出生的双胞胎最多,更具体的是,比如我父亲那个地方双胞胎的父亲或母亲比例,对于我和我双胞胎哥哥来说,医院就要根据我俩来调查我父母,在这个调查的前提下,其实我父母表现出来的就是值对象,因为医院只需要知道这对双胞胎父母的所在地就可以了,不需要知道这个父母具体是哪个?也就是说,在这个调查过程中,医院并不关心这个,对于他们来说,双胞胎的父母表现出来的只不过是一堆“信息”,但前提是这个“调查系统”,这是医院所关心的。对于我和我双胞胎哥俩来说,就不是这样了,对于我们的父母,我们所关心的就不仅仅是一堆“信息”,我们需要确定哪个是我们的父母?这个非常重要。
关心点的不同,就会造成信息表现方式的不同。
当某一实体确定的情况下,比如在某一场景中,把人设计为实体,然后再思考,与他关联的一些对象是设计为实体?还是设计为值对象?如果这个不能确定的话,就要想一想,在这个场景中,我关不关心它?如果关心的话,就要设计为实体,如果不关心,就要设计为值对象,对于同一关联对象,所关心的不同,最后设计的也会不同。
凡事无绝对,就扯到这!
微信公众号:你好架构
出处:http://www.cnblogs.com/xishuai/
公众号会不定时的分享有关架构的方方面面,包含并不局限于:Microservices(微服务)、Service Mesh(服务网格)、DDD/TDD、Spring Cloud、Dubbo、Service Fabric、Linkerd、Envoy、Istio、Conduit、Kubernetes、Docker、MacOS/Linux、Java、.NET Core/ASP.NET Core、Redis、RabbitMQ、MongoDB、GitLab、CI/CD(持续集成/持续部署)、DevOps等等。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。