《領(lǐng)域驅(qū)動設(shè)計:軟件核心復(fù)雜性應(yīng)對之道》Eric Evans 2016年版本
序言:
關(guān)注領(lǐng)域枕赵,關(guān)注核心領(lǐng)域位隶,關(guān)注領(lǐng)域驅(qū)動的設(shè)計,關(guān)注模型驅(qū)動的開發(fā)篮昧。
對于業(yè)務(wù)本身就很復(fù)雜的程序開發(fā),你是無法回避這種復(fù)雜性糠睡,你所能做的只有控制這種復(fù)雜性疚颊。
本書描述并建立了領(lǐng)域驅(qū)動建模藝術(shù)的詞匯庫。提供了一個參考框架均抽。
在領(lǐng)域建模過程中不應(yīng)該將概念和實現(xiàn)割裂開來其掂。建模人員不僅要與業(yè)務(wù)人員溝通順暢,還要與開發(fā)人員一塊寫代碼深寥。
領(lǐng)域模型的最大價值在于它提供了一種通用語言贤牛,這種語言是將領(lǐng)域?qū)<液图夹g(shù)人員聯(lián)系在一起的紐帶。
領(lǐng)域模型設(shè)計驅(qū)動開發(fā)闰集,并不是“先建模般卑,后實現(xiàn)”的思維模式蝠检,而是隨著時間迭代演進模型和實踐。
在領(lǐng)域建模過程中不應(yīng)該與實現(xiàn)割裂開來叹谁。
概念與實現(xiàn)密不可分的主要原因在于本慕,領(lǐng)域模型的最大價值是它提供了一種通用語言,這種語言是將領(lǐng)域?qū)<液图夹g(shù)人員聯(lián)系在一起的紐帶监氢。
Eric的經(jīng)驗告訴我們,真正強大的領(lǐng)域模型是隨著時間演進的浪腐,即使是最有經(jīng)驗的建模人員也往往發(fā)現(xiàn)他們是在系統(tǒng)的初始版本完成之后才有了最好的想法议街。
---- Martin Fowler.
前言:
業(yè)務(wù)人員,開發(fā)人員吧雹,以及公共語言的領(lǐng)域模型涂身。這幾個之間并行工作且持續(xù)關(guān)聯(lián)。
成功的項目都有一個共同的特征丁鹉,那就是都有一個豐富的領(lǐng)域模型悴能,這個模型在迭代設(shè)計的過程中不斷演變,而且成為項目不可分割的一部分冯凹。
面對復(fù)雜領(lǐng)域的軟件開發(fā)團隊可以利用這個框架來系統(tǒng)性地應(yīng)用領(lǐng)域驅(qū)動設(shè)計记靡。
成功的項目摸吠,不僅僅要交付有用的軟件嚎花,而且還有后續(xù)的目標(biāo):交付能夠滿足組織后續(xù)需求,可以不斷演進的復(fù)雜軟件啼止。
很多系統(tǒng)的技術(shù)使用方面值得商榷兵罢,但是很多系統(tǒng)失敗在業(yè)務(wù)邏輯上,前面版本過早地變得僵化巩那,成為一個維護代價十分高昂的遺留系統(tǒng)。
在領(lǐng)域模型的基礎(chǔ)上噪生,反復(fù)精華东囚,在代碼上也要體現(xiàn)這些精華页藻。
復(fù)雜性的挑戰(zhàn):
在大多數(shù)軟件項目中,主要的焦點應(yīng)該是領(lǐng)域和領(lǐng)域邏輯份帐。
復(fù)雜的領(lǐng)域設(shè)計應(yīng)該基于模型弥鹦。
領(lǐng)域驅(qū)動設(shè)計是一種思維方式,它旨在加速哪些必須處理復(fù)雜領(lǐng)域的軟件項目的開發(fā)朦促。它有一套完整的設(shè)計實踐栓始,技術(shù)和原則。
領(lǐng)域驅(qū)動設(shè)計與敏捷開發(fā)過程相結(jié)合禀忆,互相增強落恼。
本書遵循兩個開發(fā)實踐:
1. 迭代開發(fā)佳谦。它是敏捷開發(fā)的基礎(chǔ)。
2. 開發(fā)人員和領(lǐng)域?qū)<揖哂忻芮械年P(guān)系钻蔑。領(lǐng)域驅(qū)動設(shè)計的實質(zhì)就是吸收消化大量知識咪笑,最后產(chǎn)生一個反映深層次領(lǐng)域知識并聚焦于關(guān)鍵概念的模型。領(lǐng)域?qū)<揖I(lǐng)域知識映跟,開發(fā)人員構(gòu)建模型和軟件。迭代式開發(fā)弯蚜,貫穿于項目的整個生命周期剃法。
第一部分:“運用領(lǐng)域模型” 提出領(lǐng)域驅(qū)動開發(fā)的基本目標(biāo),這些目標(biāo)是后面幾部分討論的實踐的驅(qū)動因素收厨。
第一章 消化知識
1.1. 有效建模的要素
軟件開發(fā)中的應(yīng)用所需知識的廣度令人望而生畏优构,龐大而復(fù)雜的信息也可能超乎想象钦椭。
領(lǐng)域模型正是解決此類信息超載問題的工具。模型這種知識形式對知識進行了選擇性的簡化和有意的結(jié)構(gòu)化侥锦。適當(dāng)?shù)哪P涂梢允谷死斫庑畔⒌囊饬x德挣,并專注于問題。
建模更像是制作電影 -- 出于某種目的而概括地反映現(xiàn)實番挺。就如同電影制片人講述股市或者闡明觀點時屯掖,他們會選擇素材懂扼,并以一種特殊的方式將他們呈現(xiàn)給觀眾右蒲,建模領(lǐng)域人員也會依據(jù)模型的作用來選擇具體的模型。
模型在領(lǐng)域驅(qū)動設(shè)計中的作用:
1.模型和設(shè)計的核心互相影響陷嘴。
2.模型是團隊所有成員使用的通用語言的中樞间坐。
3.模型是濃縮的知識。
有效建模的要素:
(1). 模型和實現(xiàn)的綁定劳澄。
(2). 建立了一種基于模型的語言秒拔。
(3). 開發(fā)一個蘊含豐富知識的模型。對象具有行為和強制性規(guī)則作谚。模型并不僅僅是一種數(shù)據(jù)模型庵芭,它還是解決復(fù)雜問題不可或缺的部分。模型包含各種類型的知識眨唬。
(4). 提煉模型好乐。
(5). 頭腦風(fēng)暴和試驗曹宴。語言和草圖,再加上頭腦風(fēng)暴活動区转,將我們的討論變成 “模擬實驗室”版扩,在這些討論中可以掩飾,嘗試和判斷上百種變化蜻韭。
1.2. 知識消化
金融分析師要消化理解的內(nèi)容是數(shù)字。
高效的領(lǐng)域建模人員是知識的消化者俯画。
信息的原始資料來自領(lǐng)域?qū)<翌^腦中的知識司草,現(xiàn)有系統(tǒng)的用戶泡仗,以及技術(shù)團隊以前在相關(guān)遺留系統(tǒng)或同領(lǐng)域的其他項目中積累的經(jīng)驗娩怎。
建模不僅僅在于尋找實體和值對象時胰柑,還需要尋找業(yè)務(wù)規(guī)則和業(yè)務(wù)活動。
在一個需要團隊成員持續(xù)學(xué)習(xí)的真實項目中魁巩,要想建立實用且清晰的模型則要求團隊成員既精通領(lǐng)域知識姐浮,也要精通建模技術(shù)卖鲤。
1.3. 持續(xù)學(xué)習(xí)
1.4 知識豐富的設(shè)計
1.5 深層模型
==================================================
第二章 交流與語言的使用
領(lǐng)域模型可成為軟件項目通用語言的核心。模型不僅僅局限于UML(統(tǒng)一建模語言)圖集晚。
通用語言的詞匯包括類和主要操作的名稱区匣。
模型之間的關(guān)系成為所有語言都具有的組合規(guī)則亏钩。詞和短語的意義反映了模型的語義。
開發(fā)人員應(yīng)該使用基于模型的語言來描述系統(tǒng)中的工作蛤签,任務(wù)和功能栅哀。而且領(lǐng)域?qū)<覒?yīng)該使用這種語言來討論需求留拾,開發(fā)計劃和特性。
將模型作為語言的支柱间驮。確保團隊在內(nèi)部所有的交流中以及代碼中堅持使用這種語言,在畫圖扛施,寫東西屹篓,特別是講話時也要使用這種語言。
只有一個模型在起作用妄荔,那么不同模型的共存谍肤,如何防止模型分裂荒揣。
討論系統(tǒng)時要結(jié)合模型。使用模型元素及其交互來大聲描述場景恳蹲,并且按照模型允許的方式將各種概念結(jié)合到一起俩滥。找到更簡單的表達(dá)方式來講出你要講的話霜旧,然后將這些新的想法應(yīng)用到圖和代碼中。
如果連經(jīng)驗豐富的領(lǐng)域?qū)<叶疾荒芾斫饽P秃奖常敲茨P鸵欢ǔ隽耸裁磫栴}棱貌。
在敏捷過程中,需求是隨著項目的前進而演變的婚脱,因為幾乎不存在現(xiàn)在的知識可以允許說明一個應(yīng)用程序障贸。
文檔和圖:
UML圖,主要是以類圖和對象交互圖為主涩维。
UML圖一方面過于細(xì)致,一方面過于遺漏蜗侈。
UML圖無法傳達(dá)模型的兩個最重要的方面睡蟋,一個方面是模型所表示的概念的意義戳杀,另一方面是對象應(yīng)該做哪些事情。
設(shè)計的重要細(xì)節(jié)應(yīng)該在代碼中體現(xiàn)隔缀。良好的實現(xiàn)應(yīng)該是透明的猾瘸,清楚地展示其背后的模型桥嗤。
文檔作為代碼和口頭交流的補充。
將代碼作為設(shè)計文檔的局限性荒吏,它可能會把讀代碼的人淹沒在細(xì)節(jié)中绰更。
文檔不應(yīng)該再重復(fù)表示代碼已經(jīng)表達(dá)出的內(nèi)容锡宋。
當(dāng)編程語言無法直接了當(dāng)?shù)貙崿F(xiàn)概念時执俩,文檔可以澄清設(shè)計意圖。我們應(yīng)該把書面文檔作為代碼和口頭討論的補充尝丐。
為了消除各種差異衡奥,需要使用諸如聲明式設(shè)計這樣的方法矮固,在這類方法中,程序元素用途的陳述決定了它在程序中的實際行為盹兢。
解釋性模型:
解釋性模型
第三章 綁定模型和實現(xiàn)
領(lǐng)域驅(qū)動設(shè)計要求模型不僅能夠指導(dǎo)早期的分析工作,還應(yīng)該成為設(shè)計的基礎(chǔ)蛤迎。
如果整個程序設(shè)計或其核心部分沒有與領(lǐng)域模型相對應(yīng)含友,那么這個模型就沒有價值的窘问,軟件的正確性也值得懷疑。同時把鉴,模型和設(shè)計功能之間過于復(fù)雜的對應(yīng)關(guān)系也是難以理解的庭砍,在實際項目中混埠,當(dāng)設(shè)計改變時也無法維護這種關(guān)系钳宪。若分析和設(shè)計之間差生嚴(yán)重分歧,那么再分析和 設(shè)計活動中所獲得的知識就無法彼此共享搔体。
Model-driven design(模型驅(qū)動設(shè)計)不再將分析模型和設(shè)計開發(fā)分離開,而是尋求一種能夠滿足這兩個方面的單一模型半醉。
為了使Model-Driven Design發(fā)揮作用疚俱,一定要在可控范圍內(nèi)嚴(yán)格保證模型和設(shè)計之間的一致性。
模型>>范式>>設(shè)計
任何參與建模的技術(shù)人員缩多,不管在項目中的主要職責(zé)是什么呆奕,都必須花時間了解代碼。
任何修改代碼的人員則必須學(xué)會用代碼來表達(dá)模型瞧壮。
每一個開發(fā)人員都必須不同程度地參與模型討論并且與領(lǐng)域?qū)<冶3致?lián)系登馒。
參與不同工作的人都必須有意識地通過Ubiquitous language與接觸代碼的人即使交換關(guān)于模型的思想。
第二部分:“模型驅(qū)動設(shè)計的構(gòu)建塊” 將面向?qū)ο箢I(lǐng)域建模中的一些核心的最佳實踐提煉為一組基本的構(gòu)建塊咆槽。使用標(biāo)準(zhǔn)模式可以為公共語言貢獻(xiàn)術(shù)語陈轿,使得所有團隊成員可以使用這些術(shù)語來討論模型和設(shè)計決策。
第四章 分離領(lǐng)域
第五章 軟件中所表示的模型
第六章 領(lǐng)域?qū)ο蟮纳芷?/b>
第七章 使用語言:一個擴展的示例
這一部分是討論一些能夠保持模型和實現(xiàn)之間互相協(xié)調(diào)并提高效率的設(shè)計決策麦射。
第三部分:“通過重構(gòu)來加深理解”討論如何將構(gòu)建塊配置為實用的模型蛾娶,從而實現(xiàn)其價值。
探索本身是永無止境的潜秋,但這并不意味著它是隨機的蛔琅。
第四部分:“戰(zhàn)略設(shè)計” 討論在復(fù)雜系統(tǒng),大型組織以及外部系統(tǒng)和遺留系統(tǒng)的交互中出現(xiàn)的復(fù)雜情況峻呛。
這一部分討論了作為一個整體應(yīng)用于系統(tǒng)的3條原則:上下文罗售,提煉和大型結(jié)構(gòu)。