軟件架構設計模式簡述

在軟件開發設計中我們經常會面對業務分析,提取領域問題,從而實現軟件架構設計。關於 軟件架構設計Martin Fowler在2004出版的《企業應用架構模式》中 概括了四種方式的架構模式。它們分別爲事務性腳本,表驅動模式,活動記錄模式,領域驅動設計。前兩者事務性腳本,表驅動模式作爲 面向過程方式架構設計,後兩者爲面向對象架構設計。它們適合於不同的業務場景,它們也各有長短。

事務腳本模式

事務腳本模式是架構設計中最簡單的架構模式,面向過程模式。該模式以用戶的操作,UI表現爲起點,設計業務組件, 即業務邏輯將直接映射到用戶界面的操作。這通常是從表現層邏輯出發,表現層需要什麼那麼業務層就提供什麼, 直到數據層。針對每一個用戶的新功能都需要新增一個從UI到關係數據庫的分支流程。其適用於邏輯不是 很複雜或者變化不會太大的穩定的應用系統開發。其不需要付出與業務無關的額外代價,並且在現代可見即可得的IDE 結合,能夠很快的進行快速應用開發(RAD)。但是這種優勢,也是其最大的劣勢,程序中充滿了IF-else, switch-case之類的邏輯或者大量的static的方法,每個功能都是一個程序分支,這對代碼無法重用。 編碼不易於維護,對複雜項目和變化需求不適應。

表驅動模式

表驅動模式爲每個數據庫表定義一個表模塊類,包含操作該數據的所有行爲方法。作爲一個容器,將數據 和行爲組織在一起。其對數據的粒度針對於數據表,而非數據行,因此需要以集合或者表(DataTable)傳遞數據信息。 表驅動模式基於對象但是完全由數據庫驅動開發,在業務模型和數據庫關係模型顯著差異的情況下,應對需求, 並不是那麼適合。但是在.net中提供的一些列如強類型DataSet等IDE的輔助下自動生成大量的代碼, 也是一個不錯的選擇,因爲部分數據庫的操作趨於自動化。表驅動模式沒有太過於關注業務邏輯,而是關注數據庫 表結構。而業務邏輯和領域問題纔是軟件核心,所以對於複雜的場景也存在不能很好的勝任。

活動記錄模式

活動記錄模式是一個以數據庫表一行Row爲對象,並且對象中包含行爲和數據的模式方法。其數據對象 很大程度的接近數據庫表結構。在活動記錄模式中對象通常也包含架構設計和擴展對象的CRUD(增刪改查)的行爲,以及數據驗證等業 務規則。對於業務不是很複雜,對象關係與關係模型映射不具有很大差異情況,活動記錄模式會運用的 很好。活動模式比較簡單化設計,在現行的如Linq to sql,ActiveRecord框架, spring JDBC(Active Record),Ruby On Rails之類的框架之下, 將針對問題領域不是太過複雜的中小型項目十分有用,而且能做到快速,並且有較好設計的架構設計和擴展。 但是其模式和數據庫表結構的過度的相互依賴,導致若你修改 數據庫結構,你不得不同時修改對象以及相關邏輯。如果不能保證數據庫關係模型和對象模式的很大程度 的相似這就進入的困境,無法解決對象和數據庫結構的映射。

領域驅動設計(DDD)

在我們所述前面的幾種架構模式都是在項目開始站在了以數據爲中心的角度,而不是業務本身的問題領域。 而領域驅動設計模式是着重關注於系統的業務問題領域,首先開始爲領域對象設計。與活動記錄模式來說, 領域模型完全反映於問題領域業務概念模型邏輯,與數據庫,持久化機制完成獨立,其推崇持久化透明(POCO)。 其可以充分利用面向對象設計,不受持久化機制的任何約束。其爲完全由業務驅動出來的。但是其最大的優勢如上 各個模式一樣也是其最大的劣勢領域對象模型與關係模型具有天然的阻抗,領域實體對象早晚會需要映射到 持久化機制,有時我們必須等爲了這種阻抗而讓步。在當前有NHibearnate,EF,Fluent NHibearnate這類 ORM(Object Relation Mapping)框架輔助。

領域驅動設計是Eric Evans於2004年在《領域驅動設計:軟件核心複雜性應對之道》 首先提出的,簡稱DDD.其實際爲面向對象分析設計(OOAD)的延伸,利用面向對象思想進行分析設計,對系統邏輯嚴格 分層,對領域對象的的職責劃分。領域邏輯按照職責和內聚的劃分在不同的領域對象上,對象不再是單純的數據載體,而應該 是一個具有行爲,邏輯的富對象。

同時領域驅動設計中分層架構也是很重要的一部分,這是分離關注點(SOC)的體現。按照職責對每一層次劃分。大體分爲 表現層,業務邏輯層,倉儲層,領域層,以及基本出設施層。以及後來所倡導的CQRS(讀寫分離).在層次之間爲了應對面向對象設計 所有存在領域模型(DO),然而我們常用的存儲卻是關係類型(PO),所以還存在ORM(Object Relation Mapping).以及爲了更好的 適應UI的表現存在視圖對象(VO,有時我們簡單VO的存在直接用數據傳輸對象(DTO)代替),所以存在DTO Mapping,在這裏的VO或者DTO,往往 都是一層簡單getter,setter的數據載體。

在領域驅動設計中還包含工作單元(UOW)),倉儲,值類型,實體,聚合根,領域事件,領域邊界,以及領域跟蹤一類的概念,關於這些更多的只是 請參考《企業應用架構模式》,以及實現領域驅動設計

最後推薦最新的領域驅動設計書籍資料:此書被DDD鼻祖Eric Evans譽爲繼其開山之作後,近十年內第一本將DDD落到具體(接地氣)的經典書籍。

實現領域驅動設計


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章