在專案中引入領域驅動設計的經驗

2021-09-17 03:50:13 字數 1267 閱讀 3946

chris patuzzo近期在一次演講中介紹了領域驅動設計(ddd)的原則,並結合乙個基於ruby on rails的真實專案進行講解。在這次專案之前,chris所在的團隊為重新設計公司的主營**所做的兩個概念驗證都因為可伸縮性方面的問題而失敗了。因此,業務主管部門決定在這一次嘗試中採取一種更為敏捷的、增量式的方法,他們受到了ddd的啟發,在這次重啟的開發過程中全力促進開發者與領域專家的交流。

\\ patuzzo是which?的技術主管。在他看來,ddd的要點是捕捉到業務的概念,軟體的構建需要圍繞著對業務的理解而展開。在這次專案重啟的過程中,開發者開始學會與領域專家進行深入交流,以試圖理解整個業務的實際行為。在此基礎上設計出合適的領域模型,並找到系統中存在的各個邊界。按patuzzo的經驗來看,在具有清晰的邊界劃分的系統中開展工作要輕鬆許多。通過保持關注分離,系統將更易於理解,如果之後需要將系統中的某些部分提取出來,實現起來也會更簡單。

\\ ddd建議將問題分解為多個層,每一層各司其職,例如表示層、領域層以及基礎設施層。patuzzo特別提到在進行rails開發時存在著一種常見的實踐,即將領域層與基礎設施層合併在一起,這種方式顯然違背了ddd的建議。除了分層架構外,另一種選擇是由alistair cockburn定義的多邊形架構(hexagonal architecture),但patuzzo並不強烈主張這種架構風格,他認為這種架構可能會令人迷惑。他表示,這些架構有助於管理系統的複雜度,保持對核心領域的專注,但他也承認這些思想對於ruby社群來說還比較新鮮,需要一定的時間去適應。

\\ 衡量複雜度的一種方式是計算物件間的互動,通過使用聚合與聚合根,可以將這種互動限制在聚合之內,以及聚合根之間的互動,從而將這種互動的頻率減至最低。patuzzo將其稱為系統的表面區域。ruby專案通常會使用活動目錄(active record)這種設計方式,因此每個類都表現為全域性的常量,可以在系統中的每一處隨意訪問。為了繞開這個問題,開發者通常會用聚合的名稱作為類名的字首。通過將系統功能分解為聚合,使物件間的通訊顯得更為結構化。這種新的設計方式對於團隊來說確實引入了乙個陡峭的學習曲線,這一部分在開發過程中所產生的分歧也是最大的。但在專案的回顧會議中,patuzzo對於最終的結果表示很滿意。

\\ patuzzo在總結中表示:雖然全新的開發過程為開發者帶來了一些負擔,但好處也很明顯。開發者學到了ddd的基本模式與思想、如何將架構分解為多個層、關注分離的思想、以及如何設計乙個能夠應對變化的系統。由於新系統是基於乙個能夠充分表現業務需求的模型而建立的,因此他相信他的團隊將能夠更好地滿足新的需求。

\\檢視英文原文:experiences introducing ddd in a project

在專案中引入領域驅動設計的經驗

chris patuzzo近期在一次演講中介紹了領域驅動設計 ddd 的原則,並結合乙個基於ruby on rails的真實專案進行講解。在這次專案之前,chris所在的團隊為重新設計公司的主營 所做的兩個概念驗證都因為可伸縮性方面的問題而失敗了。因此,業務主管部門決定在這一次嘗試中採取一種更為敏捷...

在專案中引入領域驅動設計的經驗

chris patuzzo近期在一次演講中介紹了領域驅動設計 ddd 的原則,並結合乙個基於ruby on rails的真實專案進行講解。在這次專案之前,chris所在的團隊為重新設計公司的主營 所做的兩個概念驗證都因為可伸縮性方面的問題而失敗了。因此,業務主管部門決定在這一次嘗試中採取一種更為敏捷...

在專案中引入領域驅動設計的經驗

chris patuzzo近期在一次演講中介紹了領域驅動設計 ddd 的原則,並結合乙個基於ruby on rails的真實專案進行講解。在這次專案之前,chris所在的團隊為重新設計公司的主營 所做的兩個概念驗證都因為可伸縮性方面的問題而失敗了。因此,業務主管部門決定在這一次嘗試中採取一種更為敏捷...