事件、契約設計與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修改過]
相關文章
- WCF學習(四):資料契約的事件事件
- 事件與介面程式設計事件程式設計
- Constract 契約自定義
- 契約測試Pact實踐
- 行為驅動開發(BDD)如何與領域驅動設計(DDD)結合?
- TipsWorks與《帕斯卡契約》:從“不靠譜”到100萬
- 簽約獎金:IT世界的賣身契
- 事件驅動系統設計之將事件檢索與事件處理解耦事件解耦
- 事件匯流排的設計與實現事件
- 事件設計概述事件
- Programming WCF Services:資料契約版本控制
- Redis 設計與實現 (四)--事件、客戶端Redis事件客戶端
- C#程式設計之委託與事件(一)C#程式設計事件
- C#程式設計之委託與事件(二)C#程式設計事件
- 《十二神兵器》遊戲首曝 與命運中的使徒簽訂契約吧!遊戲
- restful Api 風格契約設計器:Swagger-editor和swagger-ui的應用RESTAPISwaggerUI
- WCF技術剖析之十八:訊息契約(Message Contract)和基於訊息契約的序列化
- 區塊鏈將構建完美的契約世界區塊鏈
- Laravel 原始碼閱讀指南 -- Contracts 契約Laravel原始碼
- WCF學習(三):資料契約序列化
- TipsWorks丁成甲:《帕斯卡契約》的創作與美術表現
- AndroidEventBus (事件匯流排) 的設計與實現AndroidIDEdev事件
- c#delegate委託與事件及observer設計模式C#事件Server設計模式
- bdd logo位置Go
- 《帕斯卡契約》今日在App Store正式發售APP
- Dubbo中的統一契約是如何實現的?
- Swagger - 前後端分離後的契約Swagger後端
- 簡約之美:如何實現簡約設計
- 事件驅動程式設計事件程式設計
- 高屋建瓴:梳理程式設計約定程式設計
- python BDD&TDDPython
- .NET應用架構設計—面向查詢服務的引數化查詢設計(分解業務點,單獨配置各自的資料查詢契約)應用架構
- 微服務測試之介面測試和契約測試微服務
- 從契約演進看區塊鏈的變革性區塊鏈
- 事件驅動的微服務-事件驅動設計事件微服務
- 如何將斐波那契數列應用到排版設計中
- 事件驅動及其設計模式事件設計模式
- 事件驅動架構設計事件架構