事件、契約設計與BDD

banq發表於2012-10-17

最近看到@gameboyLV一個討論中提出將事件劃分為巢狀事件,例如:

事件:客戶提款(非同步命令)

事件處理前:判斷是否有足夠的餘額(同步命令)

事件處理: 扣款(同步命令)

事件處理後:發簡訊提醒客戶。(非同步命令)

讓我聯想起契約設計Design by contact,又與BDD行為驅動開發中的Given-When-Then模板類似,發這篇文章試圖探究一下它們之間是否有必然的關係?

我曾經在契約設計中提出契約(合約)Contact和DDD中的聚合體同一個高度,不同點是前者側重行為之間的關係,而聚合體是一種結構關係,我以前也曾經認為事件是一種行為關係,涉及到兩個以上物件的行為是一種協調關係,可以用事件表達,而這種協調關係也是一種合約Contact,那麼是否可以認為事件是合約的另外一種俗稱呢?

在契約設計中,分為三種:前置條件, 後置條件和不變性。

前置條件是表達合約(事件)發生的前提條件,比如扣款這個事件或合約發生的前提是必須有足夠的餘額,那麼前置條件是:是否有足夠餘額。

後置條件表達合約(事件)發生後的情況,比如扣款事件後,通知客戶。

不變性是表示在事件發生後的一種狀態,我們可以用值物件來表達狀態的這種不變性。

當我們使用@gameboyLV 的巢狀事件用語來表達時,發現幾乎是一致,而且比較通俗易懂:

事件處理前:判斷是否有足夠的餘額(同步命令)

事件處理: 扣款(同步命令)

事件處理後:發簡訊提醒客戶。(非同步命令)

事件後的狀態:聚合體內物件發生了改變,並且自此以後一直不變。

對於契約設計Design by contact表達還有使用義務和權利這樣表達方式,這種表達方式更符合類似現實世界中合同的表達方式,甲乙雙方簽訂合同,合同中規定甲乙雙方的義務付出以及得到的利益分配。

其實這種義務付出是一種前置條件,得到的利益或權利是一種後置條件。

再看看契約細化定義:

1.一個契約負責管理多個實體之間的互動

2.一個契約包含權力(可以做什麼)和義務(必須先做什麼)

3.一個契約會辨識到在一個場景下實體之間互動的結果狀態

我們如果轉化為事件用語,可能會更明白簡單:

1.一個事件代表多個實體之間的互動。

2.一個事件包括事件發生前後兩個階段。

3.一個事件發生後會改變實體狀態。

下面一節談談,他們和BDD的關係。

[該貼被banq於2012-10-17 10:05修改過]

[該貼被admin於2012-10-17 10:53修改過]

[該貼被admin於2013-01-08 09:44修改過]

[該貼被admin於2013-01-08 09:44修改過]

相關文章