写点什么

行为驱动开发与领域驱动设计相结合

  • 2015-03-08
  • 本文字数:1133 字

    阅读完需:约 4 分钟

虽然行为驱动开发 (BDD) 更针对于会话和示例,但是 BDD 还有另外一面,就是软件设计部分。Konstantin Kudryashov 通过将 BDD 的会话部分和专注于领域的设计活动相结合,诠释了BDD 是如何用于领域驱动设计 (DDD) 的。

作为 BDD 实践经理, Kudryashov 描述了使用 BDD 书写用户故事中的场景的两种形式。命令式书写的用户故事从技术角度描述了应用将如何工作,通常会与实现相耦合;声明式书写的用户故事描述了问题和用户想达到的目的。他更喜欢后者。无论使用哪种形式书写,大多数 BDD 的实践者将停留在这个描述程度上,并将这些场景用于驱动实践,Kudryashov 相信这还远远不够,这种描述丢失了很多对业务非常重要的细节。通过与领域专家讨论,可以澄清命名、寻找丢失的关联信息等等。场景撰写可以包含更多细节,当使用业务人员和开发人员共享的通用的语言撰写时,通用语言 (ubiquitous language) 将会从中形成,这是 DDD 的核心概念之一。Kudryashov 宣称,通过这种方式撰写的场景将成为一种领域模型。

大力推动通用语言,就能够让示例成为领域模型

大多数 BDD 的实践者采用的测试方法是由外及内的方式,通过用户接口、界面来测试每个场景。与之相反,DDD 的实践者更针对领域核心,对他们来说关注点是隐藏在龟速而且脆弱的用户界面后面的,因此,他们趋向于工作在由内向外的方式下,从领域核心开发。直至其实现足够稳定,于核心之上实现的用户界面才会随之完成。为了强调这一点,Kudryashov 引用了 Vaughn Vernon 所著的《实现领域驱动设计》一书中的内容:

应用边界,或者内六边形也是用例(或者用户故事)的边界。换句话说,我们应当基于应用的功能性需求,而不是各种客户端或者输出装置的数量来创建用例。

为了将 BDD 和 DDD 实践放在一起,两种技术需要结合使用。为此,Kudryashov 首先去除了用户界面,然后通过领域来运行测试。从领域部分开始设计,与业务人员的对话就形成了架构师,针对问题领域进行不同的描述,将产生不同的架构,这种架构对于该领域来说更为自然。Kudryashov 发现这种方式的一个好处是去除持久层需求和前述场景中的用户界面,将大大缩减与领域专家会话的反馈循环,提高理解领域的速度。

使用这种方法,用户界面不再是应用的中心,而只是领域的一个控制器。只有用户界面是场景中的重要部分并且是应用所必需时才添加用户界面,而此时该领域早已被证明是可以工作的了。

在去年的一次演讲中,Ian Cooper 在讨论行为测试时使用过六边形架构

查看英文原文: Behaviour-Driven Development Combined with Domain-Driven Design


感谢邵思华对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2015-03-08 08:312481

评论

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

什么是云效,云效平台

阿里云云效

阿里云 DevOps 云原生 研发 研发提效

百分点感知智能实验室:声纹识别技术发展及未来趋势研究

百分点科技技术团队

Java实现创建Zip压缩包并写入文件

CRMEB

云钉一体加速,阿里云计算巢与钉钉深度融合、共建应用新生态

阿里云弹性计算

阿里云 计算巢 云合计划 云钉一体

LabVIEW色彩定位实现药品包装质量检测(实战篇—4)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 色彩定位 药品包装质量检测

从零实现一个 VuePress 插件

冴羽

Vue 前端 博客 vuepress 博客搭建

投稿开奖丨“轻量应用服务器”征文活动(9&10月)大奖公布

阿里云弹性计算

阿里云 轻量应用 征文投稿开奖

一个cpp协程库的前世今生(十九)event

SkyFire

c++ cocpp

LabVIEW OCR 实现车牌识别(实战篇—3)

不脱发的程序猿

OCR 机器视觉 图像处理 LabVIEW 车牌识别

呼叫医生云! Amazon HealthLake 正式推出

亚马逊云科技 (Amazon Web Services)

存储

Back-to-Basics: Two-Way String Matching

袁世超

启智社区开源项目推荐 | 面向智慧城市的计算机视觉算法基准测试 Benchmark for Smart City上线

OpenI启智社区

计算机视觉 开源项目

【网络安全】JAVA代码审计—— XXE外部实体注入

H

网络安全 代码审计

没有区块链,就没有元宇宙

CECBC

云原生下的指标与日志采集

尔达Erda

程序员 容器 云原生 监控 中间件

DevOps峰会 | 研发效能实践助力互联网行业项目管理“行之有效”

有道技术团队

DevOps

Amazon DynamoDB 在智能湖仓架构中的实践

亚马逊云科技 (Amazon Web Services)

存储

面向未来,我们来聊一聊什么是现代化数据架构

亚马逊云科技 (Amazon Web Services)

存储

Apache Atlas 数据血缘

亚马逊云科技 (Amazon Web Services)

存储

【JavaScript Weekly #399】JavaScript引擎基础(上):形态和内联缓存

道道里

JavaScript 前端

云效测试篇:测试用例&缺陷管理 | 云效快速入门

阿里云云效

阿里云 DevOps 云原生 云效 测试管理

Amazon Redshift 表设计优化 – 优化已有数据表中的列大小

亚马逊云科技 (Amazon Web Services)

存储

14 主流的开源监控系统介绍

穿过生命散发芬芳

1月月更 开源监控系统

【JavaScript Weekly #570】 新一代构建工具对比

道道里

前端 vite 打包 webpack babel

【JavaScript Weekly #399】JavaScript引擎基础(下):优化原型

道道里

JavaScript 前端

网络安全kali渗透学习 web渗透入门kali系统的安装和使用。

学神来啦

如何用建木CI导入导出MySQL数据

Jianmu

MySQL 数据库 持续集成 CI/CD

【高并发】要想学好并发编程,关键是要理解这三个核心问题

冰河

并发编程 多线程 高并发 协程 异步编程

区块链技术支撑元宇宙经济系统的有序运转

CECBC

Web3.0时代的保险业,真的可以实现去中心化吗?

CECBC

行为驱动开发与领域驱动设计相结合_语言 & 开发_Jan Stenberg_InfoQ精选文章