書評 領域驅動設計與模式實戰

2021-09-17 05:45:25 字數 3341 閱讀 5807

最經典的書籍不一定最容易懂,正如陽春白雪之於下里巴人。在設計模式的世界中,gof的《設計模式》永遠都是人們推崇的經典,然而真正能夠將開發人員引入設計模式殿堂的,或許還是《深入淺出設計模式》(或其他類似書籍)。前者是永恆的經典,後者則是入門的經典。學習一門技術,正需要這樣面向不同讀者群的兩種經典。

\ 領域驅動設計(domain driven design,ddd)同樣如此。

\ 作為領域語言的奠基人,eric evans在領域驅動設計的地位,相當於eric gamma在設計模式中的地位。他的著作《領域驅動設計——軟體核心複雜性應對之道》,可謂領域驅動設計的奠基之作。要討論領域驅動設計,就不可能繞過eric evans;正如要討論重構,就不可能忽視martin fowler。

\ 那麼,有多少初學者可以在一開始閱讀該書,就能夠很好掌握領域驅動設計的核心概念?我想,能有如此收穫的,絕對是鳳毛麟角。原因無他,evans的講述過於深奧。如果在領域驅動設計的基礎之上,還要加上martin fowler提出的企業應用架構模式,以及xp中的測試驅動開發,我們還能找到一本好書嗎?答案是jimmy nilsson的《領域驅動設計與模式實戰》。

\ jimmy nilsson不一定是一名優秀的設計思想家,但在專案實戰方面絕對造詣非凡。軟體開發正是這樣的一門科學,用最專業、最簡練、最準確的語言描述,不一定能讓讀者醍醐灌頂;閱讀幾行**,分析幾幅uml圖,讀者反而會觸類旁通,有一種豁然開朗的感覺。本書的優秀正在於此。

\ 正如書中原文所述,「第一部分是有關布置場景的。」世間萬事萬物都不可能脫離其上下文而單獨存在。領域驅動設計與企業應用架構模式,並不是孤立的兩門技術,也不是憑空產生的超級理論,它們離不開軟體設計知識的厚積薄發。書中的第一部分是本書的綱領性篇章,內容涵蓋架構、領域驅動設計、測試驅動開發、重構、模式與持續整合。

\ 我很喜歡nilsson在書中的示例方式,他總是嘗試著給讀者幾個不同的方案,通過仔細地分析與比較來說明各種方案的優劣。他沒有將自己的意志強加於人,而是循循善誘。因為,設計本無絕對正確的方案,不同的應用場景,決定了不同的解決方案。他只是對自己的選擇給出恰如其分的建議。例如本書第二章中關於狀態模式的例項,就提出了四種不同的解決方案,並以大量的**來演示其實現。

\ 另外一種好的示例方式是完整,將每個過程都細緻地表現出來,從而給人一種真實專案的感受。在第三章中,關於測試驅動開發和重構的示例,正是以完整的案例演示了測試驅動開發的過程。其中包含有對測試的嘗試,工具的選擇,以及設計的優化。

\ 本書的精華集中在第二部分和第三部分。第二部分關注領域驅動設計,它能夠幫助我們正確地建立以領域模型為中心的設計思想。這部分的內容主要介紹了基於領域驅動設計分層中領域層的相關設計。首先通過分層架構模式,廓清了領域驅動設計的架構思想和架構風格。這一點非常關鍵。如果不明確架構的層次關係,就很容易將領域知識與資料訪問混雜在一起,從而導致設計目的的不明確與混亂。所謂「領域驅動設計」,即表明領域是設計的驅動力與導向,如果不能正確地建立以領域模型為中心的設計思想,那麼所謂的領域驅動設計,就只能是空中樓閣,或者是「掛羊頭賣狗肉」。有過程式設計經驗的開發人員已經習慣於從資料庫開始的設計方式,即使明確領域建模的重要性,在設計過程中,資料庫總會像一團幽靈一般不停地來困擾我們的思想。在分析領域模型時,我們總是會不由自主地想起,對於這樣乙個領域實體,在資料表中究竟該如何表示,物件之間的關係是如何通過主/外來鍵建立關聯的,資料表的字段如何進行資料的儲存?……諸如此類的問題,總是會紛至沓來。nilsson並不諱言這一點,他自己也經歷過如此的轉變。正因為這樣的寶貴經驗,他才能夠在書中給予我們正確實施領域驅動設計的真知灼見。

\ 領域驅動設計從來不是一蹴而就的,書中的內容非常準確地表達了這樣乙個觀點。如何精化領域模型,方法就是測試驅動開發。書中的第5章完整地描述了這一過程,從編寫第乙個測試用例,到引入領域模式,細化流程,以及對基礎架構實現的考慮。書中的**包含兩部分:測試**與實現**;書中的uml圖也分為兩種風格:隨手塗鴉的草圖和uml工具繪製的類圖。這樣的示例演示過程如此之真實,給讀者的感覺不是在閱讀書籍,而是親臨專案組,與nilsson一起討論設計方案,共同推進領域驅動設計。這種閱讀感覺是無比美妙的。

\ 勿庸諱言,martin fowler提出的企業應用架構模式並不易於應用,即使是設計老鳥,在選擇企業應用架構模式時,也會陷入迷茫、彷徨或者進退失據的境地。martin fowler在設計方面具備的歸納、總結以及抽象的能力已經登峰造極。他總能化腐朽為神奇,或者發現常人所未見的技巧與思想。《重構》如此,《企業應用架構模式》同樣如此。然而,令人遺憾的是,《企業應用架構模式》一書雖然有了很好的歸納與分類,但模式種類的繁多仍然會讓人無從做出選擇,所謂「亂花漸欲迷人眼」。而書中僅限於「玩具專案」的引入,並以片段而非整體的方式進行案例介紹,總會給人一種隔靴搔癢的感覺。nilsson的《領域驅動設計與模式實戰》正好彌補了這一缺陷。在應用企業應用架構模式時,他仍然延續了第二部分的案例,並結合領域驅動設計的分層模式,重點講解了在實現基礎架構過程中如何應用和選擇企業應用架構模式。

\ 當然,本書的這一部分內容還不夠完美,因為他主要針對的是領域模式的應用,至於其餘企業應用架構模式,例如分布式、併發、服務等諸多內容,則淺嘗輒止,頗有幾分意猶未盡的感覺。以第三部分的第9章《應用nhibernate》為例,固然考慮了應用和實踐,完整地展示了nhibernate處理orm的過程;卻正因為如此,顯得深度不夠,沒有很好地將企業應用架構模式和領域驅動設計進行深度挖掘,反而像是一篇介紹nhibernate入門的低階讀物。

\ 事實上,不僅是這一章的內容,整個第四部分《下一步驟》都給人這樣的感覺。或許因為這部分內容並非nillsson的創作,使得在敘述風格產生了不統一。當然,這未免有些吹毛求疵了。如果割裂開來看這些內容,每一篇都算得上是介紹軟體設計應用與實踐的佳作。這些內容涵蓋的面也非常廣泛,包括soa、控制反轉與依賴注入、aop、mvc模式等內容。我在閱讀這些內容的時候,總覺得作者還沒有完全把這些內容展開,只能說浮現出冰山一角。這讓我感覺不甘。可若是真的能做到這一點,恐怕本書就會變得和磚頭一般的笨重了。

\ 回過頭再來思考本書,它是面向初學者的入門級讀物嗎?我想不是。沒有足夠的設計能力和思想的積累,很難真正讀懂本書。但它給予的實踐性設計指導,卻無疑簡化了它的閱讀難度。據我的閱讀經驗來看,若希望掌握領域驅動設計,比較好的閱讀途徑是:首先閱讀eric evans的《領域驅動設計——軟體核心複雜性應對之道》(前提是你了解足夠多的設計模式知識,以及與設計相關的知識,例如uml、重構以及測試驅動開發)。是的,這本書相對較難,我們很難讀懂。但我的建議是可以讀書「不求甚解」。遇到不明之處,做個標記,然後放過它,以迂迴的方式往前走。這其中,可以適當參考infoq的迷你書《領域驅動設計精簡版》,它對實體、值物件、聚合、服務、工廠以及資源庫等領域物件和模式的描述實在是簡明扼要,令人印象深刻。在對領域驅動設計已經有了比較直觀和深入的概念之後,再閱讀nilsson的《領域驅動設計與模式實戰》一書,你一定會有一種豁然開朗,如曲徑通幽的感覺。我想,當你閱讀完本書之後,一定會迫不及待地嘗試使用領域驅動設計來完善或重構舊有的設計。不過,千萬不要奢望從此之後你就能一馬平川,真正遇到領域驅動設計相關知識的疑惑,還是需要回頭閱讀eric evans的著作。此時的你,一定能從該書中找到你希望知道的答案。

讀《領域驅動設計與模式實戰》

有關領域驅動方面的書籍不多,jimmy的 領域驅動設計與模式實戰 便是其中的一本。讀本書前,最好有讀過eric的 領域驅動設計 ddd 與martin fowler的 企業應用架構模式 poeaaa 否則很難看懂。這是一本注重實踐與應用的書籍,作者將多年從事軟體開發的經驗融入書中,結合tdd向讀者展...

書籍推薦 領域驅動設計與模式實戰

我們在平時的學習中或多或少的接觸到一些領域驅動設計 domain driven design,ddd 這些概念,這些概念也非常抽象,最重要的在國內也沒有這方面的優秀書籍或者指導手冊。也沒有一些典型的sample提供我們學習ddd。當然了,對於開始學習ddd的人來說,領域驅動設計與模式實戰 這本書還是...

讀《領域驅動設計模式 原理與實踐》

美國,scott millett,nick tune 示例用的是 c 我喜歡本書的原理部分就是前部分。不喜歡的點是 建立和維護軟體的難處。bbom 是一大片隨意構造 雜亂無章 凌亂 任意拼貼 毫無頭緒的 叢林。大泥球,big ball of mud 領域複雜性和技術複雜性混合在了一起。的結果。缺乏應...