DDD-領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)

  • 首先滚局,在領(lǐng)域建模過程中不應(yīng)將概念與實(shí)現(xiàn)割裂開來
  • 反對(duì)'先建設(shè)曲梗,后實(shí)現(xiàn)'纤垂,應(yīng)該隨時(shí)間進(jìn)行迭代升級(jí)(開發(fā)人員和領(lǐng)域人員以及專業(yè)人員共同協(xié)助完成)
  • DDD和敏捷開發(fā)互相增強(qiáng)
  • 重點(diǎn)2逸吵,3,9厢破,14章

運(yùn)用領(lǐng)域模型

  • 有效建模的要素
  1. 模型和實(shí)現(xiàn)的綁定(正因?yàn)橐獙?shí)現(xiàn)荣瑟,建模不只是領(lǐng)域?qū)<业氖虑椋€需要開發(fā)人員參與)
  2. 建立了一種基于模型的語言(領(lǐng)域?qū)<液烷_發(fā)人員可以持續(xù)基于模型語言進(jìn)行討論和展開)
  3. 開發(fā)一個(gè)具有豐富知識(shí)的模型庫(業(yè)務(wù)活動(dòng)和規(guī)則都是領(lǐng)域的核心)
  4. 不停提煉模型(模型不是不變的溉奕,需要不停迭代和更新)
  5. 頭腦風(fēng)暴和實(shí)驗(yàn)(不斷改造和創(chuàng)新)
  • 模型獲取的知識(shí)遠(yuǎn)遠(yuǎn)不只是“發(fā)現(xiàn)名詞”褂傀,業(yè)務(wù)活動(dòng)和規(guī)則如同涉及到的實(shí)體一樣,都是領(lǐng)域的核心加勤。


    知識(shí)豐富的設(shè)計(jì)-策略.png
  • ubiquitous language(通用語言)
    開發(fā)人員之間的對(duì)話仙辟、領(lǐng)域?qū)<抑g的討論以及代碼本身所表達(dá)的內(nèi)容都基于同一種語言,都來自于一個(gè)共享的領(lǐng)域模型鳄梅。
  1. 簡單叠国、非正式的UML圖能夠維系整個(gè)討論。
  2. 圖是一種溝通和解釋手段戴尸,它們可以促進(jìn)頭腦風(fēng)暴粟焊。簡潔的小圖能夠很好地實(shí)現(xiàn)這些目標(biāo),而涵蓋整個(gè)對(duì)象模型的綜合性大圖反而失去了溝通或解釋能力孙蒙,因?yàn)樗鼈儗⒆x者淹沒在大量細(xì)節(jié)之中项棠,加之這些圖也缺乏目的性。
  3. 通常的用法是以圖為主挎峦,輔以文本注釋香追;而我更愿意以文本為主,用精心挑選的簡化圖作為說明坦胶。
  • 文檔
  1. 文檔應(yīng)作為代碼和口頭交流的補(bǔ)充
  2. 文檔應(yīng)當(dāng)鮮活并保持最新

綁定模型和實(shí)現(xiàn)

  • Model-Driven Design

從模型中獲取用于程序設(shè)計(jì)和基本職責(zé)分配的術(shù)語透典。讓程序代碼成為模型的表達(dá),代碼的改變可能會(huì)是模型的改變顿苇。而其影響勢(shì)必要波及接下來相應(yīng)的項(xiàng)目活動(dòng)峭咒。

  • 模型沒有派上用場的主要兩個(gè)原因
  1. 模型的一些意圖在傳遞過程中丟失了,模型的整體效果受細(xì)節(jié)的影響很大(在第二部分-模型驅(qū)動(dòng)的設(shè)計(jì)塊纪岁,第三部分-通過重構(gòu)來加深理解會(huì)有具體的討論)凑队。
  2. 模型與程序?qū)崿F(xiàn)及技術(shù)互相影響。
  • 大型項(xiàng)目仍然需要技術(shù)負(fù)責(zé)人來協(xié)調(diào)高層次的設(shè)計(jì)和建模幔翰,并幫助做出最困難或最關(guān)鍵的決策(本書的第四部分描述的就是這種決策)

模型驅(qū)動(dòng)的設(shè)計(jì)塊

分層架構(gòu).png

軟件中所表示的模型

  • 模型的關(guān)系
    至少有3中方法使得關(guān)聯(lián)容易控制
  1. 規(guī)定一個(gè)遍歷方向(很多多對(duì)多的可以從重要性方面抽離成一對(duì)多的關(guān)系)
  2. 添加一個(gè)限定符顽决,減少多重關(guān)聯(lián)(一對(duì)多添加限定條件之后可以抽離成一對(duì)一的關(guān)系)
  3. 消除不必要的關(guān)聯(lián)(清除那些對(duì)當(dāng)前工作或模型對(duì)象的基本含義來說不重要的關(guān)聯(lián))
  • Entity(實(shí)體-reference object-引用對(duì)象)

最基本的職責(zé)是確保連續(xù)性短条,以便使其行為更清楚且可預(yù)測(需要合理設(shè)計(jì)標(biāo)識(shí)-id)导匣。應(yīng)該擺脫這些細(xì)枝末節(jié)才菠,抓住ENTITY對(duì)象定義的最基本特征,尤其是那些用于識(shí)別贡定、查找或匹配對(duì)象的特征赋访。只添加那些對(duì)概念至關(guān)重要的行為和這些行為所必需的屬性。此外缓待,應(yīng)該將行為和屬性轉(zhuǎn)移到與核心實(shí)體關(guān)聯(lián)的其他對(duì)象中蚓耽。

  • Value Object

用于描述領(lǐng)域的某個(gè)方面而本身沒有概念標(biāo)識(shí)的對(duì)象稱為VALUE OBJECT(值對(duì)象)。VALUE OBJECT被實(shí)例化之后用來表示一些設(shè)計(jì)元素旋炒,對(duì)于這些設(shè)計(jì)元素步悠,我們只關(guān)心它們是什么,而不關(guān)心它們是誰瘫镇。應(yīng)該盡量消除Value Object的雙向關(guān)聯(lián)鼎兽。

  • Service

Service分為應(yīng)用層service和領(lǐng)域?qū)觭ervice。應(yīng)用層和Entity,ValueObject緊密關(guān)聯(lián)铣除,負(fù)責(zé)對(duì)領(lǐng)域?qū)ο蟮男袨檫M(jìn)行協(xié)調(diào)谚咬。

優(yōu)秀的領(lǐng)域service具有下面三個(gè)特征:

  1. 與領(lǐng)域概念相關(guān)的操作不是ENTITY或VALUE OBJECT的一個(gè)自然組成部分。
  2. 接口是根據(jù)領(lǐng)域模型的其他元素定義的尚粘。
  3. 操作是無狀態(tài)的(冪等)择卦。


    service分層.png

領(lǐng)域?qū)ο蟮纳芷?/h1>
領(lǐng)域?qū)ο蟮纳芷?png
  • 聚合(AGGREGATE)

我 們 應(yīng) 該 將 ENTITY 和 VALUE OBJECT 分 門 別 類 地 聚 集 到AGGREGATE中,并定義每個(gè)AGGREGATE的邊界郎嫁。在每個(gè)AGGREGATE中秉继,選擇一個(gè)ENTITY作為根,并通過根來控制對(duì)邊界內(nèi)其他對(duì)象的所有訪問泽铛。只允許外部對(duì)象保持對(duì)根的引用尚辑。對(duì)內(nèi)部成員的臨時(shí)引用可以被傳遞出去,但僅在一次操作中有效厚宰。由于根控制訪問腌巾,因此不能繞過它來修改內(nèi)部對(duì)象。

aggregate的固定規(guī)則.png
  • 工廠(FACTORY)

應(yīng)該將創(chuàng)建復(fù)雜對(duì)象的實(shí)例和AGGREGATE的職責(zé)轉(zhuǎn)移給單獨(dú)的對(duì)象铲觉,這個(gè)對(duì)象本身可能沒有承擔(dān)領(lǐng)域模型中的職責(zé)澈蝙,但它仍是領(lǐng)域設(shè)計(jì)的一部分。提供一個(gè)封裝所有復(fù)雜裝配操作的接口撵幽,而且這個(gè)接口不需要客戶引用要被實(shí)例化的對(duì)象的具體類灯荧。在創(chuàng)建AGGREGATE時(shí)要把它作為一個(gè)整體,并確保它滿足固定規(guī)則盐杂。

好的工廠有以下兩個(gè)特征:

  1. 每個(gè)創(chuàng)建方法都是原子的逗载,而且要保證被創(chuàng)建對(duì)象或AGGREGATE的所有固定規(guī)則哆窿。FACTORY生成的對(duì)象要處于一致的狀態(tài)。
  2. FACTORY應(yīng)該被抽象為所需的類型厉斟,而不是所要?jiǎng)?chuàng)建的具體類挚躯。
  • 存儲(chǔ)庫(REPOSITORY)

這里相當(dāng)于mybatis里面的mapper,也就是dao層。只為那些確實(shí)需要直接訪問的AGGREGATE根提供REPOSITORY擦秽。讓客戶始終聚焦于模型码荔,而將所有對(duì)象的存儲(chǔ)和訪問操作交給REPOSITORY來完成。

  • 一個(gè)貨運(yùn)跟蹤示意圖


    在一些關(guān)聯(lián)上對(duì)遍歷方向進(jìn)行了約束.png

通過重構(gòu)來加深理解

股份的抽象模型.png

使用Share Pie的Loan模型.png
  • 如何為那些不太明顯的概念建模
  1. 顯示的約束


    為顯式表達(dá)超訂策略而重構(gòu)的模型.png
  2. 將過程建模為領(lǐng)域規(guī)則

首先要說明的是感挥,我們都不希望過程變成模型的主要部分缩搅。在這里,我們討論的是存在于領(lǐng)域中的過程触幼,我們必須在模型中把這些過程表示出來硼瓣。否則當(dāng)這些過程顯露出來時(shí),往往會(huì)使對(duì)象設(shè)計(jì)變得笨拙置谦。

  1. 模式-SPECIFICATION(類似java里的predicate)


    SPECIFICATION.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末堂鲤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子霉祸,更是在濱河造成了極大的恐慌筑累,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丝蹭,死亡現(xiàn)場離奇詭異慢宗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奔穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門镜沽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贱田,你說我怎么就攤上這事缅茉。” “怎么了男摧?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蔬墩,是天一觀的道長。 經(jīng)常有香客問我耗拓,道長拇颅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任乔询,我火速辦了婚禮樟插,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己黄锤,他們只是感情好搪缨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸵熟,像睡著了一般副编。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旅赢,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天齿桃,我揣著相機(jī)與錄音,去河邊找鬼煮盼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛带污,可吹牛的內(nèi)容都是我干的僵控。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鱼冀,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼报破!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起千绪,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤充易,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荸型,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盹靴,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年瑞妇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稿静。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辕狰,死狀恐怖改备,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔓倍,我是刑警寧澤悬钳,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站偶翅,受9級(jí)特大地震影響默勾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倒堕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一灾测、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦媳搪、人聲如沸铭段。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽序愚。三九已至,卻和暖如春等限,著一層夾襖步出監(jiān)牢的瞬間爸吮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工望门, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留形娇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓筹误,卻偏偏與公主長得像桐早,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厨剪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容