当前位置: 首页 > news >正文

大咖带你读:《深入实践 DDD:以 DSL 驱动复杂软件开发》

《深入实践 DDD:以 DSL 驱动复杂软件开发》由拥有二十年商业软件开发经验及十年技术管理经验的资深技术专家杨捷锋撰写,是目前市场上仅有的阐述如何通过使用领域专用语言(DSL)实现领域驱动设计(DDD)的图书,本书深度解读DDD思想,揭示使用 DSL实现DDD快速落地的方法与技巧。得到众多业内人士的强烈推荐。

以下是蓝图移动首席架构师、前蓝信技术合伙人刘建阅读本书后撰写的体会,希望对你阅读本书有所帮助。

于细微处见真章

《深入实践 DDD:以 DSL 驱动复杂软件开发》一书的作者杨捷锋是我十多年前在普天工作时的同事。在该书的写作过程中,作者热情地邀请我审阅了书中的大部分章节。当作者提出让我为本书写几句推荐语的时候,基于已经看到的书中内容的质量信心,加上对作者过往工作经历的了解,我欣然从命并深感荣幸。

当收到作者赠送的样书,我忍不住第一时间一读(再读)为快。读完全书,我可以再次确认之前的感慨和评价:本书不是一本针对 DDD 坐而论道的书——对 DDD 关键概念的阐述当然也有,但都十分扼要和精到——而是在一本坚实可靠的 DDD 落地工程化的指导手册。

全书干货十足。书中谈到的一些问题,可能我之前在工作中也碰到过,也使用了各种方式“解决”或“绕过”了,但思考和解决方案不成体系。所以,有些地方作者轻描淡写几句话——读者看得不仔细的话可能就错过了,于我而言却有拨云见日之感。

下面试列几则我在读书过程中记录的笔记,都是我认为写得十分精彩、“于细微处见真章”的地方,其中参杂着我个人的有感而发。

 

关于实体 ID 与“键”(第 22 页)

在概念上,除了对常见的 DDD 的论述外,针对实体 ID,作者专门给了一个章节进行描述,具体如何区分自然键和代理键,给出一个简单而实用的的规则:能不能见“人”——这里的“人”指的是使用软件的最终用户。这是我见过的最简单实用、且不盲从经典的标准。

随后详细论述了使用代理键的问题——尤其是设计的时候建议先忘掉代理键,这对我们 DDD 落地的时候有实际的指导价值。怎么选择键,为什么这么选择,道理和事实都在。

 

SQL 优先(第 208 页)

作者介绍的 DDDML 工具所生成的事件存储与状态持久化的代码,都基于 SQL 数据库而非 NoSQL 数据库实现。为何不(默认)选择 NoSQL 的理由,我极大地赞同。对于比较大的项目,倘若使用非静态类型的语言,成员一多、需求变化快一点,工程上很难有好的办法控制质量;而对象状态的存储,如果没有强 Schema 进行约束,“屎山”一样的代码加上”脏乱“的数据,雪上加霜,往往让人难以承受。也没法让“新人”在进入软件开发团队的时候通过查看数据库去了解整体业务对象的结构(指望看文档?对不起,文档往往是缺失或者过时的)。这个选择看起来和 DDD 没有太直接的关系,但观点值得我们在开发应用时借鉴。

 

关于数据一致性模型(第 240 页)

针对如何落地,很多问题,作者更多是探讨的方式,而不是绝对,比如对于数据一致性问题的处理,根据项目大小、期限,使用数据库本地事务的来保证强一致性也并非不可接受;而对于复杂的系统,建议采用最终一致性模型——关于 SAGA 模式的介绍很好。

为了更好的落地 DDD,作者给出了 DDDML 这个“DDD 原生”的 DSL,甚至提供了基本上是整个工具链的制作说明书,而不是理论上的 DSL,这也是全书的重点。工具能使事情标准化,效率化,更有利于 DDD 的落地。

 

关于 UI(用户界面)(第 310 页)

一般论述 DDD 的文章,除了谈到分层架构时提及一下“UI 层”之外,就比较少在这个层面上进行论述了,作者专门给了一章来描述,甚至给出了在实践中发生过的“两种路线的斗争”的过程和结果供大家参考借鉴。这是一般“后端”开发领域的图书比较少涉及,而对于一个项目落地又是不可避免需要完成的工作。

 

建模时使用第三人称叙事(第 346 页)

技术路线选择上没有绝对的好与不好,只有适合还是不适合。针对具体的按理,都会就不同的可选方案详细说出作者以及他的团队抉择的理由和过程,让你知其然且知其所以然。关于“不要用我的视角设计核心模型”,举出了很具体的订单处理的例子,而这个例子是开发 ERP,电商交易等业务软件经常碰到的,实用价值非常高,值得掩卷思考。

 

甘愿做一个傻瓜(第 369 页)

“初级开发人员只需要(也只能)做两件事……”

“……坦白地讲,我们认为很多初级程序员一开始可能仅具备把第二件事情(编写实体的方法)做好的能力。”

这几句话,审稿的时候我还跟作者“抱怨”来着,我说“你这话怎么感觉让人有点不适呢,初级程序员也是有追求的啊”。

作者的解释是:“不反对初级程序员可以有更高的追求。你也可以理解为这是一种分层架构的思维方式。即使是你这样的老司机,在编写那些‘实体的方法’的时候,也可以把自己的思维方式切换到傻瓜模式——想象自己就是一个只会写写 CRUD 的菜鸟,会怎样尝试使用别人写好的‘领域基础类型’类库来完成自己的编码工作,这有助于改进基础类型类库的设计,以及提高业务逻辑层的整体代码质量。”

这个解释委婉了。现在仔细想想,其实作者的说法也有他的道理,老司机都少不了被菜鸟写的代码坑的经验。也许有时候真相就会让人不适吧。

总之,这是一本讲述 DDD 落地的实用性很强的书,作者在书中很多细节的论述,各种解决方案的抉择,都值得读者仔细阅读和思索。

618提前开促,不止5折

点击阅读全文抢购


扫码关注【华章计算机】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 6月书讯 | 初夏,正好读新书

书单 | 8本书助你零基础转行数据分析岗

干货 | 我的15年操作系统开源路——RT-Thread 创始人熊谱翔

收藏 | 学会这7个绘图工具包,Matplotlib可视化也没那么难

上新 | 一本书掌握Kubernetes核心技术

赠书 | 【第57期】中台与数字化转型

点击阅读全文抢购

相关文章:

  • 初识 ink!
  • 简述Python中常见的数据结构
  • 终于有人把大数据架构讲明白了
  • 鸿蒙OS2面世,一本书了解“现代操作系统”!
  • 【书单】C/C++必读经典
  • 【第58期】人人可懂的技术科普书
  • 国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?...
  • 【书单】Java必读经典
  • 工业软件定义制造,打赢关键核心技术攻坚战 | 《铸魂》读者见面会在北京王府井书店成功举办...
  • 【书单】Python必读经典
  • 【书单】程序设计好书推荐
  • 盘点数据科学最流行的29个Python库
  • 除了新发布鸿蒙系统,华为还在HMS生态上下功夫
  • 你跟大神程序员的差距,就在这8本内功心法
  • 《数据安全法》表决通过!最新解读来了
  • CEF与代理
  • Computed property XXX was assigned to but it has no setter
  • echarts的各种常用效果展示
  • JavaScript函数式编程(一)
  • JSONP原理
  • mysql中InnoDB引擎中页的概念
  • spring + angular 实现导出excel
  • Zepto.js源码学习之二
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 猴子数据域名防封接口降低小说被封的风险
  • 机器学习学习笔记一
  • 聚类分析——Kmeans
  • 开源SQL-on-Hadoop系统一览
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (1)(1.13) SiK无线电高级配置(六)
  • (2)Java 简介
  • (bean配置类的注解开发)学习Spring的第十三天
  • (zt)最盛行的警世狂言(爆笑)
  • (二)c52学习之旅-简单了解单片机
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (全注解开发)学习Spring-MVC的第三天
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)Sql Server 保留几位小数的两种做法
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net web项目 调用webService
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 验证控件和javaScript的冲突问题
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET性能优化(文摘)
  • @property python知乎_Python3基础之:property
  • @Transactional 竟也能解决分布式事务?
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [100天算法】-不同路径 III(day 73)
  • [C++]拼图游戏