《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)-軟件核心復(fù)雜性應(yīng)對之道》讀后感

全書共分為3個(gè)部分

第一部分 基礎(chǔ)

講構(gòu)成DDD的基礎(chǔ)概念元素,以及如何在建模過程中使用這些概念.
業(yè)務(wù)模型由對象對象關(guān)系構(gòu)成了一張復(fù)雜的對象圖,稱之為業(yè)務(wù)模型.主要講了如何處理對象關(guān)系;對象包含哪些類型(實(shí)體,值對象,服務(wù),工廠,倉庫);對象圖如何劃分(聚合,模塊).

  • 關(guān)聯(lián)
    對象之間的關(guān)聯(lián),在對象圖中用線表示,代表某種業(yè)務(wù)關(guān)系,如:屬于,擁有,包含等等.
    訪問對象可以有兩種方式,一種是利用對象之間的關(guān)聯(lián)關(guān)系,進(jìn)行遍歷訪問,另一種則是通過Repository進(jìn)行全局訪問.
    為了簡化對象圖中的復(fù)雜關(guān)聯(lián)關(guān)系,通常進(jìn)行以下操作:
    (1)規(guī)定一個(gè)遍歷方向,使無向邊變?yōu)橛邢蜻?br> (2)添加一個(gè)限定符,以便減少多重關(guān)聯(lián).
    舉例:
    一個(gè)國家可以有多位總統(tǒng),表示為: 國家 --> List<總統(tǒng)>
    但是如果考慮一段時(shí)間內(nèi)一個(gè)國家只有一位總統(tǒng),那么以時(shí)間段作為限定符,可以將一對多關(guān)系簡化為約束的一對一關(guān)系,表示為: 國家 --> Map<時(shí)間段,總統(tǒng)>
    (3)消除不必要的關(guān)聯(lián),刪除掉對解決業(yè)務(wù)問題無關(guān)的邊.
  • 實(shí)體
    實(shí)體具有唯一標(biāo)識(shí),隨著時(shí)間推移,其生命周期內(nèi)狀態(tài)(或叫屬性)會(huì)連續(xù)變化,我們需要根據(jù)標(biāo)識(shí),來跟蹤對象狀態(tài)的變化,這種對象叫做實(shí)體.
    在實(shí)體設(shè)計(jì)時(shí),定義標(biāo)識(shí)是關(guān)鍵步驟.
    在建模時(shí)通常定義一個(gè)通用接口Entity,讓實(shí)體類顯示實(shí)現(xiàn)接口,便于對象分類.
  • 值對象
    值對象沒有概念上的唯一標(biāo)識(shí),它們用于描述某種特征.如:Color類用于描述顏色.
    值對象可以引用實(shí)體,實(shí)體也可以引用值對象.
    值對象一般不可變的,這里的不可變指的是值對象內(nèi)部的引用關(guān)系不可變.
    如:一個(gè)值對象引用一個(gè)實(shí)體,這種引用關(guān)系不可變,但實(shí)體內(nèi)部狀態(tài)可以改變.
    值對象不可變的特性,可以方便其被其他對象共享,并確保引用傳遞的安全性.
    值對象內(nèi)部屬性變更,通常通過原型模式創(chuàng)建新對象來完成.
  • 服務(wù)
    業(yè)務(wù)領(lǐng)域中有一些操作,不適合歸屬于任何對象,因此單獨(dú)歸屬為Service.
    它們往往以活動(dòng)命名,是動(dòng)詞而不是名詞,并帶有Manager后綴.
    服務(wù)對象無狀態(tài).
  • 工廠
    如果對象創(chuàng)建也是一個(gè)復(fù)雜的過程,應(yīng)該讓Factory承擔(dān)這個(gè)復(fù)雜的裝配過程.
  • 倉庫
    就是解決從存儲(chǔ)介質(zhì)中重建對象的,為業(yè)務(wù)提供實(shí)體全局訪問的能力.
    與工廠的區(qū)別是,工廠解決的是新建的問題,倉庫解決的是存儲(chǔ),檢索和重建的問題.
  • 聚合
    前文提到對象圖是一張巨大且復(fù)雜的網(wǎng)絡(luò)圖,這其中某些對象之間需要滿足一些固定的業(yè)務(wù)規(guī)則限制,如:退款交易總金額不能超過原支付金額;貨物總重不能超過運(yùn)輸船容量;等等.聚合就是用來識(shí)別和劃定一致性范圍的.
    聚合指的是具有一致性規(guī)則約束的一組對象的集合,它本質(zhì)上是一致性規(guī)則約束的范圍邊界.
    每個(gè)聚合都有一個(gè)實(shí)體作為根對象,外部只能通過聚合根訪問或操作聚合邊界內(nèi)部的對象,而無法直接訪問.
    聚合內(nèi)對象也可以關(guān)聯(lián)其他聚合的根對象.
    聚合內(nèi)部的一致性約束和聚合間的關(guān)聯(lián),最終映射到事務(wù)上,表現(xiàn)為事務(wù)的嵌套.
    聚合如果想要通過編碼體現(xiàn)的話,通常是通過分包的方式,把聚合內(nèi)對象分到一個(gè)包中.
  • 模塊(domain與其他層的劃分,domain內(nèi)部劃分)
    模塊也是對象圖的劃分方式,核心解決的是認(rèn)知超載的問題,使我們可以對業(yè)務(wù)問題進(jìn)行聚焦.
    上文提到,聚合可以通過模塊劃分的方式,在代碼中具體體現(xiàn).
    當(dāng)然,多個(gè)內(nèi)聚的聚合也可以整合為更大的父模塊.
    再進(jìn)一步,所有領(lǐng)域?qū)ο笤僬蠟楦蟮母父改Kdomain,與application,infrastructure并列構(gòu)成整個(gè)應(yīng)用,形成了分層架構(gòu).
    總體如下:
application
domain
    |-- aggregate
        |-- entity
        |-- value object
infrastructure

第二部分 保持重構(gòu)

這部分核心傳遞了一個(gè)思想,就是要敢于重構(gòu),根據(jù)自己對業(yè)務(wù)不斷的認(rèn)知迭代,去精化業(yè)務(wù)模型.還講述了如何通過柔性設(shè)計(jì)來讓模型易于被修改.
這里面強(qiáng)調(diào)的是模型的表達(dá),和對象的設(shè)計(jì)兩個(gè)方面.
模型表達(dá),讓后人易于理解,敢于修改.
對象設(shè)計(jì),讓修改變的容易,且對現(xiàn)狀的沖擊小.

第三部分 戰(zhàn)略設(shè)計(jì)(限界上下文,精煉,大型結(jié)構(gòu))

這部分更多解決的是企業(yè)級(jí)業(yè)務(wù)模型面臨的問題.
所謂企業(yè)級(jí),特點(diǎn)是業(yè)務(wù)概念多而復(fù)雜,組織架構(gòu)劃分也可能導(dǎo)致不同團(tuán)隊(duì)業(yè)務(wù)模型不統(tǒng)一,對系統(tǒng)集成和業(yè)務(wù)認(rèn)知都存在阻礙作用.
通過定義限界上下文,把企業(yè)級(jí)業(yè)務(wù)模型問題轉(zhuǎn)化為限界上下文之間的集成問題.
分別介紹了共享內(nèi)核,客戶/供應(yīng)商模式,追隨者模式,防腐層模式,各行其道模式等幾種不同的集成方式.
還介紹了如何通過精煉,產(chǎn)生企業(yè)級(jí)模型的高度概覽視角.
最后,是如何組織大型結(jié)構(gòu),以及如何表達(dá)大型結(jié)構(gòu).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容