领域模型驱动设计(Domain Driven Design)入门概述
軟件開(kāi)發(fā)要干什么:
- 反映真實(shí)世界要自動(dòng)化的業(yè)務(wù)流程
- 解決現(xiàn)實(shí)問(wèn)題
領(lǐng)域Domain
- Domain特指軟件關(guān)注的領(lǐng)域
- 在不能充分了解業(yè)務(wù)領(lǐng)域的情況下是不可能做出一個(gè)好的軟件
?領(lǐng)域建模
領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)
}? 分層架構(gòu)
}? 實(shí)體
}? 值對(duì)象
}? 服務(wù)
}? 模塊
}? 聚合
}? 工廠
}? 資源庫(kù)
分層架構(gòu):
}? 將領(lǐng)域模型相關(guān)的代碼集中到一個(gè)層中,把它從用戶界面、應(yīng)用和基礎(chǔ)設(shè)施代碼中分隔開(kāi)來(lái)
}? 釋放領(lǐng)域?qū)ο蟮娘@示自己、保存自己、管理應(yīng)用任務(wù)等職責(zé),讓它專(zhuān)注于展現(xiàn)領(lǐng)域模型
}? 復(fù)雜的程序切分成層
}? 層中采用內(nèi)聚的設(shè)計(jì)
}? 層僅依賴于它底下的那層
?
實(shí)體entity:
有一類(lèi)對(duì)象擁有唯一標(biāo)識(shí)符
}? 能夠跨越系統(tǒng)的生命周期甚至能超越軟件系統(tǒng)的一系列的延續(xù)性和標(biāo)識(shí)符
}? 這樣的對(duì)象稱(chēng)為實(shí)體。
值對(duì)象-value Object
}? 對(duì)某個(gè)對(duì)象是什么不感興趣,只關(guān)心它擁有的屬性
}? 用來(lái)描述領(lǐng)域的特殊方面、且沒(méi)有標(biāo)識(shí)符的一個(gè)對(duì)象,叫做值對(duì)象
}? 能被簡(jiǎn)單的創(chuàng)建和丟棄,生命周期中不會(huì)被持久化
}? 值對(duì)象可以被共享,值對(duì)象應(yīng)該不可變
服務(wù)-service(比webservice更細(xì)粒度服務(wù)描述)
}? 領(lǐng)域中的一些動(dòng)詞,代表了領(lǐng)域中的一個(gè)重要的行為,卻不屬于任何對(duì)象
???????服務(wù)執(zhí)行的操作涉及一個(gè)領(lǐng)域概念,這個(gè)領(lǐng)域概念通常不屬于一個(gè)實(shí)體或者值對(duì)象
???????被執(zhí)行的操作涉及到領(lǐng)域中的其他的對(duì)象
???????操作是無(wú)狀態(tài)的
}? 服務(wù)對(duì)象不再擁有內(nèi)置的狀態(tài)
}? 服務(wù)對(duì)象擔(dān)當(dāng)重要的協(xié)調(diào)功能
}? 開(kāi)發(fā)通用語(yǔ)言時(shí),領(lǐng)域中的主要概念被引入到語(yǔ)言中,語(yǔ)言中的名詞很容易被映射成對(duì)象。
語(yǔ)言中對(duì)應(yīng)那些名詞的動(dòng)詞變成那些對(duì)象的行為。但是有些領(lǐng)域中的動(dòng)作,它們是一些動(dòng)詞,看上去卻不屬于任何對(duì)象。它們代表了領(lǐng)域中的一個(gè)重要的行為,所以不能忽略它們或者簡(jiǎn)單的把它們合并到某個(gè)實(shí)體或者值對(duì)象中。給一個(gè)對(duì)象增加這樣的行為會(huì)破壞這個(gè)對(duì)象,讓它看上去擁有了本該屬于它的功能。
模塊
}? 將相關(guān)領(lǐng)域模型提煉分類(lèi),分而治之
}? 將高關(guān)聯(lián)度的模型分組到一個(gè)模塊以提供盡可能大的內(nèi)聚(以能完整完成任務(wù)為準(zhǔn))
}? 分層是水平劃分
}? 模塊是垂直劃分(Domain內(nèi)部)
參考架構(gòu)概述
}? 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DomainDriven Design)有一個(gè)官方的sample工程,名為DDDSample
}? 官網(wǎng):http://dddsample.sourceforge.net/
}? 該工程給出了一種實(shí)踐領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的參考架構(gòu)
架構(gòu)概述
?
詳細(xì)架構(gòu)
?
架構(gòu)詳解:Interfaces-接口層
}? 該層包含與其他系統(tǒng)進(jìn)行交互的接口與通信設(shè)施,在多數(shù)應(yīng)用里
}? 可能提供包括WebServices、RMI或Rest等在內(nèi)的一種或多種通信接口
}? 該層主要由Facade、DTO和Assembler三類(lèi)組件構(gòu)成,三類(lèi)組件均是典型的J2EE模式
DTO
}? DTO- DataTransfer Object(數(shù)據(jù)傳輸對(duì)象),也常被稱(chēng)作VO-ValueObject(值對(duì)象)
}? DTO設(shè)計(jì)之初是為了將細(xì)粒度的領(lǐng)域?qū)ο蟀b為粗粒度的數(shù)據(jù)結(jié)構(gòu),減少網(wǎng)絡(luò)通信并簡(jiǎn)化調(diào)用接口
DTO 作用
}? 減少網(wǎng)絡(luò)流量
}? 簡(jiǎn)化遠(yuǎn)程對(duì)象和遠(yuǎn)程接口
}? 傳輸更多的數(shù)據(jù)減少遠(yuǎn)程調(diào)用次數(shù)
}? 避免將領(lǐng)域狀態(tài)跨層次傳遞
}? 由于同步和版本控制增加了復(fù)雜性
DTO 應(yīng)用時(shí)序圖
Assembler
}? DTO與領(lǐng)域?qū)ο笾g的相互轉(zhuǎn)換工作多由Assembler承擔(dān)
}? 因此Assembler幾乎總是同DTO一起出現(xiàn)。
Assembler 實(shí)現(xiàn)方案
Fa?ade
}? 實(shí)踐Facade的過(guò)程中最難把握的問(wèn)題就是Facade的粒度問(wèn)題。
}? 傳統(tǒng)的Service均以實(shí)體為單位進(jìn)行組織,而Facade應(yīng)該具有更粗粒度的組織依據(jù),較為合適的粒度依據(jù)有:
}? 一個(gè)高度內(nèi)聚的模塊一個(gè)Facade
}? 或者是一個(gè)“聚合”(特指領(lǐng)域驅(qū)動(dòng)設(shè)計(jì))一個(gè)Facade.
Facade 實(shí)現(xiàn)方案
Facade 應(yīng)用時(shí)序圖
Service
}? Service會(huì)與多種組件進(jìn)行交互
}? 這些組件包括:
???????其他的Service
???????領(lǐng)域?qū)ο?/p>
???????Repository
???????DAO
Service 應(yīng)用時(shí)序圖
Domain-領(lǐng)域?qū)?/p>
}? Domain層是整個(gè)系統(tǒng)的核心層,該層維護(hù)一個(gè)使用面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)的領(lǐng)域模型,幾乎全部的業(yè)務(wù)邏輯會(huì)在該層實(shí)現(xiàn)
}? Domain層包含:
???????Entity(實(shí)體)
???????ValueObject(值對(duì)象)
???????Domain Event(領(lǐng)域事件)
???????Repository(倉(cāng)儲(chǔ))等
Infrastructure-基礎(chǔ)設(shè)施層
}? 基礎(chǔ)設(shè)施層nfrastructure為Interfaces、Application和Domain三層提供支撐
}? 所有與具體平臺(tái)、框架相關(guān)的實(shí)現(xiàn)會(huì)在Infrastructure中提供,避免三層特別是Domain層摻雜進(jìn)這些實(shí)現(xiàn),從而“污染”領(lǐng)域模型
}? Infrastructure中最常見(jiàn)的一類(lèi)設(shè)施是對(duì)象持久化的具體實(shí)現(xiàn)
“傳統(tǒng)”架構(gòu)-貧血領(lǐng)域模型
DDD && SOA
}? DDD 領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)
}? SOA? 面向服務(wù)的架構(gòu)
http://blog.csdn.net/johnstrive/article/details/16805121
總結(jié)
以上是生活随笔為你收集整理的领域模型驱动设计(Domain Driven Design)入门概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 国家电网招聘有什么条件限制么?
- 下一篇: 软件设计过程经验谈 之 如何做好领域模型