軟件開發都是從混沌到清晰的一個結構化抽象的過程。在動筆寫代碼之前,我們需要搞清楚幾個問題:
(1) 系統解決什麼問題?
(2) 系統如何與環境交互?
(3) 系統的流程如何組織?
(4) 系統需要支持的變化範圍是什麼?等等。
思考清楚了這些問題,我們就可以抽象出符合我們需求的系統結構。本篇就來聊聊常用的系統結構。
1. 分層結構
分層結構是目前應用最廣泛的軟件結構,在該結構中,各子系統按照層次的形式組織起來,上層通過接口調用(或其他契約方式)使用下層的服務,而下層對上層則一無所知。最典型的是三層結構,以及由三層結構衍生出來的多層結構。
分層結構的優點包括:
(1) 可以有效降低系統的耦合性,提高內聚性,降低系統複雜度;
(2) 良好的可擴展性,提供了一個靈活框架,實現業務邏輯的高效重用;
(3) 易於維護。
2. 交互型結構
交互型結構也是應用廣泛的軟件結構,該類結構可以很好地抽象組件之間的交互關係。常見的交互型結構有MVC(Model-View-Controller)、MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)等。
2.1 MVC
MVC是目前Web開發領域的主流架構風格。
MVC結構將應用程序分成是三個核心部分:模型、視圖、控制器。在該結構中,模型和視圖可以直接交互,也可以通過控制器將其轉換爲間接交互。間接交互更符合鬆耦合的設計思想。首先,控制器接收來自視圖的用戶請求,並決定調用哪個模型來處理,模型將業務處理完成後,將結果返回給控制器,控制器調用相應的視圖來格式化輸出數據,並由選定的視圖呈現給用戶。
Model層承載底層業務邏輯,該層越厚越好,因爲它是和界面最爲無關的部分,也是最容易跨平臺實現的部分。Model層實現越多的底層邏輯,Controller層就越簡潔,對跨平臺開發較爲有利。
View: 處理應用程序中界面呈現的部分。
Controller: 應用程序中處理用戶交互的部分。可以有很多個Controller,分別負責不同的用戶交互需求,這些Controller是可以被“正交分解”的,使得彼此完全沒有耦合關係。一個Controller模塊,可能包含一些屬於自己的輔助View,也會接受View層委託的一些事件,由事件驅動自己的狀態,最終通過調用Model層的接口來完成某項業務。
2.2 MVVM
View層要呈現Model層的數據,有可能需要知道Model層詳細的數據結構,這就要求Model層可能需要爲View層提供一些專享的只讀訪問接口,但在實際使用中,要保證這些接口不被擴散使用。
View層根據Model層數據繪製界面,看似很簡單,而實際上,在實際呈現的過程中,可能爲了提升效率,進行一些局部更新的優化。在局部更新的優化比較複雜時,就不得不在Model和View之間,額外引入一層ViewModel來達到這一目的。ViewModel是了View的界面呈現而設計的Model層,它的數據組織更接近於View層的表達,和View層的數據呈現一一對應的關係。
MVVM的結構如下:
2.3 MVP
MVP結構更加明確地規定了Model和View之間不能存在直接交互。Presenter作爲Model和View的協調器,確保二者之間的交互通過Presenter來進行。
在瞭解了以上幾種數據結構之後,在實際使用中,我們應該如何選擇系統結構呢?兩條重要的規則是:
(1) 最低耦合原則:即不同的子系統或模塊之間有最少的交互頻率,使用簡潔而自然的接口進行數據交互;
(2) 單一職責原則:一個子系統或模塊只幹一件事情。