DDD:用 “四色原型” 进行 “聚合设计”
四色原型
在企业应用的上下文中,四色原型是领域模型的一种原型,原型的意思是指领域中的任何模型及其关系都可以抽象为“四色原型”。
四色原型可以用这句话进行描述:某个人(Party)的角色(PartyRole)在某个地点(Place)的角色(PlaceRole)用某个东西(Thing)的角色(ThingRole)做了某件事情(MomentInterval)。
图片示意
名词解释
- PartPlaceThing:简称PPT,用淡绿色表示,常见的PPT有:部门、岗位、人员、地点、物品等。
- Description:简称Des,用淡蓝色表示,主要用来对PPT进行描述,常见的Des有:部门类型、岗位层级、人员类型、地点区域、物品分类等。
- Role:用淡黄色表示,主要表示PPT在某个场景下扮演的角色,常见的角色有:财务类部门、管理类岗位、请假者、销售点、产品等。
- MomentInterval:简称MI,用淡红色表示,主要表示在一刻或一段时间内发生的一件事情,常见的MI有:部门移动、岗位移动、员工离职、产品销售等。
- MomentInteval:简称MIDetail,用淡红色表示,主要表示MI的明细,常见的MIDetail有销售明细、入库明细、出库明细等。
出差管理示例
根据四色原型进行聚合设计(四步曲)
第一步:识别模型
根据四色原型很容易识别出领域模型(见上图)。
第二步:识别关联
根据四色原型同样很容易识别出领域模型之间的关系(见上图)。
第三步:划分聚合
- MI和MIDetail是一个聚合,MI是聚合根。
- PPT是一个聚合,PPT是一个聚合根。如果Des只“描述”PPT,那么这个Des会作为一个值对象隶属于属于PPT所在的聚合。
- Des是一个聚合,Des是一个聚合根。前提你想“跟踪”Des关联的PPT。
- Role不属于聚合,Role是一个带状态的领域服务,Role采用装饰器模式装饰PPT。
划分结果
第四步:精简关联
- 去掉MI和Role之间的关联,改为仓储查询,根据需要让MI关联一个Role的快照(发生时刻Role的状态)。将关联改为仓储查询的理由是这样更加灵活,一个请假人有1W个请假单,没有必要设置这样的关联。让MI关联一个Role的快照的理由是MI很多情况要记录下发生时刻Role的状态,如:出差单要记录下发生时刻请假人的组织信息,而不是现在的组织信息。
- PPT和DES之间的关联可以根据自己的爱好酌情保留,我喜欢用仓储查询,这样更灵活。
- 去掉PPT和Role之间的关联,改为仓储查询。比如:用仓储查出PPT,然后将这个PPT实例注入到Role中。
精简结果
为什么销售单和销售单明细是一个聚合,而文章和评论不是一个聚合呢?
因为销售单是MI,销售单明细是MIDetail,因此他们是一个聚合;而文章是MI,评论也是MI,所以他们不是一个聚合。
备注
四色原型可以帮助我们做聚合设计,我相当于把聚合设计问题踢给四色原型分析了,本文还没有详细讨论如何识别领域中的四色原型。当然了,聚合设计还有其他规律可循,后面慢慢讨论吧。时间有限,后面我会用HappyFramework写个Demo。
今天还没有过多的谈“职责分配”的问题,四色原型可以完美的补充DDD关于职责分配的各种模式,我会放到下一个主题讨论。
转载于:https://www.cnblogs.com/happyframework/archive/2013/04/26/3043515.html
DDD:用 “四色原型” 进行 “聚合设计”相关推荐
- DDD:四色原型、DDD、DCI之间的关系
PPT对应某个聚合. Des对应某个聚合或其它聚合内的实体或值对象. MI对应某个聚合. Role对应PPT(Data)在某个上下文(Context)执行某些交互(Interactive)的代理或装饰 ...
- DDD领域驱动设计---战略设计(包括四色原型建模)
相当于策略设计,从宏观角度着眼于领域的分析设计,属于系统分析阶段,注重如何从有界上下文中寻找领域模型,战略模式由有界上下文.无所不在的语言和上下文映射组成. 在战略设计前首先要了解下领域知 ...
- 四色原型的学习心得分享
在讨论四色原型之前,我想先狗胆讨论下什么是我所认识的"世界"? 我觉得世界由物质及其相互作用组成."物质"是不以人的意识为转移的客观存在:而"相互作用 ...
- 四色原型(转自banq大师)
我们搞技术的有很多误区,比如经常陷入纯技术钻牛角尖的争辩,而全然不顾业务场景,技术活做太多,经验一箩筐,但是有时会疑惑,这些经验是否适合其他自己没有经历过的新系统呢?我们在技术设计路线上走得太久,容易 ...
- 四色原型图进行业务建模的思考
一般的需求,我们利用用例图就可以表达清楚了,如果再复杂些,我们可能还得再配合序列图.状态图等加于说明.但是,在非常复杂的业务逻辑中,怎么样才能找出它们的联系?而且还能更好地拥抱OO(面向对象),OO的 ...
- 领域驱动设计(DDD)实践之路(三):如何设计聚合
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/oAD25H0UKH4zujxFDRXu9Q 作者:wenbo zhang [领域驱动设计实践 ...
- 四色建模法 模型分析和设计
四色建模法共有四个概念: 一.时标性对象 - 时刻时段原型 1.业务在时间轴上发生的需要跟踪的事件留下的痕迹 概念为:跟踪实体对方发生的所有需要跟踪的事项 通常生命周期比较短.如:订单等. 2.图例用 ...
- 【领域驱动设计】四色建模法
一.参考资料 实例! 领域驱动四色建模法分析需求 - 知乎 运用四色建模法进行领域分析 - 简书 代码精进之路:从码农到工匠-张建飞-微信读书
- ddd 企业应用架构模式_灵魂拷问:用了DDD分包就是落地了领域驱动设计吗?谈谈DDD本质...
学习DDD的时候,作为开发,我们更关心它在技术层面的东西,尤其体现在DDD的分包方式.编码技巧等方面. 自然的,我们不禁发问,用了DDD的分包,就是实践落地了DDD了么? 不卖关子,直接说答案,并不是 ...
最新文章
- 开发你的第一个 Android 应用
- VC/MFC Tips
- 【深度学习入门到精通系列】关于梯度下降和反向传播的探索
- 【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )
- Document Builder: 如何将structure level的field加入到word document的table中
- 【bzoj1572】[Usaco2009 Open]工作安排Job 贪心+堆
- java内部类的作用_java 内部类的好处和缺点(上)
- Silverlight toolkit 中ListPicker控件的用法【转】
- elasticsearch同义词配置elasticsearch-analysis-dynamic-synonym
- Atitit zip解压文件 java use apache ant.jar C:\0wkspc\hislog\src\main\java\com\attilax\compress\ZipUt
- html5 职工入职后台管理系统_丽水微信社群裂变营销管理系统公司
- C#项目获取当前时间的农历时间
- 5G的主要业务场景:eMBB、URLLC、mMTC
- 群消息已读回执(这个屌),究竟是推还是拉?
- WiFi共享精灵的文件共享
- 推荐几个好玩的网页和软件
- 树莓派3B+控制LCD1602显示英文或数字
- systemverilog学习 semaphore 和 mailbox
- CCNA培训结束后的感想
- 焊XT60需要注意电烙铁加热时间长了容易塑料融化里面的头变歪,导致无法插入其他头里面。
热门文章
- 一些不是很常用的SQL语句
- linux7虚拟机修改主机名,centos 7 更改网卡名,主机名,虚拟机添加网卡
- vaspkit使用_VASPKIT校正气体分子自由能
- 什么是拉电流和灌电流?
- Python-opencv实现视频与图片的相互转换
- centos6.8下安装pythondjango
- #x开头的是什么编码呢。浏览器可以解释它。如中国等同与中文中国?
- CSS3的边框(border)属性-radius
- [转]图解APP的商业模式
- 【总结】IE6,IE7,IE8,Firefox兼容的css hack 补充!