可落地的DDD(5)-战术设计
摘要
本篇是DDD的战术篇,也就是关于领域事件、领域对象、聚合根、实体、值对象的讨论。也是DDD系列的完结篇。
这一部分在我们团队争论最多的,也有很多月经贴,比如对资源库的操作应该放在领域服务还是领域对象中。
聚合根应不应该暴露给外部,还是要转成DTO。这些问题我们讨论了大半年,最后大家基本达成了共识,在当前的业务规模下,
这些问题没那么重要,可东可西。不会对代码的质量有啥大的影响。关于DDD的实践,与团队的水平、业务复杂度息息相关。我们的经验并不一定就适用你们团队。我将战术篇的这么多的内容放在了一篇文章中,并且大部分都是引用之前的讨论、总结。
原因还是在于我内心深处并没有觉得战术篇的实践给我们团队带来多么大的改变。战略篇的是我认为更重要的。
DDD系列文章断断续续也有十来篇了,主要是总结我们团队落地过程遇到的问题和解决方案,算是DDD从学习到落地实践的一个完整的闭环链路,希望对你有所启发。当然这个过程受益最大的肯定是我本人。系统性的思考问题、总结问题、阐述问题是非常有助于提升个人思维能力,朋友们你们也可以尝试一下。
建模
DDD的出现,是大家对于事务性编程,面向数据库表编程的一个反思,明明软件设计是一个面向对象的设计,需要考虑对象之间的继承、多态、组合。
为什么到实际编码过程中成了过程性的编程,为什么对象只有属性没有方法了,也就是失血模型。
关于这几种编程的详细介绍可以参考Martin的《Patterns of Enterprise Application Architecture》Page110
所以我个人觉得,DDD的作用有两个,一个是面向业务的,帮助分析业务模型,进行业务建模。另外一个是面向解决域,即代码落地。
即使用一个规范能够反映对象之间的关系,即OO编程。
目前对DDD研究主要有以下类别
- 关于业务分析层面,如何进行概念层面的抽象和设计的方法论
- 关于服务划分、代码分层、职责定义的方法论
- DDD框架的讨论,比如jdon
第3点基本上没怎么广泛的讨论。我认为未来也不会出现什么牛逼的DDD框架能够流行起来。DDD是一种建模方法,是针对不同的业务领域的,
在不同的团队有不同的落地方案,是没办法靠一种框架来约束,来把一件不统一的事情来统一起来。就好比我们面向对象的设计针对问题域,抽象出来了
20多种设计模式。这些设计模式都是指导思想,你不能搞出一种框架,来约束大家使用某种设计模式就基于这种框架扩展,以此来达到代码统一或者降低
编程难度的目的。
前面的文章主要是比较大的方面,比较适合做整体业务分析。也就是第一个点。今天主要讨论第二点。
OO 编程
DDD的代码分层、职责定义本质上就是OO编程。OO的三大基本要素就是继承、多态、组合。这三个是深度抽象的结果。没法指导具体的编程。
于是我们有了设计模式,前辈们针对问题域,总结除了24种设计模式,这样遇到类似的问题时,我们可以使用对应的设计模式去解决问题。
而这些设计模式底层使用到还是继承、多态、组合。
那有了设计模式了,为什么还要DDD呢?为什么很少看到开源软件用DDD呢?
个人的理解DDD还是面向企业应用架构的,是在众多不确定的业务,系统中提炼出来的一套规范,这样必然是高度抽象的。而开源软件大多是领域比较确定的,比如数据库领域,中间件领域。解决这类问题的系统架构通常会更加复杂以及具有扩展性。
DDD的工程架构网上有很多,我在之前的文章也提到过,这里不再赘述,看下老马的这个,我觉得非常清晰的展现出来了职责分离
https://martinfowler.com/articles/microservice-testing/#conclusion-summary

我们重点看领域一层。
领域包含3点
领域服务
领域对象
领域事件
基础设施层
为各层提供资源服务(如数据库、缓存等),实现各层的解耦,降低外部资源变化对业务逻辑的影响。
总结
DDD中国
http://ddd-china.com/look-back-2017.html 视频去网站看美团的实践
https://tech.meituan.com/2017/12/22/ddd-in-practice.htmlcnblog博客园有很多.net DDD实践的文章
https://www.cnblogs.com/zhili/category/603514.html
http://www.cnblogs.com/daxnet/archive/2012/12/27/2836372.htmljdon上面的系列
https://www.jdon.com/ddd.html框架方面(个人觉得没啥用,参考看看)
rafy框架:http://zgynhqf.github.io/Rafy/articles/%E9%A2%86%E5%9F%9F%E5%AE%9E%E4%BD%93%E6%A1%86%E6%9E%B6.html
一些相关的书籍pdf上传到百度网盘,需要的自取。
链接: https://pan.baidu.com/s/1kGYk1dHbTAjBS4kd9s1VWw
提取码: 36w4
关注公众号【方丈的寺院】,第一时间收到文章的更新,与方丈一起开始技术修行之路

可落地的DDD(5)-战术设计的更多相关文章
- 可落地的DDD(7)-战术设计上的一些误区
背景 几年前我总结过DDD战术设计的一些落地经验可落地的DDD(5)-战术设计,和一次关于聚合根的激烈讨论最近两年有些新的落地体验,回过头来发现,当初对这些概念的理解还是没有深入,这篇文章重新阐述下. ...
- 战术设计DDD
可落地的DDD(5)-战术设计 摘要 本篇是DDD的战术篇,也就是关于领域事件.领域对象.聚合根.实体.值对象的讨论.也是DDD系列的完结篇.这一部分在我们团队争论最多的,也有很多月经贴,比如对资 ...
- DDD领域驱动设计落地实践(十分钟看完,半小时落地)
一.引子 不知今年吹了什么风,忽然DDD领域驱动设计进入大家视野.该思想源于2003年 Eric Evans编写的"Domain-Driven Design领域驱动设计"简称DDD ...
- DDD(领域驱动设计)--战术设计
前言 战术设计 战略设计为我们提供一种高层视野来审视我们的软件系统,主要包括领域/子域.通用语言.限界上下文和架构风格等概念, 而战术设计则将战略设计进行具体化和细节化,它主要关注的是技术层面的实施, ...
- 可落地的DDD(4)-如何利用DDD进行微服务的划分(2)
摘要 在前面一篇介绍了如何通过DDD的思想,来调整单体服务内的工程结构,为微服务的拆分做准备.同时介绍了我们在进行微服务拆分的时候踩过的一些坑. 这篇介绍下我们最终的方案,不一定对,欢迎留言讨论. 微 ...
- 浅谈我对DDD领域驱动设计的理解
从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...
- DDD 领域驱动设计-商品建模之路
最近在做电商业务中,有关商品业务改版的一些东西,后端的架构设计采用现在很流行的微服务,有关微服务的简单概念: 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独 ...
- (转载)浅谈我对DDD领域驱动设计的理解
原文地址:http://www.cnblogs.com/netfocus/p/5548025.html 从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来 ...
- DDD领域驱动设计的理解
DDD领域驱动设计的理解 从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能 ...
随机推荐
- Arcgis CreateFishnet工具,生成到FileGDB中要素类的格网大小不一致
我的第一篇博客!哈哈 最近在做一些关于创建渔网的工作,发现一些问题,做个总结. 1.问题描述:如图1,设置好渔网的必要参数,输出目录为gdb里的矢量图层,(行列数比较大,渔网的地理范围较小),输出的格 ...
- 详解Vue的slot新用法
摘要: 理解Vue插槽. 作者:前端小智 原文:vue 2.6 中 slot 的新用法 Fundebug经授权转载,版权归原作者所有. 为了保证的可读性,本文采用意译而非直译. 最近发布不久的Vue ...
- 关于VS2015 发布.net mvc 网站失败的问题
问题:VS生成成功,发布失败,在“正在连接到***文件夹”处就不能继续了.. 项目开发告一段落,准备部署到服务器上进行最后测试,但是始终发布失败 生成成功,发布失败,没有任何提示信息 一开始以为是文 ...
- Python:tarxjb简单、安全文件拷贝、传输
tarxjb 简单.安全文件拷贝.传输 描述 通过python paramiko库实现简易ssh.sftp执行操作,从而实现文件的远程传输 Github 优点: 可靠传输,文件不易受损 安全传输,避免 ...
- slf4j 和 logback 的区别
slf4j 和 logback 的区别: slf4j是Java的一个日志门面,实现了日志框架一些通用的api; logback是具体的日志框架.它和log4j是同一个作者,他是为了解决log4j存在的 ...
- 桌面图标管理工具-Rolan(网上收集,仅供学习与研究,支持正版)
Rolan 是一个轻量级启动器,“你可以通过将文件拖到软件窗口中,然后通过像 QQ 一样的吸附或者键盘热键随时呼出,点击图标即可启动,使用起来非常方便快捷! 官网:https://getrolan.c ...
- JQuery:
一 jQuery是什么? <1> jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. <2>jQuery是继 ...
- zz深度学习中的注意力模型
中间表示: C -> C1.C2.C3 i:target -> IT j: source -> JS sim(Query, Key) -> Value Key:h_j,类似某种 ...
- [LeetCode] 623. Add One Row to Tree 二叉树中增加一行
Given the root of a binary tree, then value v and depth d, you need to add a row of nodes with value ...
- markdown格式接口文档模板
源文件 https://files.cnblogs.com/files/bincoding/%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3.zip 目录 测试接口 查询指定项 ...