写点什么

在进行领域驱动设计时要避免的十个常见错误

2015 年 7 月 14 日

Daniel Whittaker 在最近的一篇帖子中表示:在进行领域驱动设计(DDD)时,缺乏与领域专家的互动是一种常见的错误,而如果能够尽早发现并解决这一问题,或许能够避免团队无谓的时间浪费。在这篇帖子中,Daniel 共列举了十种他发现开发者经常会犯的错误。

让持久化或数据存储问题影响模型的设计。通过使用战术模式,例如聚合根,能够简化模型,并将相关概念与对基础设施的关注面相互分离,例如数据存储等等。如果在没有经过与领域专家进行交流的前提下贸然开始数据架构或数据模型的设计,可能会导致所创建的代码是基于某个关系型模型,而不是基于某个领域模型的。而在类似话题上, Stefan Tilkov 也在先前的一篇文章中对于在企业中使用标准化数据模型的方式提出了警告,这种方式可能会导致模型中充满了可选的特性以及奇怪的行为。

缺乏与领域专家的交流。 DDD 的核心实践之一就在于通过与领域专家进行交谈,从而以他们的角度对于问题领域进行理解。而行为驱动开发(BDD)实践则强调与领域专家通过对话的方式创建行为的实例。对此, Konstantin Kudryashov 曾专门写过一篇如何将BDD 与DDD 实践相结合的文章。

忽视领域专家的语言。 DDD 的另一个核心实践在于创建一套通用语言,并与领域专家共享。这套通用语言必须使用在讨论过程中,同样也必须反映在代码中,例如类与方法的名称。

没有鉴别出边界上下文。解决复杂问题的常见方式是将其分解为多个小问题。而边界上下文就是为了将一个大的领域分解为多个小的子领域而出现的,每个边界上下文将负责处理领域中的一个内聚的功能。这一点同样也是微服务的核心概念,在今年的 DDD Exchange 大会的主题演讲中, Eric Evans 专门对此展开了讨论。

使用贫血模型。这是一个说明团队并没有正确地使用 DDD 的信号,也暗示着建模过程的失败。一个贫血模型第一眼看上去与真正的领域模型非常相像,例如它们同样使用了正确的名称。但问题在于贫血模型中的类几乎丢失了所有的行为,而变成了只包含单纯的getter 与setter 属性的容器。

Whittaker 所认识到的另外五种常见的错误在于:

  • 没有让边界上下文随着对领域的见解加深而相应地作出改变。
  • 将所有逻辑都设想为领域逻辑。
  • 过度使用集成测试。
  • 将安全性视为领域的一部分(除非你本身设计的就是一种安全性领域)。
  • 过度关注基础设施。

Whittaker 最提到的最后一个错误则是忽视了事件风暴的作用,这是由 Alberto Brandolini 所创建的一种专注于事件的设计过程。Brandolini 的想法是,通过将所有的项目干系人都集中在一个房间内,为他们提供无限的空间进行建模工作,并让他们用贴纸的方式写出所有的领域事件。这种方式在几个小时之内就能够为某个问题领域创建出一套非常出色的模型。

查看英文原文: 10 Common DDD Mistakes to Avoid

2015 年 7 月 14 日 10:172580
用户头像

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

关注

评论

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

著名的Java并发编程大师都这么说了,你还不知道伪共享么!

看点代码再上班

Java 后端 后端开发

SpringBoot之自定义启动异常堆栈信息打印

false℃

EMC设计中电缆屏蔽使用方法

不脱发的程序猿

二月春节不断更 电路设计 EMC 电子产品 电缆屏蔽

APM 行业认知系列 - 三

东风微鸣

APM Trace 可观察性

LoadRunner测试中遇见的不可思议的问题及其解决方法

陈磊@Criss

Elasticsearch踩坑记之深度分页

topsion

大数据 elasticsearch 深度分页

干货来袭!阿里大佬“亲码”Java全线笔记,差距不止一点点

程序员小毕

Java 程序员 面试 分布式 微服务

重大更新!一文了解京东通用目标重识别开源库FastReID V1.0

京东科技开发者

AI 监控

【LeetCode】数组的度Java题解

HQ数字卡

算法 LeetCode 28天写作 2月春节不断更

大小厂必问Java后端面试题(含答案)

yes的练级攻略

Java 面试 后端

Java实体映射利器---MapStruct

是小毛吖

Java MapStruct

APM 行业认知系列 - 二

东风微鸣

APM Trace 可观察性

构建万物可信互联的基石,带你深度剖析区块链跨链的关键技术,满满是干货!

华为云开发者社区

区块链 智能合约 云原生 跨链技术 分布式账本技术

诊所数字化:搭建网络路径的信息铺设策略

boshi

数字化转型 医疗 七日更 28天写作

读书总结2020

IT民工大叔

#读书

IDEA 敏捷开发技巧——后缀完成

程序员小航

Java 后端 IDEA

区块链商品溯源平台开发,区块链公共服务系统开发方案

WX13823153201

区块链商品溯源平台开发

如何 0 改造,让单体/微服务应用成为Serverless Application

阿里巴巴云原生

Docker Serverless 容器 微服务 云原生

【STM32】CubeMX+HAL 点亮 LED

AXYZdong

硬件 stm32 2月春节不断更

产品训练营--第四期作业

曦语

产品训练营

Elasticsearch filter vs. query 对比

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

可能是Java 8 Optional最佳实践

ES_her0

28天写作

电子产品中EMC隔离设计的方法

不脱发的程序猿

二月春节不断更 电路设计 EMC 电子产品

LeetCode题解:53. 最大子序和,动态规划,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

Golang代码测试:一点到面用测试驱动开发

华为云开发者社区

go golang 测试 TDD 代码

架构设计篇之微服务实战笔记(一)

小诚信驿站

架构师 刘晓成 小诚信驿站 28天写作 架构师成长笔记

爱了!腾讯技术官吹爆的Spring Security笔记开源

Crud的程序员

spring 架构

APM(应用性能监控) 行业认知系列 - 一

东风微鸣

APM Trace 可观察性

《经济学人》2021年2月20日刊精彩文章导读及资源下载

wbliu85

全网最新、最全面蚂蚁金服面经分享:简历模板/面试题库/Java核心技术笔记

比伯

Java 编程 程序员 面试 技术宅

你的面试专属!JVM G1GC的算法+实现,90张图+33段代码

Java架构追梦

Java 架构 JVM 调优 G1GC

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

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

在进行领域驱动设计时要避免的十个常见错误-InfoQ