作者回复: 你太有才了。理解的很透彻。
作者回复: 专业,非常同意你的观点。
作者回复: 会有的,包括事件风暴、从中台的领域建模、到微服务设计都会有案例的,最后会有一个典型案例把这些知识串起来。不过这些案例主要是设计为主,会设计出不同分层的类、服务等,不到具体的代码实现。
作者回复: 理解很透彻。
作者回复: 没错,理解正确。
但是实体在不同的层有不同的形态,如PO,DO,DTO等。实体不一定与数据库表一一对应。
作者回复: 抓住几个关键点就不那么难了。比如:实体可修改,值对象不可修改,只可以整体替换。实体是实实在在的业务对象,值对象只是对对象的描述。值对象依附以实体,实体没了值对象也就没了。
作者回复: 哈哈,出发点不一样,所以观点会有差异。
作者回复: 按照你的描述,我理解是有人员和组织两个聚合。
人员和组织信息各自维护。但组织实体中会有一个字段保存部门主管信息,对吧?
在人员和组织聚合中,人员是实体,组织也是实体。
组织实体的部门主管信息来源于人员聚合,对吧?
这样的话,组织聚合中的组织实体的部门主管字段应该被设计为值对象。它可以被人员聚合中的其它人员整体替换。
不知道理解的对不对?
作者回复: 值对象是依附于实体的,是实体属性的一部分。它是实体的若干个属性的集合,为了概念完整性因此将具有一定业务含义的多个属性,组成一个属性集。
实体的业务功能非常丰富,是业务对象的基本单元,值对象生命周期依赖于实体的,实体没有了,值对象也就没有了。
作者回复: 实体和值对象本质上都是属性的集合,是否设计为值对象要根据具体场景,如果这个属性集合的数据来源于其它的聚合,在本聚合只让整体修改,就可以设计为值对象。比如送货地址来源于客户中心,在订单中的送货地址只能整体从客户中心中获取并修改。那送货地址就是值对象。
关于实体的理解,建议把他们放在不同的层去理解,领域层的实体是运行的概念,而存储的实体是持久化对象的概念,它们有关联,但并不一定是一对一的关系。多个领域实体可以跟一个持久化实体对象映射。所以在领域层和基础层之间会有DO和PO的转换。
作者回复: 谈不上谁重要谁不重要哈。他们属于领域模型的不同角色。
作者回复: 如果这个值对象不对外提供统计和复杂查询的话,可以将它设计为Json串的方式,这样就具有较高的灵活性。
其实很多值对象很多时候体现了数据的冗余,它在其他聚合有对应的实体,可以新增和修改,这些数据会被其它聚合使用,但是在这些聚合不可修改,只能被实体整体引用。在领域建模的时候需要关注这类对象或值对象的设计。
作者回复: 枚举类就是一个值对象。它一次只有一个值,而且是整体修改。
作者回复: 有点类似。