




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、從去年 10月份開始,學(xué)了幾個(gè)月的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain Driven Design,簡(jiǎn)稱 DDD 。 主要是學(xué)習(xí)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)之父 Eric Evans的名著: Domain-driven design:領(lǐng)域驅(qū)動(dòng)設(shè) 計(jì) :軟件核心復(fù)雜性應(yīng)對(duì)之道,以及另外一本 Martin Flower的企業(yè)應(yīng)用架構(gòu)模式, 學(xué)習(xí)到了不少關(guān)于如何組織業(yè)務(wù)邏輯方面的知識(shí)。 另外, 在這個(gè)過程中也接觸到了一些開源 的架構(gòu)和一些很好的思想。如:命令查詢職責(zé)分離(Command Query Responsibility Segregation ,簡(jiǎn)稱 CQRS ,事件驅(qū)動(dòng)架構(gòu)(Event Driven Archite
2、cture,簡(jiǎn)稱 EDA ,以 及四色原型和 DCI 架構(gòu),等等。前面這些知識(shí)對(duì)我來說是非常寶貴的財(cái)富,可以說我能進(jìn) 淘寶,很大程度上也是因?yàn)槲覍W(xué)習(xí)了前面這些知識(shí)的原因。在介紹我設(shè)計(jì)的框架之前, 我想先探討一下以往我們都是如何思考設(shè)計(jì) OO 的系統(tǒng)的。 大家 都知道, 真正的對(duì)象應(yīng)該是不僅有屬性, 而且有行為的。 并且大家也有另外一個(gè)共識(shí), 那就 是為了完成某個(gè)任務(wù), 各個(gè)對(duì)象應(yīng)該會(huì)相互協(xié)作共同完成這個(gè)任務(wù)。 之前我們?cè)谠O(shè)計(jì)一個(gè)系 統(tǒng)時(shí), 往往會(huì)先設(shè)計(jì)好各個(gè)對(duì)象, 明確他們的職責(zé), 在這個(gè)過程中, 還會(huì)考慮如何建立對(duì)象 之間的關(guān)系(依賴、關(guān)聯(lián)、聚合、組合,在這些關(guān)系的影響下,我們會(huì)認(rèn)為對(duì)象之間
3、應(yīng)該 有主從關(guān)系、 依賴關(guān)系, 等等。 然后我們所做的這些設(shè)計(jì)最終的目的是為了能讓對(duì)象之間能 夠通過相互協(xié)作來共同完成某個(gè)任務(wù)。這種方式最核心的設(shè)計(jì)特色是,我們會(huì)通過 ” 對(duì)象引 用 “ 的方式來實(shí)現(xiàn)對(duì)象之間的各種關(guān)系。這種方式很好, 并且我們也已經(jīng)完全習(xí)慣了從對(duì)象 的職責(zé)以及它們之間的關(guān)系的角度去設(shè)計(jì)對(duì)象 。但這僅僅體現(xiàn)了一個(gè)哲學(xué)思想,那就是 “ 物 體之間通過直接作用完成某個(gè)任務(wù) ” 。我覺得任何兩個(gè)對(duì)象之間的交互有兩種形式:1 直接作用 ,即對(duì)象 A 引用一個(gè)對(duì)象 B ,然 后 A 調(diào)用 B 提供的某個(gè)方法,以此來完成兩個(gè)對(duì)象之間的協(xié)作; 2 間接作用 ,對(duì)象 A 不 引用對(duì)象 B ,僅
4、僅包含了一個(gè)對(duì)象 B 的唯一標(biāo)識(shí),當(dāng)它要和對(duì)象 B 協(xié)作時(shí),會(huì)發(fā)送一個(gè)消 息給對(duì)象 B ,然后對(duì)象 B 收到該消息后做出響應(yīng),從而實(shí)現(xiàn)兩個(gè)對(duì)象之間的協(xié)作;不管是 哪種方式, 他們最終的效果是一致的, 都可以實(shí)現(xiàn)兩個(gè)對(duì)象之間的交互并最終完成某個(gè)任務(wù)。 那么這兩種方式各自的優(yōu)缺點(diǎn)在哪里呢?我個(gè)人覺得對(duì)于對(duì)象引用的方式,其好處就是簡(jiǎn) 單、 直觀、 容易理解, 很符合我們平時(shí)的設(shè)計(jì)習(xí)慣。 但壞處是什么呢?我個(gè)人覺得這種方式 是形成對(duì)象耦合的根本原因,對(duì)象 A 對(duì)對(duì)象 B 存在了緊密的耦合,也許你會(huì)說,在間接作 用的方式下,對(duì)象 A 不也會(huì)保留一個(gè)對(duì)象 B 的唯一標(biāo)識(shí)嗎?沒錯(cuò),但要知道保留引用和保 留唯
5、一標(biāo)識(shí)的耦合強(qiáng)度是不一樣的。 前者的耦合強(qiáng)度更大, 因?yàn)槌钟辛硗庖粋€(gè)對(duì)象的引用就 意味著可以直接操作該對(duì)象, 而僅僅持有另外一個(gè)對(duì)象的唯一標(biāo)識(shí) 則不行, 必須先根據(jù)該唯一標(biāo)識(shí)獲取另外一個(gè)對(duì)象, 然后再操作它。 而對(duì)于發(fā)送接受消息的 方式,它的好處和壞處是什么呢?其實(shí)正好和前者相反,即不簡(jiǎn)單、不直觀、不容易理解, 容易讓大家覺得有過度設(shè)計(jì)的嫌疑,而好處則是能夠?qū)蓚€(gè)對(duì)象之間的耦合度降到最低。好了,有了前面這些介紹之后,我想可以引出我所設(shè)計(jì)的這個(gè)框架的設(shè)計(jì)思想了。既然在對(duì)象直接作用的思路下設(shè)計(jì)軟件的各種原則、模式,以及各種最佳實(shí)踐已經(jīng)很多了, 如 SOLID 五大設(shè)計(jì)原則、 GRASP 九大 OO
6、 設(shè)計(jì)原則、 Gof 的 23種設(shè)計(jì)模式、各種更大的 模式如 MVC 、 MVP 、 MVVM ,等等。所以,我也就不用去費(fèi)功夫去研究了,直接利用前輩 的研究成果就行了。 但我發(fā)現(xiàn)在對(duì)象間接作用的思路下設(shè)計(jì)軟件的各種原則或框架似乎還不 夠多。當(dāng)然也有很多大家都很熟悉了,比如 Observer 設(shè)計(jì)模式,按照這個(gè)設(shè)計(jì)模式設(shè)計(jì)出來的 .NET 框架中的事件和委托的機(jī)制,還有比如一些第三方的開源框架如事件總線,事件 驅(qū)動(dòng)架構(gòu),等等。思考到這里,再結(jié)合自己最近不斷學(xué)習(xí) DDD 的背景下,我腦子里有了一個(gè)奇特的想法!那 就是:是否可以搞一個(gè) 事件驅(qū)動(dòng)的領(lǐng)域模型實(shí)現(xiàn)框架 從而可以讓我們從消息和行為的角度去
7、 設(shè)計(jì)對(duì)象呢?有了這個(gè)框架,我們可以:1通過消息實(shí)現(xiàn)領(lǐng)域模型中各個(gè)領(lǐng)域?qū)ο笾g的交互,或者說 是通信及協(xié)作; 2通過消息實(shí)現(xiàn)領(lǐng)域模型和外界的交互,如領(lǐng)域模型的使用者和領(lǐng)域模型 之間的交互, 一般這個(gè)使用者是應(yīng)用層; 還有比如領(lǐng)域模型和數(shù)據(jù)持久層的交互。 帶著這個(gè) 問題, 我試圖去尋找目前已有的框架來實(shí)現(xiàn)我的想法, 但遺憾的是, 我找不到, 所以只能自 己開發(fā)。 想到這里, 我其實(shí)挺擔(dān)心的, 因?yàn)槲液苡锌赡芤呀?jīng)走火入魔了, 因?yàn)槲乙叩脑O(shè)計(jì) 道路很可能是個(gè)死胡同或不歸路, 或者說不是一條真正能很好的解決軟件設(shè)計(jì)的路, 不然我 怎么會(huì)找不到這樣的框架呢?但不管怎樣, 還是先試試再說吧! 反正我的大
8、腦放在那里不用 也是浪費(fèi)。就這樣,帶著這樣的目標(biāo)和思路,我開始一步步設(shè)計(jì)我的框架了。經(jīng)過了三個(gè)月的設(shè)計(jì)、編碼、測(cè)試、分享、討論、重構(gòu)的循環(huán)過程。到目前為止,總算初步 實(shí)現(xiàn)了自己當(dāng)初的目標(biāo), 現(xiàn)在唯一差的就是在真正的實(shí)際項(xiàng)目中使用了。 但幸好已經(jīng)寫了兩 個(gè)不同層次的 Demo 用來驗(yàn)證我的框架了。該 Demo 包含了框架的源代碼和 Demo 文件,基于 VS2010開發(fā),因?yàn)樾枰玫?.NET4.0中的一些特性, 如逆變和協(xié)變。 源代碼打開后, EventBasedDDDExample.PresentationLayer 是啟動(dòng)項(xiàng)目,直接 F5就可以運(yùn)行。 該 Demo 為了重點(diǎn)突出領(lǐng)域模型的設(shè)
9、計(jì),特意采用內(nèi)存 作為數(shù)據(jù)持久層,去掉了應(yīng)用層,并且用控制臺(tái)應(yīng)用程序作為 UI 層,這樣就方便大家運(yùn)行 Demo 。該項(xiàng)目包含了四個(gè)演示的例子,前面兩個(gè)例子演示了如何利用我的框架實(shí)現(xiàn)特定的 業(yè)務(wù)場(chǎng)景(一個(gè)是銀行轉(zhuǎn)賬的例子,另一個(gè)是論壇中發(fā)帖發(fā)回復(fù)刪除回復(fù)的例子。下面介紹一下我的框架的設(shè)計(jì)思想:領(lǐng)域模型的組成元素:領(lǐng)域服務(wù)(Domain Service +領(lǐng)域?qū)ο?Domain Object +領(lǐng)域事 件(Domain Event +中央事件處理器(Event Processer。1. 領(lǐng)域服務(wù):這個(gè)元素和 Evans 提到的領(lǐng)域服務(wù)一致,主要目的也是用來完成單個(gè)領(lǐng) 域?qū)ο蟛荒芡瓿傻穆氊?zé),如銀行
10、轉(zhuǎn)賬操作;2. 領(lǐng)域?qū)ο?這個(gè)元素和 Evans 提到的 Entity 很類似, 也有一個(gè)唯一標(biāo)識(shí), 但和 Evans 中的概念也有不同的地方。 比如 Evans 中的 Entity 為了保持領(lǐng)域模型的完整性, 有 聚合的概念, 即 Aggregate 。 另外還有值對(duì)象的概念, 即 Value Object。 但在我的設(shè) 計(jì)中,領(lǐng)域模型中的所有的對(duì)象都是平等的,沒有任何聚合或關(guān)聯(lián)的概念,也沒有 值對(duì)象的概念。所有的領(lǐng)域?qū)ο蠖纪ㄟ^事件來進(jìn)行交互協(xié)作,從而達(dá)到完成各種任 務(wù)的目的。3. 領(lǐng)域事件:這個(gè)元素在整個(gè)領(lǐng)域模型中最重要,就好比是人體的血液或神經(jīng)。它是 領(lǐng)域模型內(nèi)部各個(gè)領(lǐng)域?qū)ο笾g通信以及
11、領(lǐng)域模型和外部通信時(shí)傳遞的信息的載 體。通過領(lǐng)域事件,我們可以 “ 串 ” 連任何兩個(gè)領(lǐng)域?qū)ο?從而達(dá)到讓他們相互協(xié)作 的目的。所謂的串聯(lián)就是,一個(gè)對(duì)象發(fā)出消息,另外一個(gè)對(duì)象接收消息并做出正確 響應(yīng)。值得一提的是,我這里提到的事件不僅僅是通知?jiǎng)e人發(fā)生了什么,而是泛指 所有可能的通信情況。比如告訴別人我要什么(我想干什么,告訴別人我將要做 什么,等等。也就是說,事件有可能帶有一定的目的性,即有可能會(huì)指定應(yīng)該由哪 個(gè)對(duì)象去響應(yīng)該事件。也許在你看來這已經(jīng)不是標(biāo)準(zhǔn)的事件了,因?yàn)闃?biāo)準(zhǔn)的事件應(yīng) 該是不可能知道會(huì)由哪些人回去響應(yīng)該事件的。沒錯(cuò),它就是一個(gè)不標(biāo)準(zhǔn)的事件。 我前面已經(jīng)提到了,我這里的事件指對(duì)象之
12、間通信的載體。而通信的情況是非常多 的,肯定不只局限于告訴別人我發(fā)生了什么,還有非常多其他的情況。最后還有一 點(diǎn)需要特別指出的是, 事件發(fā)出去并響應(yīng)后, 有可能會(huì)有響應(yīng)結(jié)果。 關(guān)于這個(gè)問題, 一般有兩個(gè)實(shí)現(xiàn)方式:利用事件的回調(diào)函數(shù)實(shí)現(xiàn);讓事件響應(yīng)函數(shù)提供返回值,然 后在事件完全響應(yīng)完成后,從事件對(duì)象中取出可能的返回值。我認(rèn)為這兩種方式都 可以,我的框架采用的是后者。4. 中央事件處理器:這個(gè)元素只做一件事情,那就是處理某個(gè)傳進(jìn)來的事件。怎么處 理?就是根據(jù)當(dāng)前事件獲取所有可能的響應(yīng)者,然后調(diào)用每個(gè)響應(yīng)者的響應(yīng)函數(shù)執(zhí) 行每個(gè)響應(yīng)。另外, 領(lǐng)域模型與外界如何交互呢?還是通過上面所提到的事件, 當(dāng)外
13、界需要領(lǐng)域模型做什 么事情時(shí), 就發(fā)送一個(gè)在領(lǐng)域模型中已經(jīng)定義好的事件, 然后領(lǐng)域模型或其他人 (比如持久 層 就會(huì)響應(yīng)該事件了。 當(dāng)領(lǐng)域模型發(fā)生了什么或想要外界提供什么數(shù)據(jù)時(shí), 也是通過發(fā)送 事件, 然后外界就會(huì)響應(yīng), 從而為領(lǐng)域模型提供必要的支持, 如持久化支持。 通過上面的分 析, 似乎可以看出我們已經(jīng)找到銀彈了, 即找到了一種單一的模式可以用來解決所有的對(duì)象 交互與協(xié)作的問題了?應(yīng)該不是這樣, 但我自己沒發(fā)現(xiàn)不知道這種設(shè)計(jì)的問題出在哪里, 所 以非常期望大家能多給我些意見。 還是那句話, 我希望我們每個(gè)中國(guó)人都是一個(gè)不盲目相信 權(quán)威并敢于懷疑權(quán)威并能積極去思考和將自己的思考轉(zhuǎn)化為生產(chǎn)力的人, 而不只是一個(gè)僅僅 會(huì)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 移動(dòng)互聯(lián)網(wǎng)時(shí)代的技術(shù)變革試題及答案
- 探秘軟件設(shè)計(jì)師考試試題及答案攻略
- 統(tǒng)計(jì)學(xué)的應(yīng)用實(shí)例研究試題及答案
- 投資決策風(fēng)險(xiǎn)題及答案
- 網(wǎng)絡(luò)管理與用戶體驗(yàn)試題及答案
- 軟件設(shè)計(jì)師考試反饋與調(diào)整試題及答案
- 法學(xué)概論學(xué)生交流平臺(tái)搭建試題及答案
- 信息系統(tǒng)架構(gòu)的優(yōu)化與合理化建議試題及答案
- 行政管理試題設(shè)計(jì)與答案分析
- 2025年軟考設(shè)計(jì)師的核心試題及答案
- 數(shù)據(jù)分析師歷年考試真題試題庫(kù)(含答案)
- 住宅小區(qū)園林景觀綠化工程施工組織設(shè)計(jì)方案
- 專題16-家庭與婚姻-2023年高考政治復(fù)習(xí)課件(新教材新高考)
- 人教版八年級(jí)下冊(cè)歷史教案全冊(cè)
- 2024年北京普通高中學(xué)業(yè)水平等級(jí)性考試化學(xué)試題及答案
- 住家護(hù)工聘用合同協(xié)議書
- 平面向量的基本定理(說課)
- 人教版PEP英語3-6年級(jí)全部單詞默寫表格以及背誦版本
- 《一起長(zhǎng)大的玩具》整本書閱讀(教學(xué)設(shè)計(jì))統(tǒng)編版語文二年級(jí)下冊(cè)
- 2024公需科目:數(shù)字經(jīng)濟(jì)與創(chuàng)新驅(qū)動(dòng)發(fā)展題庫(kù)
- 汽車租賃價(jià)格動(dòng)態(tài)調(diào)整策略研究
評(píng)論
0/150
提交評(píng)論