在使用領域驅動模型(DDD)核心理念和實踐作為軟件設計和開發的指導方針時,可以概括為三個原則:捕獲、嵌入、防護。這是Steven A. Lowe在今年的DDD交流大會上演講時提出的。為了采取積極的行動,我們通過掌握剛好夠用的信息來捕獲領域模型。我們將模型嵌入到代碼和對話中。我們保護領域模型免受其他領域的侵蝕,尤其是技術領域。
在Thoughtworks首席顧問Lowe看來,DDD的出現是一種突破,因為它打破了對企業數據模型的錯誤沉迷,并代之以專注于合作領域的、獨立但重疊的模型。他強調,DDD改變了軟件開發的關注點和范圍,從技術視角轉向了以業務目標指導探索和解決方案。他認為,雖然人們對于DDD還存在一些誤解,但他指出,那些都是錯的:
DDD很難。不,它需要專注和自律,但編程也是如此。DDD會帶來額外負擔。除非你認為沒有必要了解一個領域。DDD僅適合復雜的領域。也許復雜的領域最需要,但這種理念肯定是普遍適用的。捕獲的目的是可視化領域的思維模型,讓其具備交互性,從而使所有人都達成一致。在Lowe推薦的模型創建方法中,其中一種是把所有人都召集到一個房間里,讓他們專注于領域活動。這項技術被稱為事件風暴——一種由Alberto Brandolini創建的集體建模方法。Lowe發現,這種方法非常強大,可以最大化學習速度,最小化學習負擔。
在將領域模型嵌入到代碼時,兩個重要的部分是命名和組合,前者可以反映領域意圖,而后者可以反映領域行為。Lowe指出,如果你不能給一個東西起個好名字,則可能說明你對你要命名的東西不夠了解。由于文檔和圖表都會過期,所以代碼才是唯一可靠的事實來源。通過將領域模型嵌入到代碼,就可以保證模型永遠正確,而且對于開發人員隨時可見。在更高層面上,領域專家也可以讀懂代碼。
為了保護領域模型免受侵蝕,我們使用邊界將子領域隔離開。上下文的邊界是其接口,即進進出出的命令和事件。但是,邊界的強度也很重要,需要在接口中完成什么驗證和轉換?一種實用的方法是使用模塊從物理上隔離子領域。這樣做的好處包括,代碼庫耦合度更低,更有彈性。Lowe指出,爭取在編碼的第一時間避免技術債務比后續消除它更簡單。
Lowe最后強調,捕獲-嵌入-防護是一個迭代過程,會隨著每個步驟重復多次,從較小的經過驗證的模型逐步構建出一個領域模型。他還指出隨時隨地使用領域驅動設計的重要性;如果你不是有意對領域建模,那么你就不會無意中為其他東西建模。
查看英文原文: Capture - Embed - Protect, Guidelines for Domain-Driven Design