事件、契約設計與BDD
最近看到@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修改過]
相關文章
- TipsWorks與《帕斯卡契約》:從“不靠譜”到100萬
- Constract 契約自定義
- 事件驅動系統設計之將事件檢索與事件處理解耦事件解耦
- 事件匯流排的設計與實現事件
- 籤個拯救世界的契約,敢嗎?全新放置手遊《加德爾契約》開啟預約啦
- TipsWorks丁成甲:《帕斯卡契約》的創作與美術表現
- Laravel 原始碼閱讀指南 -- Contracts 契約Laravel原始碼
- 《無畏契約》的這一個月
- 《無畏契約》預約啟動!三重預約好禮等你來!
- 事件驅動的微服務-事件驅動設計事件微服務
- 《帕斯卡契約》今日在App Store正式發售APP
- 事件驅動架構設計事件架構
- 事件驅動及其設計模式事件設計模式
- 《十二神兵器》遊戲首曝 與命運中的使徒簽訂契約吧!遊戲
- 區塊鏈將構建完美的契約世界區塊鏈
- Laravel 原始碼筆記 框架契約類之 ContainerContractLaravel原始碼筆記框架AI
- Laravel 原始碼筆記 框架契約類之 ApplicationContractLaravel原始碼筆記框架APP
- SOLIDWORKS引數化設計工具講座預約 免費參與Solid
- 領域驅動設計(DDD)實踐之路(二):事件驅動與CQRS事件
- 探索 Android BDD 開發方法Android
- 透過 Cucumber 學習 BDD
- Dubbo中的統一契約是如何實現的?
- 如何將斐波那契數列應用到排版設計中
- 探索Redis設計與實現10:Redis的事件驅動模型與命令執行過程Redis事件模型
- 簡約設計,以數圖量
- 事件流與事件溯源事件
- 微服務測試之介面測試和契約測試微服務
- 從契約演進看區塊鏈的變革性區塊鏈
- PHP 與斐波那契數列PHP
- 演算法設計與分析:求兩個自然數的最大公約數演算法
- 簡約至上(互動設計四策略)
- 非同步程式設計:基於事件的非同步程式設計模式(EAP)非同步程式設計事件設計模式
- HKD交易所/永續合約/秒合約系統設計開發技術/程式設計示例程式設計
- Laravel最佳實踐–事件驅動程式設計Laravel事件程式設計
- JavaScript的BOM程式設計,事件-第4章JavaScript程式設計事件
- Laravel 最佳實踐 -- 事件驅動程式設計Laravel事件程式設計
- Laravel最佳實踐 -- 事件驅動程式設計Laravel事件程式設計
- Java-GUI程式設計之事件處理JavaGUI程式設計事件
- 拯救祭天的程式設計師——事件溯源模式程式設計師事件模式