BLOGS

《領域驅動設計(jì)》-談“領域驅動設計(jì)(DDD)在項目中應用(yòng)的(de)優勢和(hé)難點”

這(zhè)本書(shū)讀(dú)起來(lái)不(bù)像有(yǒu)些(xiē)大(dà)白(bái)文(wén)一(yī)樣那(nà)麽順口,而且有(yǒu)不(bùδ)少(shǎo)專業(yè)生(shēng)僻詞彙,但(dàn)每個(gè)小(xiǎo)節,幾乎都(dōu)有(yǒu)對(duì)應的(de)應用(yòng)舉例來(lái)說(shu"ō)明(míng),确實能(néng)幫助畢業(yè)生(shēng)、工(gōng)程師(shī)或是(shì)架構師(shī)等得(d₩e)到(dào)足夠的(de)信息來(lái)應用(yòng)于實際項目中。當然,讀(dú)書(shū)過程中也(yě)會(huì)經常有(yǒu)這(zhè)‍樣的(de)疑問(wèn),為(wèi)什(shén)麽要(yào)将簡單的(de)業(yè)務設計(jìγ)拆分(fēn)成更細小(xiǎo)的(de)功能(néng)模塊?但(dàn)回想過來(lái),有(yǒu)時(shí)候就(jiù)是(shì)這λ(zhè)些(xiē)簡單的(de)業(yè)務,當後期有(yǒu)需求變更或者調整的(de)時(shí)候,由于一(yī)開(kāi)始沒有(yǒu)很(hěn)好(hǎo)的(de)進©行(xíng)領域分(fēn)析,使得(de)整個(gè)項目變更花(huā)費(fèi)巨大(dà)。

DDD設計(jì)模式很(hěn)好(hǎo),它對(duì)于當前面向對(duì)象的(de)設計(jì)有(yǒu) 著(zhe)無與倫比的(de)契合度,但(dàn)每個(gè)項目都(dōu)是(shì)“獨一(yī)無二”的(de),所以也(yě)要(yào)避免生(shēng)®搬硬套,造成不(bù)必要(yào)的(de)開(kāi)銷和(hé)争論。本書(shū)的(de)作(zuò)者Eric Evans“領域驅動之父”,但(dàn)他(tā)後面€也(yě)指導過很(hěn)多(duō)開(kāi)發團隊開(kāi)展極限編程的(de)實踐。所以沒有(yǒu)固定的(de)模式,但(dàn)需要(yào)很(h↔ěn)好(hǎo)的(de)方法和(hé)工(gōng)具來(lái)指導項目滿足基準來(lái)執行(x∑íng)。

什(shén)麽是(shì)DDD?- 個(gè)人(rén)認為(wèi)領域驅動設計(jì)(DOMAIN-DRIVEN DESIGN)是(shì)一(y≥ī)種設計(jì)方法,是(shì)一(yī)種應對(duì)業(yè)務或者用(yòng)戶case複雜(zá)性的(de)一(yī)種×拆解、思考和(hé)交流的(de)方式。它對(duì)于一(yī)些(xiē)複雜(zá)的(de)領域進行(xíng)理(lǐ)解、拆分(fēn),‍最終細化(huà),從(cóng)而得(de)到(dào)項目相(xiàng)關方都(dōu)能(néng)很←(hěn)明(míng)确的(de)清楚業(yè)務需求、規則以及實施方案。

如(rú)何在項目中應用(yòng)?- 在Eric Evans的(de)《領域驅動設計(jì)》一(yī)文(wén)中提出了(le)很(hěn)多(duō)實用(yòng)的(d&e)建模工(gōng)具:聚合、實體(tǐ)、值對(duì)象、工(gōng)程、倉儲、領域服務、領域事(​shì)件(jiàn)等,我們可(kě)以合理(lǐ)的(de)選擇工(gōng)具,來(lái)設計(jì)每一(yī)個(gè)子(zǐ)域的(de)領域模型。

舉例說(shuō)明(míng):假如(rú)有(yǒu)一(yī)家(jiā)企業(yè)需要(yào)公司開(kāi)發一(yī)套“孵化>(huà)器(qì)運營管理(lǐ)系統”,則如(rú)何利用(yòng)DDD來(lái)幫助并最終成功實施項目呢(ne)₩?

1. 抽象實體(tǐ)概念

2. 建立相(xiàng)互之間(jiān)的(de)關系

當然,如(rú)果事(shì)先設計(jì)好(hǎo)了(le)數(shù)據庫,則數(shù)據表結構和(hé)關系也(yě)就(jiù)相(xiàng)當于領域模型圖。目前大₹(dà)家(jiā)都(dōu)用(yòng)的(de)EF等ORM框架其實也(yě)是(shì)參考DDD的(de)設計(jì)模式。

3. 業(yè)務邏輯實現(xiàn)

項目經理(lǐ)和(hé)開(kāi)發人(rén)員(yuán)根據1和(hé)2中的(de)實體(tǐ)以及關系模型來(lái)進☆行(xíng)業(yè)務邏輯的(de)實現(xiàn)。

綜上(shàng)所示,DDD的(de)核心作(zuò)用(yòng)主要(yào)有(yǒu):

1. 抽象了(le)業(yè)務的(de)核心概念,并建立了(le)相(xiàng)互的(de)關系

2. 領域模型對(duì)領域內(nèi)的(de)狀态進行(xíng)積極主動的(de)維護

3. 領域模型對(duì)實體(tǐ)的(de)業(yè)務規則,數(shù)據一(yī)緻性進行(xíng)積極主動的(de)維護

在書(shū)中,也(yě)提到(dào)了(le)DDD模型在軟件(jiàn)開(kāi)發中所需表述的(de)模型,共分(fēn)為(wèi):β關聯和(hé)模式。

1. 關聯:抽象各個(gè)實體(tǐ)的(de)關系,在實際需求中會(huì)有(yǒu)大(dà)量“多✘(duō)對(duì)多(duō)”的(de)關聯,一(yī)般在頭腦(nǎo)風(fēng)暴進行(xíng)領域探索時(shí),會(huì)針對(duì) 所有(yǒu)的(de)關聯進行(xíng)分(fēn)析和(hé)羅列,但(dàn)一(yī)定要(yào)做(zuò)好↕(hǎo)一(yī)點就(jiù)是(shì):要(yào)使得(de)關聯易于控制(zhì),需要(yào)做(zuò)到(↔dào)三個(gè)方面。(1)規定一(yī)個(gè)遍曆方向 (2)添加一(yī)個(gè)限定符,盡量減少(shǎo)多(duō)重和(hé)多(duō)向 關聯 (3)消除不(bù)必要(yào)的(de)關聯

2. 模式一(yī):四層架構(最常用(yòng)的(de),也(yě)是(shì)書(shū)中Eric提到(dào)的(de))

模式二:五層架構(對(duì)四層架構的(de)補充)

Context在架構中起到(dào)上(shàng)下(xià)文(wén)作(zuò)用(yòng),将Domain層的(de)領域‍對(duì)象cast成對(duì)應的(de)Role,讓Role交互成來(lái)完成業(yè)務邏輯。

模式三:六邊形架構

這(zhè)種架構中,不(bù)同客戶通(tōng)過“平等”的(de)方式與系統進行(xíng)交&互,如(rú)果有(yǒu)新的(de)客戶需要(yào),則需要(yào)添加一(yī)個(gè)新的(de)适配器(qì)将客戶的(de)輸入轉化(huà)成能(néng)被系統APλI所識别的(de)參數(shù),同時(shí),對(duì)于每種特定的(de)輸出,都(dōu)存在一(yī)≥個(gè)新建的(de)适配器(qì)來(lái)負責完成相(xiàng)應的(de)數(shù)據轉化(huà)。所以六邊形架構中會(huì)用(yòng)到(dào)大(dà)量的(de)抽¶象技(jì)術(shù),高(gāo)層模塊不(bù)應該依賴于底層木(mù)塊,兩者都(dōu)應該依賴于抽象;抽象不(bù)應該依♠賴于業(yè)務細節,細節應該依賴于抽象去(qù)實現(xiàn)。當然書(shū)中 也(yě)提到(dào),六邊形也(yě)衍生(shēng)出了(le)三種變體(tǐ):分(fēn)别為(w¥èi)洋蔥架構、幹淨架構和(hé)Life Preserver設計(jì)等。

優勢在哪裡(lǐ)?

1. 業(yè)務通(tōng)過業(yè)務專家(jiā)的(de)整理(lǐ)變得(de)易于讀(dú)懂(dǒng),而且對(duì)于各個(≥gè)業(yè)務關系也(yě)都(dōu)有(yǒu)了(le)明(míng)确的(de)認識

2. 開(kāi)發人(rén)員(yuán)隻需要(yào)關注整個(gè)結構中的(de)某一(yī)層即可(kě)

3. 很(hěn)容易用(yòng)新的(de)實現(xiàn)技(jì)術(shù)來(lái)替換原有↑(yǒu)層次的(de)實現(xiàn)

4. 很(hěn)好(hǎo)的(de)降低(dī)耦合性

5. 有(yǒu)利于軟件(jiàn)開(kāi)發的(de)标準化(huà)

6. 有(yǒu)利于邏輯間(jiān)的(de)複用(yòng)性

難點是(shì)什(shén)麽? 因為(wèi)業(yè)務需求多(duō)種多(duō)樣,所以一(yī)個(δgè)公司很(hěn)難有(yǒu)專家(jiā)對(duì)各個(gè)方面都(dōu)很(hěn)精通(tōng),并且要(yào)會(huì)做(zuò)業(¥yè)務分(fēn)析,模塊劃分(fēn),畫(huà)好(hǎo)領域模型圖,并設計(jì)好(hǎo)各個(gè)模型和(hé)功能(néng),其實是(shì)非常空(kōng)難的(βde)。另外(wài)當業(yè)務發生(shēng)變化(huà)時(shí),也(yě)需要(yào)業(yè)務專家(jiā)先修改領域模型,開(kāi)發人(rén)員(y€uán)再根據模型進行(xíng)調整,也(yě)無形中犧牲了(le)開(kāi)發效率。

後記 - 有(yǒu)難點,可(kě)以在實際操作(zuò)中去(qù)規避,畢竟我們所涉及到(dào)的(de)項目複雜(zá)程度也(yě)一(yī)般,所以能(néng)夠找π到(dào)合适方法或者模式,能(néng)夠在以後的(de)項目實施中起到(dào)很(hěn)好(hǎo)的(de)引導和(hé)指引的(deΩ)作(zuò)用(yòng),起到(dào)事(shì)倍功半的(de)效率,才能(néng)對(du♠ì)于個(gè)人(rén)、對(duì)于客戶、對(duì)于公司之間(jiān)建立起足夠的(de)信任、尊重關系,為(wèi)以↔後的(de)發展定下(xià)基調。

對(duì)于DDD模式,個(gè)人(rén)覺得(de)是(shì)一(yī)個(gè)項目實施的(de)指導基準,具體(tǐ)怎麽去(qù)運用(yòng),還(hái)需要(yào)δ各位相(xiàng)關方來(lái)确定符合自(zì)己項目的(de)工(gōng)具或者技(jì)術(shù),而不(bù)能€(néng)一(yī)味的(de)強加到(dào)項目上(shàng),畢竟DDD隻是(shì)一(yī)種模式、理(lǐ)念。