1. 分層軟件架構
分層架構是軟件的軟件中最常用的架構設計方法,如clean架構、MVP架構等。
分層的實質是隔離關注點,使得每一層具有一致的行爲,這樣不同的開發纔有可能關注不同的軟件層。如WEB開發中常用的前後端分離,前端關注的是用戶體驗,後端關注的是穩定可靠的服務。再比如DDD中主張將領域和應用進行分離,從而能夠獲得一個比較穩定的領域能力層。
解耦的本質是分離變化點,將不同的變化點分離到不同的層次或模塊中,使得其職責更單一,從而有利於軟件的開發、維護和擴展。
因爲用戶對其完成某一系列業務case的完整性並沒有隨着解耦而消失,因此在分層的軟件架構中除了分和解,還要有合。通過聚合層、各類中間件sdk等來完成用戶的具體業務case。
分、解、閤中,分和解是軟件研發組織內部的訴求,不是用戶訴求,主要完成用戶界面、業務邏輯和數據存儲幾大類任務的分層和解耦。合是基於分和解的結果,實際是其難度更大,否則會造成合的結果耦合過重導致難於維護。因此,分和解時要考慮到合,只有同時考慮到分、解、合的架構纔是一個完整的架構。
2. 各軟件層間的數據解耦和轉換
採用分層的軟件架構後,在各個軟件層上都要有自己的數據模型,但由於用戶業務的完整性,各個軟件層的數據又需要相互轉換,從而完成軟件的“分”與“合”。各個軟件層的數據模型一般要滿足如下約束:
-
每個軟件層只能使用自己的數據模型
-
軟件層間的數據模型通過轉換器相互轉換
分層架構中常用的數據模型是VO、DTO、 DO和PO,解析如下:
-
VO(View Object):視圖對象,用於表示層,它的作用是封裝頁面(或組件)的數據
-
DTO(Data Transfer Object):數據傳輸對象,用於表示層與服務層之間的數據傳輸對象
-
DO(Domain Object):領域對象,從現實世界中抽象出來的有形或無形的業務實體
-
PO(Persistent Object):持久化對象,它跟持久層(通常是數據庫)的數據結構形成一一對應的映射關係,如果持久層是關係型數據庫,那麼,數據表中的每個字段(或若干個)就對應PO的一個(或若干個)屬性
其中,各個數據模型的轉換關係如下:
-
用戶發出請求,其請求中的數據在UI層表示爲VO
-
UI層把VO轉換爲業務層對應方法所要求的DTO並傳送給服務層(在WEB開發中,DTO爲API接收到的參數)
-
業務層首先根據DTO的數據構造(或重建)一個DO,調用DO的業務方法完成具體業務
-
業務層把DO轉換爲存儲層對應的PO,調用相應的存儲層的持久化方法,把PO傳遞給它,完成存儲操作
-
對於逆向操作,如讀取,也採取類似的方法進行轉換和傳遞