行为驱动开发(Behaviour Driven-Development)与测试驱动开发(TDD)两者都强调敏捷迭代,BDD使用“用户故事”来描述需求,然后开发人员将这些故事带入具体应用,通过不断迭代添加入真正的业务本质,也就是说,在BDD中,领域模型是通过开发迭代过程不断取自于于用户故事,而一般人理解的DDD是指一个成熟的领域模型,而不是一个在不断发展中的领域模型。来自Stackoverflow的提问
How does Behaviour Driven Development (BDD) work with Domain Driven Design (DDD) - Stack Overflow试图解开其中的问题。
BDD的定义:Given在某种场景下 When发生了事件 Then导致了什么结果(简称Given, When, Then)。
(banq注:我曾经把四色原型总结为:某个角色对某个事情做了某个动作,导致了什么结果。这两种描述几乎相同,四色原型侧重动作活动,BDD侧重事件,事件和动作其实非常类似。)
在StackOverflow这篇回答中,首先肯定BDD并不是一次性产生成熟的领域模型,BDD是从三个角度来看待需求: 知道的the known, 能够知道的the knowable 和不知道的 the unknowable.
对于“知道的”,因为比较简单,大家都知道,就无需各种场景描述,比如谈到日志,大家都能明白日志是什么,怎么做日志。
对于“能够知道的”,BDD擅长于此,通过用户故事来表达,并且以Given, When, Then方式来表达,这实际是使用scenarios场景来表达领域模型(banq注:比较类似DCI分析)
对于“不知道的”,我们通过BDD这样敏捷迭代不断挖掘深入,能够不断发现深层次的领域模型,隐式模型显式化。(见复杂模型的循环化)
当我们结合BDD和DDD时,我们使用BDD来实现领域模型中和场景有关的那些部分。当然在一个大型项目中,如果我们已经有一些成熟大的领域模型,我们也可以使用BDD的Feature Injection,特征是提供了一种让用户能够使用程序系统提供能力的途径,一般这是由UI界面工程师来完成,所谓能力实际是一种服务,服务必须通过界面通过类似MVC方式来实现,这样用户操作界面才能实现我们提供给它的服务能力,当然这个界面可以是网页也可能是移动页面。
(banq注:我经常在一些网站网页上使用的按钮功能,转到其手机页面上就找不到了,比如新浪微博有那么多种客户端,但是更新都不是同步的,造成客户端使用体验完全不同,这实际没有重视Feature一种体现)