写点什么

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

  • 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:312169

评论

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

Linux进程管理

A-刘晨阳

Linux 运维 进程 11月月更

类和动态内存分配

Maybe_fl

六张图详解LinkedList 源码解析

Jeremy Lai

源码 linkedlist

中国APM市场份额第一!博睿数据实力领跑

博睿数据

可观测性 IDC 博睿数据 ONE平台 智能运维AIOps

服务器的正向代理与反向代理

我是一个茶壶

服务器 正向代理与反向代理 11月月更

G1 垃圾收集器深入剖析(图文超详解)

mikechen的互联网架构

Java 架构 面试 G1垃圾回收器 11月月更

量化合约对冲交易机器人app系统开发案例

开发微hkkf5566

盒子模型-css中的老生常谈

肥晨

11月月更 盒子模型 css盒子模型 css面试题

通过 Python FastAPI 开发一个快速的 Web API 项目

宇宙之一粟

Python Web框架 FastApi 11月月更

OpenMLDB 线上引擎资源需求预估模型,助你快速预估资源消耗

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

Linux磁盘管理

A-刘晨阳

Linux 运维 磁盘 磁盘分区 11月月更

20款免费项目管理软件大盘点!你用过几款?

优秀

项目管理软件

2022年10月中国汽车智能网联月度观察

易观分析

汽车 智能网联

干货收藏|Clickhouse 常见问题及解决方案汇总

云智慧AIOps社区

MySQL 数据库 Clickhouse Data 故障处理

Linux三剑客grep、sed、awk以及正则表达式

A-刘晨阳

Linux 运维 11月月更 三剑客

OpenMLDB BUG 悬赏令

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

软件测试面试真题 | 什么是PO设计模式?

测试人

软件测试 自动化测试 PO 测试开发 UI自动化测试

项目git-flow版本控制优化

Geek_pwdeic

git gitlab git-flow

活动预告 | 2022 SACC 中国系统架构师大会

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

Go 容器之队列的几种实现方式

宇宙之一粟

队列 数据结构与算法 Go 语言 11月月更

性能优化-懒加载(图片 组件 路由)

肥晨

懒加载 11月月更 图片懒加载 路由懒加载 组件懒加载

前端性能优化常问面试题-防抖节流

肥晨

防抖 节流 防抖节流 前端面试题 11月月更

TOGAF企业架构框架-6架构治理和组织落地

Marvin Ma

TOGAF 架构治理 企业架构框架

硬核技术助力提效,腾讯广告持续探索产学融合新航图

科技热闻

ArrayList源码解析

Jeremy Lai

源码 ArrayList

Java NIO关键概念之Buffer

老农小江

Java 源码解读 java nio

OpenMLDB 新手宝典 开发者上手必读

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

企业如何正确使用低代码转型升级

力软低代码开发平台

Sovit3D数字孪生智慧机场三维可视化云平台

数据可视化平台

物联网 智慧机场 机场三维可视化 数字孪生机场 机场数字化转型

MYSQL大法之慢SQL--COMMIT

小书童

MySQL 数据库 11月月更

一文读懂加密资产板块的盈利潜力与投资机会

鳄鱼视界

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