一、前言
本篇文章會(huì)簡(jiǎn)要介紹領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)能做什么梅誓,以作為多篇介紹領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)文章的開(kāi)篇恰梢。后面會(huì)使用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的英文縮寫(xiě) DDD。之所以開(kāi)篇介紹 DDD 能做什么梗掰,而不是介紹是什么嵌言,原因是后者答案很容易找,只需 Google 一下及穗。而介紹 DDD 能做什么摧茴,則可以從實(shí)踐的角度介紹學(xué)習(xí)和使用 DDD 的必要性。
整體而言埂陆,DDD 還是一門(mén)偏小眾的技術(shù)苛白,了解者比例不高,更多的人也還沒(méi)有意識(shí)到它的重要性焚虱。這也是寫(xiě)此篇文章的一個(gè)重要原因购裙。
當(dāng)然,雖然全篇不會(huì)介紹什么是 DDD鹃栽,但是一句話(huà)介紹還是少不了:領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是一種思想缓窜,用來(lái)指導(dǎo)復(fù)雜的軟件系統(tǒng)的設(shè)計(jì)。正如那本同名書(shū)的副標(biāo)題 ——《軟件核心復(fù)雜性應(yīng)對(duì)之道》谍咆。所以禾锤,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的思想是值得每一位從事軟件系統(tǒng)開(kāi)發(fā),尤其是業(yè)務(wù)系統(tǒng)開(kāi)發(fā)的同學(xué)了解學(xué)習(xí)的摹察。
接下來(lái)簡(jiǎn)單介紹一下 DDD 在軟件開(kāi)發(fā)各方面中所能起到的作用恩掷。
二、DDD 的作用
1. 需求討論
軟件開(kāi)發(fā)的很多問(wèn)題其實(shí)源于需求討論階段供嚎。需求討論不清黄娘、對(duì)需求的誤解,等等克滴,都會(huì)從一開(kāi)始就對(duì)軟件開(kāi)發(fā)造成負(fù)面影響逼争。
那 DDD 如何可以解決這一個(gè)問(wèn)題?DDD 解決這一問(wèn)題的方法的核心是 Ubiquitous Language —— 通用語(yǔ)言劝赔。
DDD 指出誓焦,對(duì)業(yè)務(wù)知識(shí)抽象建模而形成的領(lǐng)域模型應(yīng)當(dāng)成為軟件開(kāi)發(fā)交流過(guò)程中使用的通用語(yǔ)言。對(duì)于同一個(gè)業(yè)務(wù)概念着帽,需求文檔和代碼實(shí)現(xiàn)中應(yīng)該使用同一個(gè)詞語(yǔ)去表述杂伟。不僅表面上的命名需要一致移层,背后的含義也應(yīng)當(dāng)是一致的。
這么做原因在于赫粥,軟件開(kāi)發(fā)過(guò)程中观话,同一個(gè)詞,在產(chǎn)品經(jīng)理和工程師的腦中越平,可能有著不一致的含義和理解频蛔。雖說(shuō)這種不一致一般不至于差出十萬(wàn)八千里,但在復(fù)雜的系統(tǒng)開(kāi)發(fā)中秦叛,即便是細(xì)小的差異晦溪,經(jīng)過(guò)需求的組合以及時(shí)間的積累,最終會(huì)導(dǎo)致比較大的差異书闸。而這種差異會(huì)對(duì)后來(lái)的軟件開(kāi)發(fā)造成越來(lái)越大的麻煩。
而在軟件開(kāi)發(fā)中應(yīng)用 DDD利凑,則可以避免這種問(wèn)題的發(fā)生浆劲。
2. 系統(tǒng)設(shè)計(jì)
現(xiàn)在的業(yè)務(wù)系統(tǒng)的開(kāi)發(fā),使用的技術(shù)有了很大的進(jìn)步哀澈,但是很多系統(tǒng)的設(shè)計(jì)似乎同十幾年前并沒(méi)有太大差別牌借。雖然大家所使用的語(yǔ)言,如 Java割按、Python膨报、Javascript、Go 等适荣,都或多或少的包含了面向?qū)ο蟮奶匦韵帜蟛糠殖绦蜻€是以面向過(guò)程的思維被設(shè)計(jì)。而這會(huì)導(dǎo)致很多系統(tǒng)設(shè)計(jì)層面的問(wèn)題弛矛,例如過(guò)于復(fù)雜够吩、龐大的業(yè)務(wù)層。
我對(duì)系統(tǒng)設(shè)計(jì)的看法是:對(duì)于一個(gè)系統(tǒng)的整體設(shè)計(jì)丈氓,更多的應(yīng)當(dāng)是使用面向?qū)ο蟮乃枷胫苎嫦蜻^(guò)程的思想更多的是應(yīng)用在具體功能設(shè)計(jì)上。
在面向?qū)ο笤O(shè)計(jì)的實(shí)際應(yīng)用方面万俗,DDD 能夠提供非常好的實(shí)踐性指導(dǎo)湾笛。這就是 DDD 在系統(tǒng)設(shè)計(jì)方面的意義。
3. 接口設(shè)計(jì)
在我工作過(guò)的項(xiàng)目中闰歪,接口設(shè)計(jì)常常是一個(gè)難題嚎研。接口不同于代碼實(shí)現(xiàn),代碼實(shí)現(xiàn)可以經(jīng)常修改库倘,但接口一旦發(fā)布就很難修改了嘉赎。所以置媳,接口的設(shè)計(jì)需要非常慎重的考慮。
如何設(shè)計(jì)接口呢公条?在這方面拇囊,REST 是一個(gè)很好的實(shí)踐。當(dāng)然我不是說(shuō) REST 能解決所有的接口設(shè)計(jì)問(wèn)題靶橱,確實(shí)有很多接口不適合用 REST 設(shè)計(jì)寥袭,也有很多接口使用類(lèi)似但非標(biāo)準(zhǔn)的 REST 接口形式設(shè)計(jì)。但我建議关霸,在設(shè)計(jì)接口時(shí)請(qǐng)認(rèn)真考慮 REST 風(fēng)格传黄。
在使用 REST 風(fēng)格設(shè)計(jì)接口時(shí),需要考慮的重要問(wèn)題包括確定系統(tǒng)中有哪些 Resource队寇、這些 Resource 之間的關(guān)系是什么膘掰?
其實(shí) REST 接口中的 Resource 其實(shí)可以與領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中的實(shí)體互相等同。如果一個(gè)系統(tǒng)設(shè)計(jì)使用了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)佳遣,那確定 Resource识埋,以及它們之間的關(guān)系也就不是難事。自然零渐,設(shè)計(jì)出合理的接口也就變得更加容易窒舟。
五、小結(jié)
大家在討論技術(shù)問(wèn)題時(shí)诵盼,往往會(huì)關(guān)注新和大的話(huà)題惠豺,比如某種新技術(shù)、新框架风宁,或者某某系統(tǒng)的高可用架構(gòu)設(shè)計(jì)洁墙、雙11、大促系統(tǒng)設(shè)計(jì)等等戒财。
這樣的題目顯然更吸引眼球扫俺。雖然這些高大上的內(nèi)容是大家在工作中需要考慮的內(nèi)容,也很重要固翰,但是不應(yīng)因此忽視平時(shí)工作更常遇見(jiàn)的問(wèn)題 —— 如何設(shè)計(jì)好復(fù)雜的業(yè)務(wù)系統(tǒng)狼纬。
如果不能解決好業(yè)務(wù)系統(tǒng)的復(fù)雜性問(wèn)題,那些如高可用骂际、高并發(fā)疗琉、多機(jī)房容災(zāi)等等的高大上的技術(shù)改進(jìn)工作實(shí)施起來(lái)也會(huì)變得異常困難。最重要的是歉铝,如果整個(gè)團(tuán)隊(duì)被業(yè)務(wù)問(wèn)題搞得焦頭爛額時(shí)盈简,還有多少精力和熱情投入到技術(shù)改進(jìn)工作呢?
所以,從上面這個(gè)角度講柠贤,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)解決的不僅是業(yè)務(wù)系統(tǒng)的復(fù)雜性問(wèn)題香浩。
對(duì)于前面講到的內(nèi)容,我會(huì)在后續(xù)的文章中做更詳細(xì)的介紹臼勉。