過程
DDD是告訴我們如何做好業務層!並以領域驅動設計思想來選擇合適的框架。
我們知道軟體的產生過程是:分析、設計、編程、測試、部署。過去,分析領域和軟體設計是分裂的,分析人員從領域中收集基本概念;而設計必須指明一組能在項目中適應編程工具構造的組件,這些組件必須能夠在目標環境中有效執行,並能夠正確解決應用程式出現的問題。 模型驅動設計(Model-Driven Design)拋棄了分裂分析模型與設計的做法,使用單一的模型來滿足這兩方面的要求。這就是領域模型。
DDD(Domain-DrivenDesign領域驅動設計)
2004年著名建模專家EricEvans發表了他最具影響力的著名書籍:Domain-DrivenDesign–TacklingComplexityintheHeartofSoftware(中文譯名:領域驅動設計 2006年3月清華出版社譯本,或稱DomainDriven-Designarchitecture[EvansDDD])。時值今日,DDD開發框架已經層出不窮(如RoR、RIFE、JdonFramework等),我們項目軟體包結構都變成了這樣:xxx.model;xxx.service,DDD思想可以說是遍地開花了.領域建模是一種藝術的技術,不是數學的技術,它是用來解決複雜軟體快速應付變化的解決之道.
模型驅動設計(Model-DrivenDesign)拋棄了分裂分析模型與設計的做法,使用單一的模型來滿足這兩方面的要求。這就是領域模型。單一的領域模型同時滿足分析原型和軟體設計,如果一個模型實現時不實用,重新尋找新模型。如果模型沒有忠實表達領域關鍵概念時,也必須重新尋找新的模型。建模和設計成為單個疊代循環。將領域模型和設計緊密聯繫。因此,建模專家必須懂設計,會編程。
層次
根據Eric的理論,業務層將細分為兩個層次:套用層和領域層。套用層:定義軟體可以完成的工作,並且指揮具有豐富含義的領域對象來解決問題,保持精練;不包括業務規則或知識,無業務情況的狀態;領域層:負責表示業務概念、業務狀態的信息和業務規則,是業務軟體核心。層次之間必須清晰分離,每個層都是內聚的,並且只依賴它的下層.
Eric特別指出:那種將業務邏輯交由業務界面處理的快速UI方式是旁門左道。希望象C/S結構那樣可視化拖拖圖形就完成的軟體開發是一種錯誤的方向,開發時快速,難於維護和擴展,雖然使用J2EE技術,其實是一種偽多層技術。建議購買"領域驅動設計"這本譯書學習下.
在領域對象的生命周期中,有三個模式來維護對象的完整性:聚合(Aggregate)定義清晰的所有權和邊界使模型更加緊湊,避免出現盤根錯節的對象關係網;工廠(Factory)和倉儲(Respository)。當一個對象生命周期之始,使用工廠和倉儲提供訪問和控制模型對象的方法。建立聚合的模型,並把工廠和倉儲加入到設計中來,可以使我們系統地對模型對象進行管理。聚合圈定出一個範圍,在這個範圍中,對象無論在哪個生命周期,保持不變性。
MF(MartinFowler)曾經提出有名的貧血模型或充血模型,他認為實體模型對象中只有弱行為setter和getter方法,沒有真正行為,好像缺少血液的人,不和諧了,而Eric認為,在DDD中,領域中的一些概念是不能作為模型中的對象來處理的,如果將這些功能概念強行加給實體對象和值對象,會破壞模型中對象的定義.我們的DDD項目中都是以充血模型存在著,所以,Eric呼喚:建模專家必須懂得實現,懂得軟體技術。