Chris Patuzzo近期在一次演讲中介绍了领域驱动设计(DDD)的原则,并结合一个基于Ruby on Rails的真实项目进行讲解。在这次项目之前,Chris所在的团队为重新设计公司的主营网站所做的两个概念验证都因为可伸缩性方面的问题而失败了。因此,业务主管部门决定在这一次尝试中采取一种更为敏捷的、增量式的方法,他们受到了DDD的启发,在这次重启的开发过程中全力促进开发者与领域专家的交流。

\\

Patuzzo是Which?的技术主管。在他看来,DDD的要点是捕捉到业务的概念,软件的构建需要围绕着对业务的理解而展开。在这次项目重启的过程中,开发者开始学会与领域专家进行深入交流,以试图理解整个业务的实际行为。在此基础上设计出合适的领域模型,并找到系统中存在的各个边界。按Patuzzo的经验来看,在具有清晰的边界划分的系统中开展工作要轻松许多。通过保持关注分离,系统将更易于理解,如果之后需要将系统中的某些部分提取出来,实现起来也会更简单。

\\

DDD建议将问题分解为多个层,每一层各司其职,例如表示层、领域层以及基础设施层。Patuzzo特别提到在进行Rails开发时存在着一种常见的实践,即将领域层与基础设施层合并在一起,这种方式显然违背了DDD的建议。除了分层架构外,另一种选择是由Alistair Cockburn定义的多边形架构(Hexagonal architecture),但Patuzzo并不强烈主张这种架构风格,他认为这种架构可能会令人迷惑。他表示,这些架构有助于管理系统的复杂度,保持对核心领域的专注,但他也承认这些思想对于Ruby社区来说还比较新鲜,需要一定的时间去适应。

\\

衡量复杂度的一种方式是计算对象间的交互,通过使用聚合与聚合根,可以将这种交互限制在聚合之内,以及聚合根之间的交互,从而将这种交互的频率减至最低。Patuzzo将其称为系统的表面区域。Ruby项目通常会使用活动目录(Active Record)这种设计方式,因此每个类都表现为全局的常量,可以在系统中的每一处随意访问。为了绕开这个问题,开发者通常会用聚合的名称作为类名的前缀。通过将系统功能分解为聚合,使对象间的通信显得更为结构化。这种新的设计方式对于团队来说确实引入了一个陡峭的学习曲线,这一部分在开发过程中所产生的分歧也是最大的。但在项目的回顾会议中,Patuzzo对于最终的结果表示很满意。

\\

Patuzzo在总结中表示:虽然全新的开发过程为开发者带来了一些负担,但好处也很明显。开发者学到了DDD的基本模式与思想、如何将架构分解为多个层、关注分离的思想、以及如何设计一个能够应对变化的系统。由于新系统是基于一个能够充分表现业务需求的模型而建立的,因此他相信他的团队将能够更好地满足新的需求。

\\

查看英文原文:Experiences Introducing DDD in a Project

在项目中引入领域驱动设计的经验相关推荐

  1. 谈谈微服务架构中的领域驱动设计

    谈谈微服务架构中的领域驱动设计 https://mp.weixin.qq.com/s/43HSud6ijdVzPA_wdLrxzQ 谈谈微服务架构中的领域驱动设计 本文是关于领域驱动设计与微服务架构结 ...

  2. 演进架构中的领域驱动设计

    原文链接:http://www.infoq.com/cn/articles/ddd-evolving-architecture 作者 Mat Wall and Nik Silver 译者 王丽娟 发布 ...

  3. 在洋葱(Onion)架构中实现领域驱动设计

    Wade Waldron是一位来自于BoldRadius的资深软件开发者,他在一次演讲中表示,他在几年前开始结合使用领域驱动设计(DDD)与洋葱架构,他的代码质量从此得到了极大的提高.一开始他仅仅使用 ...

  4. 领域驱动设计,为何死灰复燃?

    作者简介 张逸,曾先后就职于中兴通讯.惠普 GDCC.中软国际.ThoughtWorks 等大型中外企业,任职角色为高级软件工程师.架构师.技术总监.首席咨询师. 一.领域驱动设计为何又死灰复燃焕发青 ...

  5. 领域驱动设计(DDD)的精髓

    边界是核心 无论是从宏观到微观再到纳米层次,还是从战略设计推进到战术设计,领域驱动设计一直强调的核心思想,就是对边界的划分与控制. 从分析需求一开始,我们就需要通过确定项目的愿景与目标,划定问题空间, ...

  6. 何时使用领域驱动设计

    何时使用领域驱动设计?其实当你的应用程序架构设计是面向业务的时候,你已经开始使用领域驱动设计了.领域驱动设计既不是架构风格(Architecture Style),也不是架构模式(Architectu ...

  7. 如何运用领域驱动设计 - 领域事件

    开篇 距离发布上一篇该系列的文章好像已经过了快一个半月了,好吧,我托更了????.一晃就已经到了3月份,在这樱花????盛开的季节,终于得重新连载该系列了.在停更的期间时不时会收到大家关于DDD的留言 ...

  8. 如何运用领域驱动设计 - 聚合

    概述 DDD实战与进阶 - 值对象 如何运用DDD - 实体 如何运用领域驱动设计 - 领域服务 在前几篇的博文中,我们已经学习到了如何运用实体和值对象.随着我们所在领域的不断深入,领域模型变得逐渐清 ...

  9. 领域驱动设计,让程序员心中有码(八)

    领域驱动是十五年前,由Eric Evans提出的解决软件工程复杂性问题的方法,作者从自己多年软件开发的角度出发,通过引入领域驱动设计的概念以及一系列战略设计模式和战术方法,为混沌的软件开发领域带来了一 ...

最新文章

  1. PHP哈希表碰撞攻击原理
  2. Win10无法修改编辑hosts文件
  3. hdoop(2)——hdfs一些常用的配置文件
  4. linux删除位于后台的进程组,linux命令(12)-进程与作业管理
  5. java赋值父类_java新手求助super和set给父类赋值!
  6. 企业Linux系统部署OA系统上线实例
  7. 路由算法之距离矢量算法和链路状态算法
  8. Vmware下安装配置HMC
  9. WS2811彩带驱动库函数
  10. 用HLM软件做跨层中介效应检验的一些缺点
  11. 实战开发支付SDK —— 对接微信支付看这一篇文章就够啦(含源码)
  12. xcode6.3设备无法运行Ineligible Devices的解决方法
  13. Unable to find image ‘yt:latest‘ locally
  14. 小巧精美原厂轴 Cherry发布全新MX Board 1.0
  15. MGCtoken与IMtoken哪个好?安全吗?
  16. SparkCore:RDD累加器和广播变量(最详细的介绍)!!!!!!
  17. 快手怎么引流做CPA?如何在快手直播上截流操作CPA项目
  18. VMware官网获取VMware Workstation Pro、安装及注册
  19. python quit函数_在Python中启用quit函数的问题
  20. Bit和Byte的区别

热门文章

  1. 【转载】常用DOS命令(包括创建删除文件夹/文件)
  2. 完美解决Flask-Migrate使用SQLite生成自动迁移脚本的Bug
  3. AlertDialog和自定义对话框
  4. Java中PreparedStatement和Statement的用法区别
  5. 关于Opencv2.4.x中stitcher类的简单应用
  6. vmware开发包之vSphere Management SDK
  7. (三)ajax请求不同源之websocket跨域
  8. linux 硬链接和软链接
  9. 一个时代的结束:微软盖茨的人生掠影(组图)
  10. 如何选择汽车LiDAR的激光器和光电探测器