领域模型-实体对象和值对象
来源:互联网 发布:2016年淘宝类目销售额 编辑:程序博客网 时间:2024/06/05 23:43
对于实体Entity和值对象Value Object是领域驱动设计里面两个重要的模型对象。
首先对于实体Entity,实体核心是用唯一的标识符来定义,而不是通过属性来定义。即即使属性完全相同也可能是两个不同的对象。同时实体本身有状态的,实体又演进的生命周期,实体本身会体现出相关的业务行为,业务行为会实体属性或状态造成影响和改变。
真正的现实世界,每个事物都一定会有唯一的标识,关键点是我们实际的业务场景和需求是否需要管理到唯一标识。书里面举了一个例子,当我们发放的门票上有座位号的时候,座位需要作为独立的实体,座位号是唯一的标识。而当先到先座模式下,我们只关心剩余座位数,那么座位号并不是唯一标识。这跟我们的业务需求有关。
一个对象不由属性来定义,那么看人这个对象,身份证号是属性,其实也是对于人的唯一标识。不考虑本身身份证号的位数升级,一个身份证号会跟随你一辈子。但是对于人我们一般仍然会作为实体Entity来看待,因为人有状态,有对象演进的生命周期,会主动产生各种行为。
对于企业内信息系统,很多时候我们把员工工卡号作为唯一标识来使用,但是要意识到工卡号只是人员的一个属性。虽然工卡号本身不会出现两个重复的,但是该属性仍然可能演变,如果将工卡号作为唯一标识和ID,那么在该属性变化时候所有其余关联对象都将受到影响。从这个层面来看,一个唯一的内码ID才是可信的唯一标识。
而对于值对象Value Object,它用于描述领域的某个方面本身没有概念标识的对象,值对象被实例化后只是提供值或叫设计元素,我们只关心这些设计元素是什么?而不关心这些设计元素是谁。书里面谈到颜色,数字是常见的值对象。这种对象无状态,本身不产生行为,不存在生命周期演进。
是否为值对象跟实际的业务场景仍然关系密切。书里面又举了地址的例子,当地址是值对象的时候,地址本身无状态,可以被多个实际有状态的实体使用,地址不存在太多的生命周期演进场景下地址为值对象。而对于本身行政区域管理软件中,地址本身存在状态,存在根据行政区域规划变化而演进的过程,因此地址为实体。
如果从值对象本身无状态,不可变,并且不分配具体的标识层面来看。那么值对象可以仅仅理解为实际的Entity对象的一个属性结合而已。该值对象附属在一个实际的实体对象上面。值对象本身不存在一个独立的生命周期,也一般不会产生独立的行为。
值对象往往可能是多个属性的聚合,本身无唯一标识,多个属性最终形成的一个结果值,而这个结果值往往又依附在一个实际的实体Entity上面。那么如果从这个概念来说,值对象往往不会单独进行持久化,或形成数据库设计的一张数据表。另外一种情况,对于简单的数据字典类对象,是否考虑作为值对象,这种对象需要持久化,如纳税属性,物料类型,它们设计到数据字典中取值,这个数据字典无状态,无自己的生命周期,是可以作为值对象来处理的。
- 领域模型-实体对象和值对象
- 领域模型-谈实体对象和值对象
- 对象模型和领域模型
- 领域模型和领域对象的概念
- 领域驱动设计之实体、值对象、领域服务
- 领域驱动设计整理——实体和值对象设计
- 从领域、对象、角色、职责、对象交互、场景等方面去分析和设计领域模型
- 关于领域驱动设计的实体对象与值对象的区别考虑
- 实体与值对象
- session 缓存和实体对象
- 数据模型和模型对象
- 聚合根、实体、值对象
- 设计领域,数据表和对象的关系。
- 设计领域,数据表和对象的关系。
- [php]延迟加载和领域对象工厂
- 从项目始末谈面向对象——领域模型
- Play Framework之MVC之领域对象-模型
- Play Framework之MVC之领域对象-模型
- python下的Memcache操作
- angularjs的自定义指令及其调用方式
- 《Flask Web开发》读书笔记(4)第4章Web表单(关键词:Web开发/Flask/表单/Web表单)
- G
- Mvp框架(完美实现P层剥离)+基类activity、fragment剥离 MVP demo
- 领域模型-实体对象和值对象
- 图片快速居中在div中
- JS获取短信验证码button的定时重新发送
- [Office] 段落缩进,首行缩进和首字下沉
- 4、链表
- React + MobX 入门及实例(一)
- 关于深度学习移动化的思考
- PHPStorm 2017激活
- Java基础的学习路线粗解