## DDD的思考 #### ...!@$!%^@!#@!....???@@
### 领域驱动设计 * Domain-Driven Design
* Domain: 领域,特指某种具体的业务范围,如: * 物流业务 * 销售业务 * Driven: 从业务角度出发,驱动后续的设计、开发 * Design: 设计、开发模式
### 一种从需求到开发的方法论 比如: * [5W原则](https://baike.baidu.com/item/5W%E5%8E%9F%E5%88%99) * [SMART原则?](https://baike.baidu.com/item/SMART%E5%8E%9F%E5%88%99)
### 需求分析阶段
* 通用语言 * 限界上下文
* 通用语言 * **“推动”**定义领域内的通用语言: 名词、 动词 …., * 容易误解成: * DDD提供现成的通用语言(java, python, 中文, 英文)
* 限界上下文❓ 
* 限界上下文(Bounded Context) * Bounded:边界 * Context: 上下文

### [分析方法一](https://www.cnblogs.com/netfocus/p/5548025.html) * 领域概念: * 梳理出领域内我们关注的概念、概念的关系,并统一交流词汇,形成统一语言; * 业务规则: * 梳理出领域内我们关注的各种业务规则,DDD中叫不变性(invariants),比如唯一性规则,余额不能小于零等; * 业务场景: * 梳理出领域内的核心业务场景,比如电商平台中的加入购物车、提交订单、发起付款等核心业务场景; * 业务流程: * 梳理出领域内的关键业务流程,比如订单处理流程,退款流程等;
#### [四色原型分析法](https://www.cnblogs.com/netfocus/archive/2011/03/05/1971899.html) <img src="/images/it/ddd/fourcolor.png" width="20%"> <img src="/images/it/ddd/fourcolor1.png" width="20%"> <br> <font size=6> 一个什么什么样的人(或组织或物品)以某种角色在某个时刻或某段时间内参与某个活动。 * “什么什么样的”就是:description archetype * “人或组织或物品”就是:party, place, or thing archetype * “角色”就是:role archetype * ”某个时刻或某段时间内的某个活动”就是:moment-interval archetype </font>
#### [DDD战略设计相关核心概念的理解](https://www.cnblogs.com/netfocus/p/DDD.html) <img src="/images/it/ddd/ddd_names.png" width="50%"><br>
#### [普通电商系统的商品中心的领域模型图](https://www.cnblogs.com/netfocus/p/5548025.html) <img src="/images/it/ddd/product-model.bmp" width="50%"/><br>
#### [事件风暴](https://juejin.im/post/5dde595a5188256ea364efbf) <img src="/images/it/ddd/event_stroming1.webp" width="30%"/><br> <font size=9> * 寻找领域事件 * 宠物主人:疫苗已注射,猫粮已饲喂 * 宠物医生:病情已确诊,药方已开治 * 寻找命令和角色 * 寻找领域模型和聚合 * 划分子域和限界上下文 </font> [事件风暴:一种不同的建模方法](https://zhuanlan.zhihu.com/p/55617893)
### 设计分析阶段
* 实体,值对象,聚合/聚合根 * 一个Bounded Context可能包含多个聚合 * 聚合设计的原则
#### DDD的分层结构 <img src="/images/it/ddd/ddd_idau.png" width="80%"/><br>
#### DDD分层对比[MVC分层](https://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html) <img src="/images/it/ddd/ddd_vs_mvc.png" width="80%"/><br> User interface <—> View Application, Domain <—> Control Domain, Infrastructure <—> Model
#### [领域模型4种分类](https://www.oschina.net/question/54100_10400) * 失血模型: - 纯数据POJO,业务逻辑完全与entity分离 - 领域模型只有数据 * 贫血模型: - service –> dao –> entity - service厚重:业务逻辑(含持续化逻辑),事务封装
#### [领域模型4种分类](https://www.oschina.net/question/54100_10400) * 充血模型: - service –> entity -> dao - service轻薄:少量业务逻辑,事务封装 * 胀血模型: - entity -> dao - 取消service层 - entity: 业务逻辑,事务封装 有点晕😑,该选哪个❓ [本页概念有点混乱、误导💢]
#### 业务逻辑(BUSINESS LOGIC) * 应用逻辑(application logic) * 领域逻辑 (domain logic) * 充血模型的思路[👍] - 把比较稳定的领域逻辑分离出来 * 贫血模型的问题 - 领域逻辑泄露到应用逻辑(事务脚本)里了 * 涨血模型的问题 - 存储逻辑(应用逻辑)混到领域逻辑里了
#### [DDD的战术篇: APPLICATION、 DOMAIN、 INFRASTRUCTURE SERVICE](https://blog.csdn.net/abchywabc/article/details/79362975) <img src="/images/it/ddd/clean_architecture.jpeg" width="50%"/><br>
#### [强内聚、松耦合](https://yq.aliyun.com/articles/343947) * 松耦合:关注依赖,接口清晰、稳定 * 强内聚:自扫门前雪,各自修行
#### 参考资料 * [DDD领域驱动设计基本理论知识总结](https://www.cnblogs.com/netfocus/archive/2011/10/10/2204949.html) * [DDD不是开发人员的工具,而是系统设计的工具](https://www.jdon.com/53538) * [案例1:闲鱼详情页DDD应用](https://my.oschina.net/u/1464083/blog/3011360) * [DDD DCI和领域事件](https://www.jdon.com/jdonframework/dci.html) * [Domain Driven Design in dynamic languages](https://github.com/valignatev/ddd-dynamic) * [开源项目:Jdon Framework](https://www.jdon.com/jdonframework/)