行為驅動開發(BDD)如何與領域驅動設計(DDD)結合?

banq發表於2012-08-03
行為驅動開發(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一種體現)

相關文章