对DDD使用的一些建议
群里经常看到类似于“看了DDD之后就不会写代码了”的情况,趁最近学车的间隙,写写我的看法。
关于这个事儿,我是觉得:当没有DDD的时候,如果你知道怎么做,那就那么做好了,不要考虑DDD。
当然不是说学了不用,而是在无法直接与实际做对应的情况下,先不要对应,慢慢来。这是一套方法论,而不是具体的方法,它更多的是给一个对当前系统复杂性手足无措的人一个思路。其中聚合那一部分只是个前提,并不是DDD的重要部分。
初做设计,学习DDD的时候,边看书可以边将内容与面向对象的各种设计原则、基本准则做对比,储备相关知识,领会面向对象的精神。学习设计的时候,完全没必要去考虑DDD该如何落实到代码这种程度。在我看来,DDD就是一种面向对象的最佳实践,就像设计模式是面向对象基本原则的最佳实践一样,当一个新手不知道如何写代码,可以选择性的模仿。
虽说不是系统简单就用不了DDD,“每行代码都是一个设计”,但是初学者应该是在手中的系统变得越来越复杂,涉及的业务对象越来越多而感到困扰的时候,才是能真正利用上DDD。一个新进的设计者这时借助DDD的思路去规划业务、去与其他团队协作,或许才能体会出其中的好处。
当年初出茅庐,遇到了些业务庞大、逻辑复杂的系统。在思考如何解决复杂性的时候,其实已经将业务对象封装成类似“聚合、聚合根”的形式了。只是项目推进的过程遇到了很多问题,也没有根据变化情况区分层次。然后顺着这些问题找到了DDD,它系统地解决了我的问题,并指出了一个方向。
虽说理想情况下是系统逐渐变得复杂,通过敏捷的方式按部就班的演进系统。但是也会有半路接手的问题,这些都是要在方法论思路的指导下灵活掌握的。至于一开始就很复杂的系统,完全可以在T型集成之类的方法下,持续敏捷的去做,就当作是系统再逐渐复杂也无不可。
虽说学习都是从模仿开始的,但DDD应该是模仿其解决复杂性的思路,而不是实现的代码,开发技巧这种层面的事儿。这方面,公众号里只发过两篇(以前博客园博客还写过一些,不过没整理过来),大概谈过这类内容,大家可以参考:《DDD概述》、《观画有感之软件开发》。虽然现在看来也有些可以商榷的地方,但是对初学者应该还是不错的。
最后,我想顺便说一下和微服务的事儿。我认为DDD和微服务是完全不同的两个东西,虽然在一些条件下,它们比较契合。微服务更多的是从技术和团队组织结构上划分的,DDD的子域更多的是从业务逻辑、业务稳定程度方面划分,很多时候确实会有重叠。但学习DDD的时候还是忽略这些重叠比较好,混淆了就出不来了。如果有特别情况,比如中台的业务逻辑按各自领域提供服务,而某一个特别功能的访问量奇大,那它的部署,服务间引用与业务的紧密程度可能并不对应,会需要取舍。
对DDD使用的一些建议的更多相关文章
- [2018-12-07]用ABP入门DDD
前言 ABP框架一直以来都是用DDD(领域驱动设计)作为宣传点之一.但是用过ABP的人都知道,ABP并不是一个严格遵循DDD的开发框架,又或者说,它并没有完整实现DDD的所有概念. 但是反过来说,认真 ...
- 微服务架构 - Jimu(积木) 升级 1.0.0 支持 .Net Core 3.0
如果不知道 Jimu(积木) 是啥,请移步 .Net Core 分布式微服务框架介绍 - Jimu 这次升级除了支持 .Net Core 3.0 还新增部分功能,如 REST, 链路跟踪等,以下为详细 ...
- SCF(SenparcCoreFramework) 系列教程(一):项目介绍及快速搭建
2020年3月25日的“盛派周三分享”活动首次使用直播的方式与大家见面,共有 500 多人参与了活动,得到了众多开发者的好评,并强烈要求我分享 PPT,这点要求当然必须满足啦! 除此以外,还有许多开发 ...
- 初识ABP vNext(1):开篇计划&基础知识
目录 前言 开始 审计(Audit) 本地化(Localization) 事件总线(Event Bus) 多租户(multi-tenancy technology) DDD分层 实体(Entity) ...
- 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发
阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...
- DDD初学指南
去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...
- 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)
建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...
- 关于DDD的学习资料汇总
DDD(Domain-Driven Design)领域驱动设计,第一次看到DDD是在学习ABP时,在其中的介绍中看到的.what,DDD是个什么鬼,我不是小白,是大白,没听过.于是乎,度娘查查查,找到 ...
- 初探领域驱动设计(2)Repository在DDD中的应用
概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...
随机推荐
- LSP原则是什么
如果这篇文章能够帮到您,请给我一个免费的赞,谢谢QWQ! LSP原则并不难,但是地方就会把它说的很啰嗦,如果你对LSP还是感到疑惑,请往下看看. 先上代码: public class Bird { p ...
- 看看CabloyJS工作流引擎是如何实现Activiti边界事件的
CabloyJS内置工作流引擎的基本介绍 1. 由来 众所周知,NodeJS作为后端开发语言和运行环境,支持高并发.开发效率高,有口皆碑,但是大多用于数据CRUD管理.中间层聚合和中间层代理等工具场景 ...
- .NET C#基础(6):命名空间 - 组织代码的利器
0. 文章目的 面向C#新学者,介绍命名空间(namespace)的概念以及C#中的命名空间的相关内容 1. 阅读基础 理解C与C#语言的基础语法 2. 名称冲突与命名空间 2.1 一个生活例 ...
- AtCoder ABC 242 题解
AtCoder ABC 242 题解 A T-shirt 排名前 \(A\) 可得 T-shirt 排名 \([A+1,B]\) 中随机选 \(C\) 个得 T-shirt 给出排名 \(X\) ,求 ...
- 技术分享 | app自动化测试(Android)--App 控件定位
原文链接 客户端的页面通过 XML 来实现 UI 的布局,页面的 UI 布局作为一个树形结构,而树叶被定义为节点.这里的节点也就对应了要定位的元素,节点的上级节点,定义了元素的布局结构.在 XML 布 ...
- 【Redis】集群数据迁移
Redis通过对KEY计算hash,将KEY映射到slot,集群中每个节点负责一部分slot的方式管理数据,slot最大个数为16384. 在集群节点对应的结构体变量clusterNode中可以看到s ...
- 获取请求体数据 POST
POST获取请求体 请求体中封装了 POST请求的请求参数 获取流对象 再从流对象中那数据 一种字节流 一种字符流 BufferedReader getReader()获取字符输入流 只能操作字符 S ...
- UiPath Level3讲解
匠厂出品,必属精品 Uipath中文社区qq交流群:465630324 uipath中文交流社区:https://uipathbbs.com RPA之家qq群:465620839 第一课--UiP ...
- 【FAQ】华为帐号服务报错 907135701的常见原因总结和解决方法
很多开发者在接入华为帐号服务时,经常会出现907135701的报错.根据官网文档说明,错误码907135701表示: 这个错误码在安卓和鸿蒙上都会出现,导致该报错的原因有很多,开发者可以按照下面几点进 ...
- 集合-List接口常用实现类的对比
1.collection接口:单列集合,用来存储一个一个的对象 2. list接口:存储有序的.可重复的数据. --->"动态数组",替换原有的数组 (1) Arraylis ...