领域驱动设计,让程序员心中有码(二)
引子,軟件工程沒有銀彈
???上一篇博文領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),讓程序員心中有碼,拋出了一個(gè)問題,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)真的是萬能的良方嗎?對(duì)于這個(gè)問題,大家的答案無疑是一致的,作為一種非常受軟件行業(yè)歡迎的軟件思想,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)固然有很多優(yōu)點(diǎn),卻并非萬能。
?回到十年前,第一節(jié)軟件工程學(xué)的課堂上,我們的老師就告訴了我們一句真理,軟件工程沒有銀蛋,這句話說的是,軟件工程領(lǐng)域,從來沒有一種思想或理論能夠帶來成倍的效率提升。不知不覺,十年過去,我們大概可以看到,軟件開發(fā)新技術(shù)日新月異,新語言層出不窮,但是無論哪種技術(shù),都不見得相對(duì)于其所對(duì)標(biāo)的技術(shù)取得了成倍的提升。技術(shù)尚且如此,理論就更不用說了。
? ?領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),近年來受到技術(shù)圈的廣泛追捧,主要得益于微服務(wù)技術(shù)的發(fā)展。一千個(gè)讀者有一千個(gè)哈姆雷特,而不同的人往往對(duì)這種理論有不同的看法。如果問一個(gè).net開發(fā)者領(lǐng)域驅(qū)動(dòng)是什么,大概他會(huì)說是abp架構(gòu)。ABP架構(gòu)作為完全按照領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)思想構(gòu)建的技術(shù)架構(gòu),目前得到了社區(qū)的廣泛追捧。然而,領(lǐng)域驅(qū)動(dòng)架構(gòu)和領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),依然是道和術(shù)的區(qū)別,開發(fā)者在學(xué)習(xí)領(lǐng)域驅(qū)動(dòng)架構(gòu)的同時(shí),也應(yīng)該了解領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)。那么領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)究竟是什么的東西?由于時(shí)間和篇幅有限,我無意通過代碼介紹如何實(shí)現(xiàn)一個(gè)領(lǐng)域驅(qū)動(dòng)的功能,而是希望把領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的基本思路進(jìn)行梳理,期待能通過我的梳理,拋磚引玉,給大家?guī)韱⒌稀?/span>
一,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),不錯(cuò)的選擇
作為現(xiàn)代軟件工業(yè)發(fā)展的產(chǎn)物,敏捷開發(fā)和極限編程,實(shí)現(xiàn)了生產(chǎn)力的解放,通過拋棄傳統(tǒng)研發(fā)模式中留下的臃腫的設(shè)計(jì)文檔,實(shí)現(xiàn)了勞動(dòng)生產(chǎn)力的提升,無數(shù)互聯(lián)網(wǎng)公司,依靠靈活的開發(fā)手段,為產(chǎn)品插上了快速開發(fā)的翅膀。開發(fā)者們不用加班,分分鐘就把代碼擼完,然后把產(chǎn)品質(zhì)量關(guān)把好,發(fā)布,嗯,早早的就回家休息了。然而,隨著產(chǎn)品功能的逐漸增加,團(tuán)隊(duì)自然而然也需要擴(kuò)展。可是,團(tuán)隊(duì)成員越來越多,代碼質(zhì)量成為一個(gè)難以把控的問題。如何保證產(chǎn)品功能的一致性?如何保證功能符合產(chǎn)品的需求?管理者們不厭其煩,每天開會(huì)必須提開發(fā)質(zhì)量,必須強(qiáng)調(diào)變量命名,注釋,設(shè)計(jì)原則,設(shè)計(jì)模式,然后每天一次集成,代碼審查估計(jì)已經(jīng)不現(xiàn)實(shí)了。于是,作為面子的產(chǎn)品質(zhì)量尚且有測(cè)試把關(guān),而作為內(nèi)臟的代碼質(zhì)量本身,成為上帝的骰子,好與壞全靠開發(fā)者們的自覺性和經(jīng)驗(yàn)。冰山,在軟件產(chǎn)品華麗外表之下,究竟深藏著多少問題?
一個(gè)復(fù)雜的數(shù)據(jù)庫關(guān)系模型圖?
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在這樣的場(chǎng)景下推出來的一種理念。軟件系統(tǒng)的復(fù)雜度是開發(fā)者們沒辦法避免的客觀情況,而根據(jù)領(lǐng)域的實(shí)際情況,建立模型是解決問題行之有效的方法。在實(shí)際過程中,我們需要領(lǐng)域?qū)<遗c開發(fā)者一起,共同努力,以一種特殊的方式來進(jìn)行溝通,并通過模型將實(shí)際生活中的問題抽象化。?領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的核心是建模,實(shí)際上對(duì)于大部分開發(fā)者而言,建模是一個(gè)基本技能,卻并非每個(gè)人都能熟練的掌握。技術(shù)人員都普遍對(duì)他們工作領(lǐng)域有關(guān)的知識(shí)不感興趣,而更愿意從事精細(xì)的框架工作,例如通過技術(shù)手段解決實(shí)際問題。而學(xué)習(xí)業(yè)務(wù)領(lǐng)域和領(lǐng)域建模的工作往往留給別人去做。然而,實(shí)際上,軟件核心的復(fù)雜性,既包括需要直接面對(duì)的技術(shù)問題,而客觀存在的業(yè)務(wù)問題卻也是不可忽視的,過份重視技術(shù),輕視建模,只會(huì)導(dǎo)致工作重心的偏離。甚至可以說,過份的重視領(lǐng)域驅(qū)動(dòng)架構(gòu)基礎(chǔ)設(shè)施本身,而忽略了建模過程,在后期執(zhí)行過程中可能會(huì)導(dǎo)致不可控制的風(fēng)險(xiǎn)。對(duì)于這一點(diǎn)大家都是容易理解的,以前的架構(gòu),簡(jiǎn)單反而容易維護(hù),而系統(tǒng)架構(gòu)復(fù)雜了,反而提高了學(xué)習(xí)成本導(dǎo)致不容易維護(hù)。?
軟件設(shè)計(jì)的基本原則是“高內(nèi)聚,低耦合”。作為一個(gè)復(fù)雜的軟件工程,依靠領(lǐng)域驅(qū)動(dòng)建模,將緊密聯(lián)系在一起的業(yè)務(wù)設(shè)計(jì)成一個(gè)領(lǐng)域模型,讓領(lǐng)域模型內(nèi)部隱藏細(xì)節(jié),這樣讓領(lǐng)域模型與領(lǐng)域模型之間的關(guān)系變得簡(jiǎn)單,將極大的降低復(fù)雜業(yè)務(wù)之間千絲萬縷的耦合關(guān)系。? 面向領(lǐng)域設(shè)計(jì)的模型圖?
二,領(lǐng)域設(shè)計(jì)的要素,統(tǒng)一語言和建模及文檔
在進(jìn)行設(shè)計(jì)之前,我們有必要建立基本的原則,那就是統(tǒng)一語言,模型,和設(shè)計(jì)文檔。?
1 ?統(tǒng)一語言?
在日常討論過程中,我們需要跟領(lǐng)域?qū)<矣懻?#xff0c;往往大家都是自己行業(yè)內(nèi)的專家,也意味著大家都有自己的表達(dá)問題的方式和自己的理解,這有可能導(dǎo)致需求支離破碎。例如對(duì)對(duì)方表達(dá)的術(shù)語不了解,會(huì)形成雞同鴨講的情況。因此,需要建立一個(gè)能夠互相溝通理解的語言環(huán)境,例如,互相的交流雙方的術(shù)語,并試圖利用雙方都能理解的詞語進(jìn)行問題的分析。也許在最開始這樣共同語言并不能很好的運(yùn)作,但是卻可以在后期逐漸完善。我們的開發(fā)者應(yīng)該定期的了解領(lǐng)域所在行業(yè)的業(yè)務(wù)知識(shí),擴(kuò)充自己的知識(shí)面,這也有利于我們與領(lǐng)域?qū)<业慕涣鳌?/strong>?
2 ?建模和畫圖?
在我們工作過程中模型無處不在,不管是在紙上繪制的簡(jiǎn)單模型,或者使用專業(yè)軟件繪制的各種模型,都是模型。領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)本身,依然依賴于模型驅(qū)動(dòng)設(shè)計(jì)。學(xué)會(huì)建模對(duì)于廣大開發(fā)者來說,都是一項(xiàng)基本技能。可以說,代碼語言是為了與其他開發(fā)者進(jìn)行溝通交流,那我們建立的各種軟件設(shè)計(jì)模型將極大的方便不同領(lǐng)域的人員進(jìn)行交流。建模也可以稱之為語言的一部分利用uml建立類圖,是一種可以比較易于接受的方式。我們可以采用以下手段來建立領(lǐng)域模型。?
1)建立一個(gè)與實(shí)現(xiàn)綁定的模型。初版的模型也許很簡(jiǎn)陋,但是它可以成為一個(gè)基礎(chǔ),然后在后期逐漸完善。?
2)建立一種基于模型的通用語言或表達(dá)形式和機(jī)制。通過通用語言讓參與項(xiàng)目的所有人理解模型。?
3)開發(fā)一個(gè)蘊(yùn)含豐富知識(shí)的模型。模型不是單純的數(shù)據(jù)結(jié)構(gòu),它更是各類知識(shí)的聚合體。?
4)提煉模型,模型應(yīng)該能在項(xiàng)目過程中動(dòng)態(tài)改變,發(fā)現(xiàn)新的概念就加進(jìn)來,過時(shí)的概念就適時(shí)移除,避免臃腫。?
5)頭腦風(fēng)暴和實(shí)驗(yàn)。模型在于實(shí)踐和應(yīng)用,它需要項(xiàng)目參與者共同的努力,而頭腦風(fēng)暴是發(fā)揮集體智慧的良好方式。對(duì)模型進(jìn)行實(shí)驗(yàn)或者進(jìn)行場(chǎng)景的模擬,有利于讓模型更符合需求。?
當(dāng)然,對(duì)于領(lǐng)域?qū)<叶?#xff0c;不同類型的模型也許無法理解,例如類圖可能過于復(fù)雜,可以使用畫圖的形式,通過解釋性的圖形或者模型,可以讓不同層次的人都能獲得一致的理解。?
3 ?設(shè)計(jì)文檔?
設(shè)計(jì)文檔依然是不可拋棄的重要資料,雖然設(shè)計(jì)文檔可能不利于維護(hù),卻仍然不可拋棄。畢竟開發(fā)過程中,通過代碼和模型,有可能會(huì)導(dǎo)致關(guān)鍵信息的丟失,而且有的不能直接參與討論的領(lǐng)域?qū)<倚枰ㄟ^文檔才能了解之前討論的情況,甚至可能畫圖會(huì)形成很多歧義,這也需要解釋性的文檔才能說清楚。為了讓文檔變得更加有效,不建議重復(fù)贅述已知的信息,而關(guān)鍵信息更改后,應(yīng)該盡量保持最新。?
完全依賴代碼或架構(gòu)的自解釋特性目前似乎已經(jīng)成為大家的普遍習(xí)慣,但是代碼可能存在歧義,或者有的方法本身就無法表達(dá)方法的本質(zhì)含義,最終導(dǎo)致代碼成為無法理解的神之領(lǐng)域,這種問題已經(jīng)不是一個(gè)單純的領(lǐng)域驅(qū)動(dòng)架構(gòu)能夠解決的。如果為了讓代碼來解釋模型,我們所有人必須時(shí)刻抱著一絲不茍嚴(yán)于律己的態(tài)度,才能寫出完全符合領(lǐng)域模型的代碼,問題是這種方式現(xiàn)實(shí)嗎??
4 ?概念總結(jié):?
1)領(lǐng)域就是問題域,有邊界,領(lǐng)域中有很多問題;?
2)任何一個(gè)系統(tǒng)要解決的那個(gè)大問題都對(duì)應(yīng)一個(gè)領(lǐng)域;?
3)通過建立領(lǐng)域模型來解決領(lǐng)域中的核心問題,模型驅(qū)動(dòng)的思想;?
4)領(lǐng)域建模的目標(biāo)針對(duì)我們?cè)陬I(lǐng)域中所關(guān)心的問題,即只針對(duì)核心關(guān)注點(diǎn),而不是整個(gè)領(lǐng)域中的所有問題;?
5)領(lǐng)域模型在設(shè)計(jì)時(shí)應(yīng)考慮一定的抽象性、通用性,以及復(fù)用價(jià)值;?
6)通過領(lǐng)域模型驅(qū)動(dòng)代碼的實(shí)現(xiàn),確保代碼讓領(lǐng)域模型落地,代碼最終能解決問題;?
7)領(lǐng)域模型是系統(tǒng)的核心,是領(lǐng)域內(nèi)的業(yè)務(wù)的直接沉淀,具有非常大的業(yè)務(wù)價(jià)值;?
8)技術(shù)架構(gòu)設(shè)計(jì)或數(shù)據(jù)存儲(chǔ)等是在領(lǐng)域模型的外圍,幫助領(lǐng)域模型進(jìn)行落地;?
三、問題思考
掌握建模和基本的步驟,意味著一切剛剛開始。道阻且長(zhǎng),行則將至,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),不僅僅是一種簡(jiǎn)單的建模思想或技術(shù)架構(gòu),更是一種挑戰(zhàn)。在選擇之前,是否需要思考一下,這一套體系,真的適合在你的團(tuán)隊(duì)中運(yùn)行么?如果要切實(shí)的運(yùn)行,還需要付出多少代價(jià)?尤其是對(duì)于領(lǐng)域模型而言,如果缺乏合理有效、而且持續(xù)迭代的設(shè)計(jì),你難道不覺得最終所有的模型僅僅只是一種數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)嗎??
參考資料:?
1.《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)-軟件核心復(fù)雜性應(yīng)對(duì)之道》?
2.https://blog.csdn.net/three_bird/article/details/51336834?
3.https://blog.csdn.net/heweimingming/article/details/78661540
原文地址: https://www.cnblogs.com/xiyuanMore/p/10085784.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的领域驱动设计,让程序员心中有码(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于.NET Standard的分布式自
- 下一篇: .NET Core实战项目之CMS 第九