为何要领域驱动设计?
前言
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)最近貌似開(kāi)始火起來(lái)了,越來(lái)越多的人開(kāi)始認(rèn)識(shí)到領(lǐng)域設(shè)計(jì)的重要性,從我做過(guò)的項(xiàng)目來(lái)看,似乎歐洲已經(jīng)有很多的公司開(kāi)始實(shí)施領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)了,我看領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)也有些時(shí)間了,但是網(wǎng)上不管是文章還是代碼,都顯得太過(guò)“高大上”,一談?lì)I(lǐng)域驅(qū)動(dòng)設(shè)計(jì),一大堆的概念一股腦的給你上上來(lái),搞的有點(diǎn)暈頭轉(zhuǎn)向,而我想在一些中小項(xiàng)目實(shí)施領(lǐng)域驅(qū)動(dòng)也遇到了不小的障礙,大家對(duì)很多東西都處于一種恐懼的狀態(tài),而且在正真開(kāi)始實(shí)施時(shí),也遇到一些疑問(wèn),所以也想和大家交流學(xué)習(xí),因此開(kāi)始在此寫(xiě)寫(xiě)對(duì)領(lǐng)域驅(qū)動(dòng)的理解,后面會(huì)有一些輕量的演進(jìn)代碼。
為何要領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)?
簡(jiǎn)化數(shù)據(jù)存儲(chǔ)
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)有很多原因,談到我為啥要在公司推行領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),說(shuō)起來(lái)還是很好玩的,因?yàn)樵瓉?lái)基于數(shù)據(jù)驅(qū)動(dòng)的開(kāi)發(fā)方式,也就是傳統(tǒng)的多層開(kāi)發(fā)架構(gòu),大家定義了一堆DAL來(lái)操作數(shù)據(jù), 在.Net大家一般有兩種使用方式,一種是用ORM像Entity Framework, 另一種想使用Dapper這樣輕量級(jí)的Mapping工具,這些都要把關(guān)系型數(shù)據(jù)轉(zhuǎn)換為對(duì)象。結(jié)果導(dǎo)致以下幾種結(jié)果。
- 沒(méi)有正確的使用ORM, 導(dǎo)致數(shù)據(jù)加載過(guò)多,導(dǎo)致系統(tǒng)性能很差。
- 為了解決性能問(wèn)題,就不加載一些導(dǎo)航屬性,但是卻把DB Entity返回上層,這樣對(duì)象的一些屬性為空,上層使用這個(gè)數(shù)據(jù)時(shí)根本不知道什么時(shí)間這個(gè)屬性是有值的,這個(gè)是很丑陋的是不是?
- 如是又開(kāi)始使用一些輕量級(jí)的數(shù)據(jù)方法,比如使用Dapper然后自己寫(xiě)SQL語(yǔ)句,這本來(lái)是很不錯(cuò)的方式,但是大部分人的SQL能力實(shí)在不敢恭維,大部分寫(xiě)出來(lái)的SQL語(yǔ)句,甚至比EnityFramework生成的語(yǔ)句還差。
所以,我就想我們做項(xiàng)目,大部分處理的應(yīng)該是業(yè)務(wù),如何讓程序員從數(shù)據(jù)存儲(chǔ),模型轉(zhuǎn)換的大泥潭里解放出來(lái),領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)就進(jìn)入了我的視線,當(dāng)然光從數(shù)據(jù)這個(gè)角度還不足以選擇領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),用一個(gè)NoSQL數(shù)據(jù)庫(kù)是不是就解決了? 但是NoSQL也有一些問(wèn)題,比如MongoDB如何更優(yōu)雅的保證事務(wù)以及數(shù)據(jù)的一致性等。
更多了解上下文
我們很多軟件的問(wèn)題,大家都知道是需求的問(wèn)題,也就是客戶的需求我們很難理解準(zhǔn)確,導(dǎo)致程序員更加關(guān)注"HOW" 而忽略了"WHAT", 最終做了幾個(gè)禮拜甚至更長(zhǎng)時(shí)間,結(jié)果客戶會(huì)說(shuō):"What?! I told you", 但是客戶告訴我的,我們理解是不一樣的。比如客戶說(shuō):“ Great job, I love you!” 這個(gè)Love肯定不是男女之間的Love, 我們拿到的是一個(gè)客戶的需求,他的上下文是什么? 比如說(shuō):“這個(gè)球打的好”, 如果是在打籃球,肯定說(shuō)的事籃球,如果是在打乒乓球肯定說(shuō)的是乒乓球。 而領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)里我們可以讓業(yè)務(wù)人員更多的參與系統(tǒng),更早的參與系統(tǒng)。
統(tǒng)一語(yǔ)言(Ubiquitous Language)
業(yè)務(wù)人員和我們使用一樣的語(yǔ)言,我們的程序比如讓業(yè)務(wù)盡量集中在領(lǐng)域里,比如在傳統(tǒng)的數(shù)據(jù)驅(qū)動(dòng)里,如果說(shuō)Jack愛(ài)Rose, 我們一般會(huì)這么寫(xiě)
C# UserService.Love(Jack, Rose)
但是我們業(yè)務(wù)人員很奇怪誰(shuí)Love誰(shuí)? 為什么要UserService?, 如果我們寫(xiě)成下面這樣
Jack.Love(Rose)還有如果我們用
Company.hire(employee)來(lái)代替
companyservice.hire(company,employee)這樣我們就更容易讓業(yè)務(wù)人員參與進(jìn)來(lái),而且代碼可以更易于表示真實(shí)的業(yè)務(wù)場(chǎng)景。
出處:http://www.cnblogs.com/cnblogsfans
總結(jié)
以上是生活随笔為你收集整理的为何要领域驱动设计?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。