日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

领域驱动设计-什么是领域驱动设计和怎么使用它

發(fā)布時(shí)間:2024/9/19 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 领域驱动设计-什么是领域驱动设计和怎么使用它 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章討論領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD),DDD是建立在面向?qū)ο蠓治鲈O(shè)計(jì)上開(kāi)發(fā)軟件的一種方法。 通過(guò)這篇文章我們解釋什么是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),在現(xiàn)代開(kāi)發(fā)周期中如何實(shí)現(xiàn),使用DDD的優(yōu)點(diǎn)和缺點(diǎn)。

什么是領(lǐng)域

定義DDD之前我們首先必須要說(shuō)明在開(kāi)發(fā)中”領(lǐng)域”的含義。領(lǐng)域在字典中的解釋是:“活動(dòng)或者知識(shí)的范圍”,更深層次的來(lái)講,軟件工程中領(lǐng)域指的是軟件應(yīng)用的地方。 換句話說(shuō),在軟件開(kāi)發(fā)中,領(lǐng)域指的是”應(yīng)用程序邏輯范圍的知識(shí)和活動(dòng)”

另一個(gè)在軟件開(kāi)發(fā)中常使用的術(shù)語(yǔ)是領(lǐng)域?qū)踊蝾I(lǐng)域邏輯,對(duì)于開(kāi)發(fā)者來(lái)說(shuō),說(shuō)成是業(yè)務(wù)邏輯或許應(yīng)該會(huì)更加熟悉。應(yīng)用程序業(yè)務(wù)邏輯指的是業(yè)務(wù)對(duì)象如何與其他業(yè)務(wù)對(duì)象交互(如何生成對(duì)象,修改相關(guān)數(shù)據(jù))這種更高級(jí)別的規(guī)則。

什么是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)

最先介紹領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的是在程序員?Eric Evans?2004年出版的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):復(fù)雜軟件核心復(fù)雜應(yīng)對(duì)之道》書籍中,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是領(lǐng)域概念的擴(kuò)展和應(yīng)用,并且將它應(yīng)用在軟件開(kāi)發(fā)中。它的目標(biāo)是將軟件相關(guān)部分連接到不斷發(fā)展的模型中,以此更容易創(chuàng)建復(fù)雜的應(yīng)用,DDD關(guān)注三個(gè)核心點(diǎn):

.關(guān)注核心領(lǐng)域和核心領(lǐng)域邏輯。

.在領(lǐng)域模型中進(jìn)行復(fù)雜性設(shè)計(jì)。

.與領(lǐng)域?qū)<揖o密合作,以此改進(jìn)應(yīng)用模型和解決新出現(xiàn)的領(lǐng)域問(wèn)題。

Evans的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):復(fù)雜軟件核心復(fù)雜性解決之道》一書中定義了幾個(gè)常用的術(shù)語(yǔ),在實(shí)踐DDD和討論DDD的時(shí)候非常有用。

.Context(上下文):單詞或者語(yǔ)句出現(xiàn)的環(huán)境,它決定了單詞或語(yǔ)句的含義。關(guān)于模型的語(yǔ)句只能在上下文中理解。

.Model(模型):一個(gè)系統(tǒng)的抽象,用于描述領(lǐng)域的某個(gè)方面,并且能夠用于解決領(lǐng)域相關(guān)的問(wèn)題。

.Ubiquitous Language(統(tǒng)一語(yǔ)言):與領(lǐng)域模型相關(guān)的結(jié)構(gòu)化語(yǔ)言,用于將團(tuán)隊(duì)成員的活動(dòng)與軟件連接起來(lái)。

.Bounded Context(上下文邊界):模型定義的范圍和適用范圍的描述(比如,子系統(tǒng),特定團(tuán)隊(duì)的工作)。

構(gòu)建塊

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)同樣也定義了幾個(gè)連接領(lǐng)域模型的高層次概念,以此來(lái)修改,創(chuàng)建領(lǐng)域模型。

.Entity(實(shí)體):連續(xù)狀態(tài)變化的對(duì)象,而不是傳統(tǒng)使用屬性來(lái)定義的對(duì)象。

.value object(值對(duì)象):一個(gè)不可變且有屬性的對(duì)象,但是它沒(méi)有唯一的標(biāo)識(shí)符。

.Domain Event(領(lǐng)域事件):系統(tǒng)內(nèi)記錄與模型活動(dòng)相關(guān)的分離事件的對(duì)象,系統(tǒng)內(nèi)所有的事件都應(yīng)該能夠被跟蹤,一個(gè)領(lǐng)域事件僅被領(lǐng)域?qū)<谊P(guān)心的事件類型創(chuàng)建。

.Aggregate(聚合):根據(jù)組邊界定義值對(duì)象和實(shí)體的聚合, 而不是允許單個(gè)實(shí)體或者值對(duì)象執(zhí)行它自己所有的動(dòng)作,聚合的對(duì)象都有一個(gè)統(tǒng)一的根對(duì)象(在書籍中寫的是選擇一個(gè)實(shí)體作為根),這樣,外部對(duì)象不再直接訪問(wèn)聚合內(nèi)部的單個(gè)對(duì)象或者實(shí)體,而是直接訪問(wèn)單一的聚合根對(duì)象,并且使用這個(gè)對(duì)象將指令傳遞給對(duì)應(yīng)的分組。這個(gè)實(shí)踐和設(shè)計(jì)模式編碼相關(guān)聯(lián)。

.Service(服務(wù)):本質(zhì)上是來(lái)說(shuō),一個(gè)服務(wù)就是一個(gè)操作或者業(yè)務(wù)邏輯的組合,這樣就表明了它在對(duì)象領(lǐng)域中不適用。換句話來(lái)說(shuō),如果某些功能必須存在且不能和實(shí)體或者值對(duì)象相關(guān)聯(lián),它可以定義為服務(wù)。

.Repositories(倉(cāng)庫(kù)):不要和常見(jiàn)的版本控制倉(cāng)庫(kù)相混淆,倉(cāng)庫(kù)在DDD里面的意思就是一個(gè)服務(wù),它提供一個(gè)全局接口來(lái)訪問(wèn)特定聚合內(nèi)部所有的實(shí)體類和值對(duì)象。應(yīng)該包括創(chuàng)建,修改,刪除聚合內(nèi)部對(duì)象的方法。然而,通過(guò)使用倉(cāng)庫(kù)服務(wù)來(lái)構(gòu)造數(shù)據(jù)查詢的目的是刪除業(yè)務(wù)邏輯對(duì)象模型中的數(shù)據(jù)查詢方法。

.Factories(工廠):正如我們?cè)谠O(shè)計(jì)模式文章里面討論的那樣,DDD建議使用工廠來(lái)創(chuàng)建復(fù)雜對(duì)象和聚合,保證客戶端不用知道對(duì)象內(nèi)部組成。

同樣,DDD也著重強(qiáng)調(diào)越來(lái)越流行的持續(xù)集成實(shí)踐,它要求所有開(kāi)發(fā)團(tuán)隊(duì)使用同一個(gè)倉(cāng)庫(kù)共享代碼,并且每天推送代碼到倉(cāng)庫(kù)。在每天結(jié)束的時(shí)候自動(dòng)檢查代碼倉(cāng)庫(kù)完,運(yùn)行單元測(cè)試,回歸測(cè)試等過(guò)程。這樣就可以快速檢測(cè)出潛在存在的問(wèn)題并在下一次提交代碼的時(shí)解決這個(gè)問(wèn)題。

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)優(yōu)點(diǎn)

.溝通簡(jiǎn)單:團(tuán)隊(duì)成員使用與領(lǐng)域模型相關(guān)的統(tǒng)一語(yǔ)言來(lái)溝通會(huì)更加容易。通常來(lái)說(shuō),在討論應(yīng)用程序時(shí)DDD使用更少的技術(shù)行業(yè)術(shù)語(yǔ),因?yàn)樵谙惹敖⒌慕y(tǒng)一語(yǔ)言定義了更簡(jiǎn)單的術(shù)語(yǔ)來(lái)指代哪些更具有技術(shù)性的術(shù)語(yǔ)。

.提高靈活性:DDD基于面向?qū)ο蠓治龊驮O(shè)計(jì)相關(guān)的概念,幾乎領(lǐng)域模型內(nèi)的任何東西都基于對(duì)象,因此十分便于分模塊。這就可以對(duì)各個(gè)組件,整個(gè)系統(tǒng)作出持續(xù)性的修改。

.在接口上強(qiáng)調(diào)領(lǐng)域:DDD是圍繞領(lǐng)域概念和領(lǐng)域?qū)<医ㄗh進(jìn)行構(gòu)建的實(shí)踐活動(dòng),與哪些首先強(qiáng)調(diào)UI/UX的應(yīng)用程序不同,DDD總是會(huì)生成適合當(dāng)前領(lǐng)域的應(yīng)用程序。雖然需要明顯的平衡,但是聚焦于DDD意味者能夠產(chǎn)生一個(gè)與該領(lǐng)域用戶有共鳴的產(chǎn)品。

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的缺點(diǎn)

.需要精力充沛的領(lǐng)域?qū)<?#xff1a;即使有最精通技術(shù)的開(kāi)發(fā)人員,如果團(tuán)隊(duì)內(nèi)沒(méi)有一個(gè)知道應(yīng)用程序使用領(lǐng)域相關(guān)的領(lǐng)域?qū)<?#xff0c;那也是沒(méi)有意義的。在某些情形下,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)需要一個(gè)或多個(gè)外部人員在整個(gè)軟件開(kāi)發(fā)生命周期中扮演領(lǐng)域?qū)<业慕巧?/p>

.鼓勵(lì)迭代實(shí)踐:雖然許多人覺(jué)得這是一個(gè)優(yōu)勢(shì),不可否認(rèn),DDD實(shí)踐強(qiáng)烈依賴連續(xù)迭代和持續(xù)集成來(lái)構(gòu)建易于修改的項(xiàng)目。某些團(tuán)隊(duì)在實(shí)踐這個(gè)的時(shí)候可能會(huì)遇到問(wèn)題,特別是那些過(guò)去經(jīng)驗(yàn)與不太靈活的開(kāi)發(fā)模型有關(guān),比如瀑布模型。

.不適用偏向技術(shù)型的項(xiàng)目:DDD適用于領(lǐng)域復(fù)雜的應(yīng)用(業(yè)務(wù)邏輯復(fù)雜),它不適用于邊界復(fù)雜的領(lǐng)域,類似這種領(lǐng)域都有高的技術(shù)復(fù)雜性。DDD著重強(qiáng)調(diào)需要領(lǐng)域?qū)<疑烧_的統(tǒng)一語(yǔ)言并且一起寫出項(xiàng)目的領(lǐng)域模型,但是領(lǐng)域?qū)<襾?lái)極難把握具有極高技術(shù)復(fù)雜性的項(xiàng)目,因此可能導(dǎo)致全體團(tuán)隊(duì)成員沒(méi)有完全理解技術(shù)上的要求和限制。

總結(jié)

以上是生活随笔為你收集整理的领域驱动设计-什么是领域驱动设计和怎么使用它的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。