ddd的战术篇: domain object之一
首先ddd的战术这个讲法是不太好的。ddd书中说的是战术性建模(tactical modeling)。其意思是在战术层面的建模,那当然有战略层面的建模啦。以后会专门讲。
domain object是ddd区别于其他建模/设计方法的一个部分。他定义了概念帮助我们去建立model。如果没有接触过ddd,一开始会觉得有点莫名其妙,为什么要定这种规矩,这种规则?
Entity,value object, Aggregate
entity
entity是一类可识别的可追踪的对象。
说简单了,它必须有identifier,再简单点id(可识别,可被追踪)。
另外它是有可变对象,mutable。但即使状态变化了之后,entity还是原来的entity。(好绕口)
现实一点的例子。一个人叫“王帝”,他改名交了“王皇”,名字虽然变了,但还是同一人。当然现实世界里我们很难去寻找一个identifier(识别码),如何定义一个不变的identifier会是个哲学问题,但编程时就简单多了,直接搞个id就就行。
value object
与entity对应的一个概念叫value object
它是一个值,是不可变的,immutable。没有identifier,也不需要被追踪!
比如java中的字符串和value object的感念很相近。字符串生成之后就是不可变的。而且也没有什么id来识别它。
什么时候使用entity,什么时候使用value object
具体问题具体分析
比如我们需要对地址这个东西建模。如果我们关心的是地址的履历之类的信息,过去30年前这个地址可能叫霞飞路,现在可能叫淮海路,而且需求是我们必须知道霞飞路,淮海路指的是一个地址。那很可能我们需要的是entity。这个entity可能还要开发change()的方法来改变路名。
但如果我们做的是一个送货软件。地址只是表示一个目的地而已,霞飞路和淮海路在我看来就是不同的,那就说明,你不必对地址本身的变化进行追踪(送货地址变了,对你很重要。但霞飞路改名成淮海路对你不重要。)。那value object就够了。
你可能觉得何必这么费事搞个表示地址的value object, 搞个字符串不就行了?
首先这不一定是一个关于ddd的问题。当然很多情况下,我们可以的确用java的基础类来建模的。但从面向对象的封装角度来说,我们可以考虑创造专门的类。
如果我们创建value object,它是可以拥有行为的。比如Address是一个value object。它可以拥有getCountry(), getProvince(), getCity()等方法。
Aggregate
Aggregate,集合。是有多个(也可以是一个)entity,value object组成的对象。
Aggregate可以看作一个树状结构的东西。根是一个entity。Aggregate的一个作用是保持domain object的关联性的正确。
Aggregate和Repository
Repository
Repository是用来存放一个aggregate的object。(是不是听起来像DAO?)
Repository的存在,让我们感觉我们存放在它里面的aggregate就好像on memory一样,不必去关心它具体是和rdb对接还是其他的形式。
请注意的是Repository对应的是aggregate而不是entity!虽然我们在实际偏码时不会去专门写aggregate的类,有关具体实现,之以后的文章会写。简单地讲根entity就可以代表aggregate。
domain object的做法与active record的区别
active record pattern也是很常见的一种模式。大概是建立于数据表的一一映射的类,然后有各自的DAO类。乍看起来和domain object的做法是一样的。
1. 映射关系
active record一般以一个类对应一个数据表为前提
repository则没有这个限制。当一个aggregate需要对应多个数据表时,那repository自然就对应多个数据表。repository隐藏了数据层的物理实现。
这里想多提一点。domain model的建立,称作理论设计比较合适。它尽量不关心物理的实现,只求对domain的正确反映。
而data model的设计,可以称作物理实现。是以数据永久化为目的。与ddd相关联,自然就是如何将domain object永久化。
2. domain object主张充血模式
active record常常会导致制造大量的于数据表对应的类,这些类一般不会有行为,而描述业务逻辑的职责就会到很多service类上。
domain object则希望类有自己的行为,而不是开放好多setter,让外部的类来控制自己的状态变化。
总结
讲了好多理论,大致介绍了domain object。
entity: stateful, mutable.
value object: immutable
aggregate: entity和value object的集合
repository: stateless,储存aggregate
之后的文章准备写一些例子来更好地说明这些概念。
ddd的战术篇: domain object之一相关推荐
- 为什么把持久化放到Domain Object是不OO的.
争论会一直在人群中存在,它消失就代表人类文明也灭亡了... 很久以前,在园子曾经出现过关于ORM的争论.而就是在那段时期,我对OO及ORM的概念在硝烟弥漫的文字里逐步建立起来.最近对于是不是该把持久化 ...
- 【DDD设计】 Domain model VS DAL Entity VS Presentation DTO
Tier 各层中的实体 实用派还是学术派,在代码设计中经常各层实体关系有字段重叠和业务重叠,这并不冲突,我们需要根据自己项目的特色来决定,好的设计模式需要和具体的业务模式结合才能发挥1+1 >= ...
- 【转】阿里技术专家详解 DDD 系列 第一讲- Domain Primitive
导读 对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战,无论是 94 年 GoF 的 Design Patterns , 99 年的 Martin Fowler 的 Refactor ...
- 阿里技术专家详解 DDD 系列- Domain Primitive
导读:对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战,无论是 94 年 GoF 的 Design Patterns , 99 年的 Martin Fowler 的 Refactor ...
- Domain Driven Design and Development In Practice--转载
原文地址:http://www.infoq.com/articles/ddd-in-practice Background Domain Driven Design (DDD) is about ma ...
- DDD as Code:如何用代码诠释领域驱动设计?
简介: 相较于常规的MVC架构,DDD更抽象.更难以理解,各个开发者对DDD的解释也不尽相同.那么哪种设计方式才更好?在学习时如何知道哪种DDD更正统,没有被别人带歪?本文尝试使用"DDD ...
- DDD领域模型、贫血模型、充血模型概念总结
DDD领域模型 领域模型是对领域内的概念类或现实世界中对象的可视化表示.又称概念模型.领域对象模型.分析对象模型.它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系. 业务 ...
- DDD(领域驱动设计)系列之一-DomainPrimitive
导读:对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战,无论是 94 年 GoF 的 Design Patterns , 99 年的 Martin Fowler 的 Refactor ...
- DCI架构是如何解决DDD战术建模缺点的?
摘要:将DCI架构总结成一句话就是:领域对象(Object)在不同的场景(Context)中扮演(Cast)不同的角色(Role),角色之间通过交互(Interactive)来完成具体的业务逻辑. 本 ...
最新文章
- DOM相关方法,属性整理
- mysql乐观锁总结和实践--转
- 【Java虚拟机的垃圾收集算法】
- python字符串定义符_python入门——定义字符串
- 7-3 对整型数据排序 (15 分)
- mongodb常用语句(集合操作)
- mysql爆表_十种Mysql报错注入
- 反射(3)反射应用:一个插件项目
- PHP分类输出代码,PHP无限分类代码,支持数组格式化、直接输出菜单两种方式_php技巧...
- FlightGear属性树
- deepTools对ChIP-seq数据可视化
- Android 如何检查麦克风是否被任何后台应用程序使用?
- OpenGL 头文件,库文件
- 陈强教授《机器学习及R应用》课程 第十五章作业
- CDN中加速域名和源站地址和回源HOST是什么,应该怎么填
- PHP连接操作sqlserver
- google skia
- 互联网早报:腾讯推出“微小号”,用虚拟手机号拨打电话收发短信
- slb健康检查方式_负载均衡(SLB)
- 安徽大学大学生创新项目报销流程
热门文章
- rocm 指定版本安装
- python怎么用拼音-Python利用拼音库PyPinyin获取汉字的拼音
- Java springboot Object转换List String转List 数组转List
- ubuntu使用OpenSSL生成数字证书常见错误修改
- R星服务器显示云备份失败,gta5同步云存档出错|【gta5云存档同步失败】gta5云端存档同步发生错误...
- 东南亚成云服务掘金地,为何却跑不出一家本土云巨头?
- 京东架构专家分享京东架构之路(你和高薪架构师差的不是年龄)
- 蓝牙测试指标有哪些?
- 养成行为习惯的26种方法(3-4)
- 3dmax雨伞模型应该如何建模