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

在项目中引入领域驱动设计的经验

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

相关文章:

  • 【零基础学习iOS开发】【02-C语言】11-函数的声明和定义
  • 树莓派 安装 php
  • 互联网架构设想的大型应用软件,并建议
  • Android软硬整合技术(HALFramework)
  • httpry 升级版本 secihttp 发布了
  • 认为最重要的是:不要说自己正在「创业」(转)
  • 第一章 词汇陷阱
  • 在我的眼里,生产主管(1)——如何做竞争分析
  • Linux用户和组管理
  • Intellij idea 与 eclipse 常用快捷键对比(Shortcuts to compare : Intellij idea VS Eclipse)
  • 银行之前的转账和支付宝银行间的转账
  • 决解linuxmint17终端字体重叠问题
  • 学习利用帮助文件的查看,并通过帮助命令学习基本命令
  • 大话设计模式第二章---商场促销简单工厂模式、策略模式 PHP实现及对比
  • linux运维实战练习-2015年8月27日课程作业
  • CentOS从零开始部署Nodejs项目
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS 三角实现
  • C语言笔记(第一章:C语言编程)
  • Docker下部署自己的LNMP工作环境
  • Druid 在有赞的实践
  • Github访问慢解决办法
  • Js基础知识(一) - 变量
  • LeetCode29.两数相除 JavaScript
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • LintCode 31. partitionArray 数组划分
  • Redis中的lru算法实现
  • swift基础之_对象 实例方法 对象方法。
  • 高性能JavaScript阅读简记(三)
  • 开源地图数据可视化库——mapnik
  • 你真的知道 == 和 equals 的区别吗?
  • 入门到放弃node系列之Hello Word篇
  • 详解移动APP与web APP的区别
  •  一套莫尔斯电报听写、翻译系统
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 译有关态射的一切
  • kubernetes资源对象--ingress
  • mysql面试题分组并合并列
  • 如何正确理解,内页权重高于首页?
  • #include
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (145)光线追踪距离场柔和阴影
  • (4)logging(日志模块)
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (day 12)JavaScript学习笔记(数组3)
  • (day6) 319. 灯泡开关
  • (算法)求1到1亿间的质数或素数
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ***详解账号泄露:全球约1亿用户已泄露
  • .net 简单实现MD5
  • @DateTimeFormat 和 @JsonFormat 注解详解