写点什么

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

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

评论

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

工具介绍 | 百度开源Server-Agent:高性能、高效率的任务调度执行引擎

百度开发者中心

开源

Java 读写锁 原来这么简单

Java架构师迁哥

滴滴Logi-KafkaManager开源之路:一站式Kafka集群指标监控与运维管控平台

滴滴云

kafka 运维 监控 滴滴Logi

Appium下的WDA使用个人开发者证书配置

行者AI

自动化测试

产品训练营--第三期作业(1)

曦语

产品训练营

数字货币写进多地“十四五”规划纲要草案 专家建议扩大数字人民币试点范围

CECBC

数字经济

硬核!我花5小时肝出这篇Redis缓存解决方案,带你起飞!

数据库 redis 缓存架构

企业项目迁移go-zero全攻略(二)

万俊峰Kevin

微服务 microservice Go 语言

Kubernetes生产环境最佳实践

xcbeyond

Kubernetes 容器 28天写作

还在为计算机网络协议烦恼?了解这一篇就够了

Java架构师迁哥

2021首次分享面试阿里P6心得:1000字超全面试题答案解析

比伯

Java 编程 程序员 架构 面试

Invalid bound statement (not found)

任广印

Java MyBatisPlus

幕后故事 | YRCloudFile助力顶级视效制作公司MORE VFX打造视觉盛宴

焱融科技

高性能 存储 焱融科技 3D渲染 影视制作

全球首例银行“大型机”下移背后

数据君

如何为多元化的产品场景选择完美的色彩组合?

百度Geek说

产品 设计

线程有哪些状态,彼此之间如何切换

武哥聊编程

Java 多线程 28天写作

怎么理解Kafka消费者与消费组之间的关系?

李尚智

Java 架构 消息队列 消息中间件

每日知识总结

country

我们,让9300万人办事少跑一趟

数据君

《王者荣耀》背后的数据秘密

数据君

【得物技术】无侵入式mock平台在得物的实践

得物技术

测试 数据 得物技术 Mock hulk

12.4G阿里巴巴面经公开:技术笔记+视频讲解+简历模板,绝了!

996小迁

Java 架构 面试 程序人生

为什么强烈推荐 Java 程序员使用 Google Guava 编程!

沉默王二

Java Guava

加速AI边云协同创新!KubeEdge社区建立Sedna子项目

华为云原生团队

人工智能 开源 边缘计算 边缘技术

Elasticsearch Bulk API 批量增删改查

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

区块链有望被主流接纳的四个场景

CECBC

区块链

2021最新Windows10环境下安装MacOS系统(黑苹果)亲测有效!!(VM安装黑苹果)

Z.

macos 黑苹果 windows vmware

认识Nacos注册中心

登风

nacos

5G机遇 | 如何解决在核心场景的高并发、超低延迟需求?

VoltDB

数据库 5G 通信 VoltDB

快速了解云原生架构

阿里巴巴云原生

架构 容器 微服务 云原生 k8s

区块链如何帮助联合国支持全球教育?

CECBC

区块链

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