写点什么

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

2015 年 8 月 18 日

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

2015 年 8 月 18 日 19:586280
用户头像

发布了 428 篇内容, 共 150.6 次阅读, 收获喜欢 22 次。

关注

评论

发布
暂无评论
发现更多内容

Java 反射机制详解:入门、使用、实例

村雨遥

Java 反射

蚂蚁金服二面被血虐,鬼知道面试的我经历了什么?

Java成神之路

Java 程序员 架构 面试 编程语言

解Bug之路-主从切换”未成功”?

无毁的湖光

数据库 主从环境

c 语言思维地基搭建(vis2013编译+第一个c语言程序)

-jf.

四月日更

Airtest入门及多设备管理总结

行者AI

自动化测试

面试阿里P6,却被MySQL难倒,二战阿里,挤进天猫团队(Java岗)

云流

Java 程序员 架构 面试

一位阿里P8技术大牛的Java面试题总结,在GitHub上仅一天就获赞上万!

Java架构之路

Java 程序员 架构 面试 编程语言

真香!凭借这份Github上60K+star面试笔记,帮我搞定了字节跳动、阿里、华为、小米95%以上的Java面试题

Java成神之路

Java 程序员 架构 面试 编程语言

百度联合研究成果登上《自然》子刊 推动人才管理大数据智能化转型

百度大脑

百度 AI

从零开始写游戏服务器①:前期了解

Integer

c

面试磕磕碰碰,辛得蚂蚁高级工程师的技术笔记指导,终获P7岗offer

Java成神之路

Java 程序员 架构 面试 编程语言

大数据作业的工作流调度详解

大数据技术指南

大数据 4月日更

什么是 Jenkins? 运用Jenkins持续集成

信码由缰

DevOps jenkins

百度交易中台之订单系统架构浅析

百度Geek说

云计算 云原生 后端 云服务 架构·

stream,source,track关系

越努力,越幸运

Apache-Flume的安装及简单应用

慢慢de

win10 flume 日志采集

​专科出身,2年进入苏宁,5年跳槽阿里,论我是怎么快速晋升的?

码农之家

Java 程序员 互联网 面试 阿里

如何保护您的SaaS应用程序?

龙归科技

网络安全 SaaS 远程工作 单点登录

聪明人的训练(八)

Changing Lin

四月日更

Linux C/C++ 服务器/后端开发/后台开发学习路线

Linux服务器开发

C/C++ Linux服务器开发 Linux后台开发 Linux后端开发

webrtc 开启新特性

越努力,越幸运

Canalys发布2020 Q4中国云市场报告

百度大脑

百度 AI

跨专业?拿到阿里offer?我是如何一步一步做到的?

Java架构师迁哥

低代码平台想要实现复杂的业务流程,这4个条件不能少!

优秀

低代码

AI开发降本提效之道:云智一体AI开发全栈模式

百度大脑

百度 AI 飞桨

三次给你讲清楚Redis之Redis是个啥

华为云开发者社区

数据库 nosql redis hash 字符串

第14期师资培训火热招生中尽享国赛智能车一手资料

百度大脑

人工智能

MySQL-技术专题-锁的介绍分析

李浩宇/Alex

MySQL lock 锁机制

IPFS怎么挖矿?怎么参与IPFS挖矿?

投资矿机v:IPFS1234

IPFS怎么挖矿 怎么参与IPFS挖矿

飞桨与宸曜科技完成兼容性认证

百度大脑

认证 飞桨

Python OpenCV 泛洪填充,取经之旅第 21 天

梦想橡皮擦

Python OpenCV 4月日更

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

2021年全国大学生计算机系统能力大赛操作系统设计赛 技术报告会

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