|
好久沒有寫文章了,最近比較忙,另一方面也是感覺自己在這方面沒什么實(shí)質(zhì)性的突破。但是今天終于感覺自己小有所成,有些可以值得和大家分享的東西,并且完成了兩個可以表達(dá)自己想法的Demo。因此,趁現(xiàn)在有點(diǎn)時間,是寫文章和大家分享的時候了。
首先給出這兩個Demo的源代碼的壓縮包的下載地址,因?yàn)橹坝胁┯颜f他沒有裝VS2010而沒辦法運(yùn)行Demo,所以這次我分別用VS2008和VS2010實(shí)現(xiàn)了兩個版本。
http://files.cnblogs.com/NETfocus/DCIBasedDDD.rar
下面先分享一下我最近研究的一些知識及我對這些知識的自我感悟,然后再結(jié)合Demo中的示例講解如何將這些感悟應(yīng)用到實(shí)際。
一、理論知識:
我最近一直在學(xué)習(xí)下面這些東西:
- 面向?qū)ο蠓治雠c設(shè)計(jì),即Object Oriented Analysis and Design(OOA/D)
- 領(lǐng)域驅(qū)動設(shè)計(jì),即Domain Driven Design(DDD)
- 四色原型:MI原型、Role原型、PPT原型、Description原型
- DCI架構(gòu):Data Context Interaction
- CQRS架構(gòu): 命令查詢職責(zé)分離原則,即Command Query Responsibility Segregation
通過學(xué)習(xí)以上這些知識,讓我對面向?qū)ο蟮姆治觥⒃O(shè)計(jì)、實(shí)現(xiàn)有了一些新的認(rèn)識。
1. 碰到一個業(yè)務(wù)系統(tǒng),我們該如何分析業(yè)務(wù),分析需求,并最后得到一個只包含業(yè)務(wù)概念的模型?答案是通過四色原型進(jìn)行業(yè)務(wù)建模。四色原型的中心思想是:一個什么什么樣的人或組織或物品或地點(diǎn)以某種角色在某個時刻或某段時間內(nèi)參與某個活動。 其中“什么什么樣的”就是DESC,“人或組織或物品或地點(diǎn)”就是PPT,“角色”就是Role,而”某個時刻或某段時間內(nèi)的某個活動"就是MI。更具體的說明請參看我之前整理的一篇文章:四色原型的學(xué)習(xí)心得分享
2. 業(yè)務(wù)模型建好了,該如何通過面向?qū)ο蟮姆治雠c設(shè)計(jì)方法來進(jìn)行對象建模呢? DDD和DCI思想可以幫助我們。首先,DDD能夠指導(dǎo)我們建立一個靜態(tài)的領(lǐng)域模型,該領(lǐng)域模型能夠清楚的告訴我們建立出來的對象“是什么”,但是DDD卻不能很自然的解決“做什么”的問題。大家都知道DDD在對象設(shè)計(jì)的部分實(shí)際上是一種充血模型的方式,它強(qiáng)調(diào)對象不僅有屬性還會有行為,如果行為是跨多個領(lǐng)域?qū)ο蟮模瑒t在DDD中用領(lǐng)域服務(wù)解決。但是DDD卻沒有完整的考慮對象與對象之間的交互如何完成,雖然它通過領(lǐng)域服務(wù)的方式協(xié)調(diào)多個對象之間進(jìn)行交互或者在應(yīng)用層協(xié)調(diào)多個對象進(jìn)行交互。但是在DDD中,對象往往會擁有很多不該擁有的屬性或行為。在我學(xué)習(xí)了DCI架構(gòu)之后,我認(rèn)識到了DDD的很多不足。
以下是DCI的核心思想:
- 對象扮演某個角色進(jìn)入場景,然后在場景中進(jìn)行交互,場景的參與者就是對象所扮演的角色;
- 一個對象可以扮演多個角色,一個角色也可以被多個對象扮演;
- 對象的屬性和行為分為:A. 核心屬性和行為,這些屬性或行為是不依賴于任何場景的;B. 場景屬性和行為,對象通過扮演某個角色進(jìn)入某個特定場景時擁有的屬性或行為,一旦對象離開了這個場景,不再扮演了這個角色后,這些場景屬性或行為也就不再屬于該對象了;比如人有核心的屬性和行為:身高、體重、吃飯、睡覺,然后當(dāng)人扮演教師的角色在教室里上課時,他則具有上課的行為,一旦回到家里,就又變成了一個普通的人;比如一個物品,在生產(chǎn)時叫產(chǎn)品,在銷售時叫商品,壞了的時候叫廢品,它在不同階段扮演不同的角色所具有的屬性是不一樣的;
- 場景的生命周期,場景是一個時間與空間的結(jié)合,可以理解為某個活動;一旦活動結(jié)束,則場景也就消失;
- DCI中的D可以理解為DDD中的領(lǐng)域模型;場景中交互的是角色,而不是領(lǐng)域?qū)嶓w。場景屬于DSL的思考層面,更接近于需求和用例。而領(lǐng)域也是偉大的出現(xiàn),但是不能為了領(lǐng)域而領(lǐng)域,為什么呢?因?yàn)閳鼍笆谴蟾纾美谴蟾纭nI(lǐng)域的存在是為了控制固定概念的部分,這樣在某種成度上控制了一定的復(fù)雜性和提高了可控性,而DCI則解決了可變性和需求的問題。從某種意義上來說,“領(lǐng)域?qū)樱ㄔ贒CI中可能不會太凸顯領(lǐng)域?qū)樱蝗鏞LD, DDD那么凸顯)” 是為了DCI架構(gòu)服務(wù)的。
- 角色是人類的主觀意識,用于對象分析和設(shè)計(jì)階段,但是在運(yùn)行階段,角色和對象實(shí)體是一體的,軟件運(yùn)行過程中只有對象,只是這些對象在參與某個活動時扮演了某個角色而已。
3. 領(lǐng)域驅(qū)動設(shè)計(jì)中對象設(shè)計(jì)部分的一些要點(diǎn):
- DDD的在對象設(shè)計(jì)方面的最大貢獻(xiàn)之處在于其實(shí)體、值對象,以及聚合邊界的三個部分,通過這三個概念,我們可以將對象的靜態(tài)結(jié)構(gòu)設(shè)計(jì)好。
it知識庫:分享一些如何分析和設(shè)計(jì)具有動態(tài)行為的領(lǐng)域模型的經(jīng)驗(yàn),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。