写点什么

捕获 - 嵌入 - 防护:领域驱动设计的指导原则

  • 2017-07-12
  • 本文字数:1016 字

    阅读完需:约 3 分钟

在使用领域驱动模型(DDD)核心理念和实践作为软件设计和开发的指导方针时,可以概括为三个原则:捕获、嵌入、防护。这是 Steven A. Lowe 在今年的 DDD 交流大会演讲时提出的。为了采取积极的行动,我们通过掌握刚好够用的信息来捕获领域模型。我们将模型嵌入到代码和对话中。我们保护领域模型免受其他领域的侵蚀,尤其是技术领域。

在 Thoughtworks 首席顾问 Lowe 看来,DDD 的出现是一种突破,因为它打破了对企业数据模型的错误沉迷,并代之以专注于合作领域的、独立但重叠的模型。他强调,DDD 改变了软件开发的关注点和范围,从技术视角转向了以业务目标指导探索和解决方案。他认为,虽然人们对于 DDD 还存在一些误解,但他指出,那些都是错的:

  • DDD 很难。不,它需要专注和自律,但编程也是如此。
  • DDD 会带来额外负担。除非你认为没有必要了解一个领域。
  • DDD 仅适合复杂的领域。也许复杂的领域最需要,但这种理念肯定是普遍适用的。

捕获的目的是可视化领域的思维模型,让其具备交互性,从而使所有人都达成一致。在 Lowe 推荐的模型创建方法中,其中一种是把所有人都召集到一个房间里,让他们专注于领域活动。这项技术被称为事件风暴——一种由 Alberto Brandolini 创建的集体建模方法。Lowe 发现,这种方法非常强大,可以最大化学习速度,最小化学习负担。

在将领域模型嵌入到代码时,两个重要的部分是命名和组合,前者可以反映领域意图,而后者可以反映领域行为。Lowe 指出,如果你不能给一个东西起个好名字,则可能说明你对你要命名的东西不够了解。由于文档和图表都会过期,所以代码才是唯一可靠的事实来源。通过将领域模型嵌入到代码,就可以保证模型永远正确,而且对于开发人员随时可见。在更高层面上,领域专家也可以读懂代码。

为了保护领域模型免受侵蚀,我们使用边界将子领域隔离开。上下文的边界是其接口,即进进出出的命令和事件。但是,边界的强度也很重要,需要在接口中完成什么验证和转换?一种实用的方法是使用模块从物理上隔离子领域。这样做的好处包括,代码库耦合度更低,更有弹性。Lowe 指出,争取在编码的第一时间避免技术债务比后续消除它更简单。

Lowe 最后强调,捕获 - 嵌入 - 防护是一个迭代过程,会随着每个步骤重复多次,从较小的经过验证的模型逐步构建出一个领域模型。他还指出随时随地使用领域驱动设计的重要性;如果你不是有意对领域建模,那么你就不会无意中为其他东西建模。

查看英文原文: Capture - Embed - Protect, Guidelines for Domain-Driven Design

2017-07-12 19:002002
用户头像

发布了 1008 篇内容, 共 419.7 次阅读, 收获喜欢 346 次。

关注

评论

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

让垃圾分类开发“极快致简”的好物件,零基础的开发小白也能轻松驾驭它!

华为云开发者联盟

数据 分类

训练营第八周总结

大脸猫

极客大学架构师训练营

多国探路数字货币

CECBC

数字货币

话题讨论 | 程序员自己电脑中毒是甚么体验?

xcbeyond

话题讨论

三分钟看懂新一代.Net Core3.1工作流引擎平台

Philips

敏捷开发 工作流

Serverless 如何落地?揭秘阿里核心业务大规模落地实现

阿里巴巴云原生

阿里巴巴 阿里云 Serverless 开发者 云原生

海阔天空的游戏出海,HMS生态提供的风帆与通路

脑极体

训练营第八周作业

大脸猫

极客大学架构师训练营

跨专业零基础校招拿到网易18K*13薪Java岗offer全过程复盘总结

Java架构师迁哥

动态高并发时为什么推荐ReentrantLock而不是Synchronized?

moon聊技术

JVM 并发 synchronized ReentrantLock 锁升级

如何判断一个区块链项目是否优质?

CECBC

开源

云上的移动性能测试平台

移动研发平台EMAS

阿里云 测试 移动研发平台

最简单的Go Dockerfile编写姿势,没有之一!

万俊峰Kevin

Docker Dockerfile Go 语言

我哭了!Centos6停止更新只能切换7,哪些习惯也需要切换

小Q

Java Linux centos 学习 面试

《迅雷链精品课》第十二课:PoW共识算法

迅雷链

区块链

LeetCode题解:515. 在每个树行中找最大值,DFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

分布式事务框架 seata-golang 通信模型详解

阿里巴巴云原生

数据库 微服务 云原生 Go 语言

官方活动 | 盘点2020有奖征文

InfoQ写作社区官方

盘点2020 热门活动

什么是802.11ax(Wi-Fi 6)

装机必备:借用IDM实现百度云高速下载

懒得勤快

Spark-submit执行流程,了解一下

华为云开发者联盟

spark 技术 流程

华为云亮相QCon2020深圳站,带你体会大厂的云原生玩法与秘诀

华为云开发者联盟

专家 华为云 深圳

【得物技术】MySQL多表关联同步到ES的实践

得物技术

MySQL 原理 配置 ES 多表join

开除AI伦理学家,谷歌如何从“不作恶”到“不宽容”?

脑极体

构师训练营第八周学习笔记

李日盛

笔记

我哭了!Centos6停止更新只能切换7,哪些习惯也需要切换

996小迁

Java 架构 面试 Centos6

滴滴DoKit-功能介绍之文件同步助手

工具 文件 DoKit

使用LiteOS Studio图形化查看LiteOS在STM32上运行的奥秘

华为云开发者联盟

LiteOS 脚本 语言

一周信创舆情观察(11.30~12.6)

统小信uos

区块链加速产业革命,打造畜禽养殖业发展新途径

CECBC

养殖业

DolphinDB与Elasticserach在金融数据集上的性能对比测试

DolphinDB

数据处理 金融 时序数据库 tsdb DolphinDB

捕获-嵌入-防护:领域驱动设计的指导原则_语言 & 开发_Jan Stenberg_InfoQ精选文章