群里经常看到类似于“看了DDD之后就不会写代码了”的情况,趁最近学车的间隙,写写我的看法。

关于这个事儿,我是觉得:当没有DDD的时候,如果你知道怎么做,那就那么做好了,不要考虑DDD。

当然不是说学了不用,而是在无法直接与实际做对应的情况下,先不要对应,慢慢来。这是一套方法论,而不是具体的方法,它更多的是给一个对当前系统复杂性手足无措的人一个思路。其中聚合那一部分只是个前提,并不是DDD的重要部分。

初做设计,学习DDD的时候,边看书可以边将内容与面向对象的各种设计原则、基本准则做对比,储备相关知识,领会面向对象的精神。学习设计的时候,完全没必要去考虑DDD该如何落实到代码这种程度。在我看来,DDD就是一种面向对象的最佳实践,就像设计模式是面向对象基本原则的最佳实践一样,当一个新手不知道如何写代码,可以选择性的模仿。

虽说不是系统简单就用不了DDD,“每行代码都是一个设计”,但是初学者应该是在手中的系统变得越来越复杂,涉及的业务对象越来越多而感到困扰的时候,才是能真正利用上DDD。一个新进的设计者这时借助DDD的思路去规划业务、去与其他团队协作,或许才能体会出其中的好处。

当年初出茅庐,遇到了些业务庞大、逻辑复杂的系统。在思考如何解决复杂性的时候,其实已经将业务对象封装成类似“聚合、聚合根”的形式了。只是项目推进的过程遇到了很多问题,也没有根据变化情况区分层次。然后顺着这些问题找到了DDD,它系统地解决了我的问题,并指出了一个方向。

虽说理想情况下是系统逐渐变得复杂,通过敏捷的方式按部就班的演进系统。但是也会有半路接手的问题,这些都是要在方法论思路的指导下灵活掌握的。至于一开始就很复杂的系统,完全可以在T型集成之类的方法下,持续敏捷的去做,就当作是系统再逐渐复杂也无不可。

虽说学习都是从模仿开始的,但DDD应该是模仿其解决复杂性的思路,而不是实现的代码,开发技巧这种层面的事儿。这方面,公众号里只发过两篇(以前博客园博客还写过一些,不过没整理过来),大概谈过这类内容,大家可以参考:《DDD概述》、《观画有感之软件开发》。虽然现在看来也有些可以商榷的地方,但是对初学者应该还是不错的。

最后,我想顺便说一下和微服务的事儿。我认为DDD和微服务是完全不同的两个东西,虽然在一些条件下,它们比较契合。微服务更多的是从技术和团队组织结构上划分的,DDD的子域更多的是从业务逻辑、业务稳定程度方面划分,很多时候确实会有重叠。但学习DDD的时候还是忽略这些重叠比较好,混淆了就出不来了。如果有特别情况,比如中台的业务逻辑按各自领域提供服务,而某一个特别功能的访问量奇大,那它的部署,服务间引用与业务的紧密程度可能并不对应,会需要取舍。


对DDD使用的一些建议的更多相关文章

  1. [2018-12-07]用ABP入门DDD

    前言 ABP框架一直以来都是用DDD(领域驱动设计)作为宣传点之一.但是用过ABP的人都知道,ABP并不是一个严格遵循DDD的开发框架,又或者说,它并没有完整实现DDD的所有概念. 但是反过来说,认真 ...

  2. 微服务架构 - Jimu(积木) 升级 1.0.0 支持 .Net Core 3.0

    如果不知道 Jimu(积木) 是啥,请移步 .Net Core 分布式微服务框架介绍 - Jimu 这次升级除了支持 .Net Core 3.0 还新增部分功能,如 REST, 链路跟踪等,以下为详细 ...

  3. SCF(SenparcCoreFramework) 系列教程(一):项目介绍及快速搭建

    2020年3月25日的“盛派周三分享”活动首次使用直播的方式与大家见面,共有 500 多人参与了活动,得到了众多开发者的好评,并强烈要求我分享 PPT,这点要求当然必须满足啦! 除此以外,还有许多开发 ...

  4. 初识ABP vNext(1):开篇计划&基础知识

    目录 前言 开始 审计(Audit) 本地化(Localization) 事件总线(Event Bus) 多租户(multi-tenancy technology) DDD分层 实体(Entity) ...

  5. 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发

    阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...

  6. DDD初学指南

    去年就打算总结一下,结果新换的工作特别忙,就迟迟没有认真动手.主要内容是很多初学DDD甚至于学习很长时间的同学没有弄明白DDD是什么,适合什么情况.这世界上没有银弹,抛开了适合的场景孤立的去研究DDD ...

  7. 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)

    建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...

  8. 关于DDD的学习资料汇总

    DDD(Domain-Driven Design)领域驱动设计,第一次看到DDD是在学习ABP时,在其中的介绍中看到的.what,DDD是个什么鬼,我不是小白,是大白,没听过.于是乎,度娘查查查,找到 ...

  9. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

随机推荐

  1. torch.nn.MSELoss()函数解读

    转载自:https://www.cnblogs.com/tingtin/p/13902325.html

  2. 编程技巧│浏览器 Notification 桌面推送通知

    目录 一.什么是 Notification 二.弹窗授权 三.弹窗使用 四.浏览器支持检测 五.授权回调 六.3秒后关闭弹窗 一.什么是 Notification Notification 是浏览器最 ...

  3. SAP 维护视图隐藏字段

    PBO:     MODULE reset_index. 其中ZDT_BPC002_T02 为视图名称. MODULE reset_index OUTPUT. FIELD-SYMBOLS:<fs ...

  4. 一篇文章讲清楚MySQL的聚簇/联合/覆盖索引、回表、索引下推

    迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"加班使我快乐". 面试官: ...

  5. go-zero微服务实战系列(七、请求量这么高该如何优化)

    前两篇文章我们介绍了缓存使用的各种最佳实践,首先介绍了缓存使用的基本姿势,分别是如何利用go-zero自动生成的缓存和逻辑代码中缓存代码如何写,接着讲解了在面对缓存的穿透.击穿.雪崩等常见问题时的解决 ...

  6. gitlab和jenkins做持续集成构建教程

    背景介绍 上一个轮回,我花了三篇文章的时间着重向大家介绍了在条件有限的情况下,如果优雅地进行前端发版和迭代.庆七一,热烈庆祝香港回归,人民生活水平越来越好,昨天上午我自掏腰包买了台服务器,决定由冷兵器 ...

  7. 常用Linux音译

    su:Swith user 切换用户,切换到root用户 cat: Concatenate 串联 uname: Unix name 系统名称 df: Disk free 空余硬盘 du: Disk u ...

  8. 编译安装Python出现“pip is configured with locations that require TLS/SSL, however the ssl.....”

    ubuntu: sudo apt-get install libssl-dev Cenos: sudo yum install openssl-devel 重新编译: ./configure --en ...

  9. input函数的高级使用

    经典的a+b问题终于重出江湖了 a=input('a = ') b=input('b = ') print(a+b)//error,因为此时ab是字符串类型,其加号起到的是连接的作用 所以这就是类型转 ...

  10. Arraylist集合的概述和基本使用与常用方法

    什么是ArrayList类 java.util.ArrayList 是大小可变的数组实现的,存储在内的数据称为元素,此类提供一些方法来操作内部存储的元素.ArrayList中可不断添加元素,其大小也自 ...