- 首先滚局,在領(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)域模型
- 有效建模的要素
- 模型和實(shí)現(xiàn)的綁定(正因?yàn)橐獙?shí)現(xiàn)荣瑟,建模不只是領(lǐng)域?qū)<业氖虑椋€需要開發(fā)人員參與)
- 建立了一種基于模型的語言(領(lǐng)域?qū)<液烷_發(fā)人員可以持續(xù)基于模型語言進(jìn)行討論和展開)
- 開發(fā)一個(gè)具有豐富知識(shí)的模型庫(業(yè)務(wù)活動(dòng)和規(guī)則都是領(lǐng)域的核心)
- 不停提煉模型(模型不是不變的溉奕,需要不停迭代和更新)
- 頭腦風(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)域模型鳄梅。 - 圖
- 簡單叠国、非正式的UML圖能夠維系整個(gè)討論。
- 圖是一種溝通和解釋手段戴尸,它們可以促進(jìn)頭腦風(fēng)暴粟焊。簡潔的小圖能夠很好地實(shí)現(xiàn)這些目標(biāo),而涵蓋整個(gè)對(duì)象模型的綜合性大圖反而失去了溝通或解釋能力孙蒙,因?yàn)樗鼈儗⒆x者淹沒在大量細(xì)節(jié)之中项棠,加之這些圖也缺乏目的性。
- 通常的用法是以圖為主挎峦,輔以文本注釋香追;而我更愿意以文本為主,用精心挑選的簡化圖作為說明坦胶。
- 文檔
- 文檔應(yīng)作為代碼和口頭交流的補(bǔ)充
- 文檔應(yīng)當(dāng)鮮活并保持最新
綁定模型和實(shí)現(xiàn)
- Model-Driven Design
從模型中獲取用于程序設(shè)計(jì)和基本職責(zé)分配的術(shù)語透典。讓程序代碼成為模型的表達(dá),代碼的改變可能會(huì)是模型的改變顿苇。而其影響勢(shì)必要波及接下來相應(yīng)的項(xiàng)目活動(dòng)峭咒。
- 模型沒有派上用場的主要兩個(gè)原因
- 模型的一些意圖在傳遞過程中丟失了,模型的整體效果受細(xì)節(jié)的影響很大(在第二部分-模型驅(qū)動(dòng)的設(shè)計(jì)塊纪岁,第三部分-通過重構(gòu)來加深理解會(huì)有具體的討論)凑队。
- 模型與程序?qū)崿F(xiàn)及技術(shù)互相影響。
- 大型項(xiàng)目仍然需要技術(shù)負(fù)責(zé)人來協(xié)調(diào)高層次的設(shè)計(jì)和建模幔翰,并幫助做出最困難或最關(guān)鍵的決策(本書的第四部分描述的就是這種決策)
模型驅(qū)動(dòng)的設(shè)計(jì)塊
軟件中所表示的模型
- 模型的關(guān)系
至少有3中方法使得關(guān)聯(lián)容易控制
- 規(guī)定一個(gè)遍歷方向(很多多對(duì)多的可以從重要性方面抽離成一對(duì)多的關(guān)系)
- 添加一個(gè)限定符顽决,減少多重關(guān)聯(lián)(一對(duì)多添加限定條件之后可以抽離成一對(duì)一的關(guān)系)
- 消除不必要的關(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è)特征:
- 與領(lǐng)域概念相關(guān)的操作
不是
ENTITY或VALUE OBJECT的一個(gè)自然組成部分。 - 接口是根據(jù)領(lǐng)域模型的其他元素定義的尚粘。
-
操作是無狀態(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ī)則盐杂。
我 們 應(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ì)象。
應(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è)特征:
- 每個(gè)創(chuàng)建方法都是原子的逗载,而且要保證被創(chuàng)建對(duì)象或AGGREGATE的所有固定規(guī)則哆窿。FACTORY生成的對(duì)象要處于一致的狀態(tài)。
- 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)來加深理解
- 如何為那些不太明顯的概念建模
-
顯示的約束
為顯式表達(dá)超訂策略而重構(gòu)的模型.png - 將過程建模為領(lǐng)域規(guī)則
首先要說明的是感挥,我們都不希望過程變成模型的主要部分缩搅。在這里,我們討論的是存在于領(lǐng)域中的過程触幼,我們必須在模型中把這些過程表示出來硼瓣。否則當(dāng)這些過程顯露出來時(shí),往往會(huì)使對(duì)象設(shè)計(jì)變得笨拙置谦。
-
模式-SPECIFICATION(類似java里的predicate)
SPECIFICATION.png