王躍
(四川大學 計算機學院,四川成都 610065)
MVVM模型,是由微軟開發人員為了降低復雜用戶界面程序的開發復雜性而提出的一種前端設計模式[1]。作為MVC經典模型的擴展、升級,MVVM實現了視圖層(View)與數據模型層(Model)的完全解耦,可以使系統開發者和設計者完全獨立、并行地工作。因為MVVM的諸多優點,目前非常多的主流用戶界面程序開發平臺都采用該模型。
但在實際應用程序開發過程中,我們發現,采用傳統MVVM模型進行設計開發的程序不能很好地適應軟件需求變更,也不能準確、完整地實現需求復雜性較高的系統[2]。分析原因可知,MVVM模型的關注點是業務數據,是數據驅動的開發模式,并沒有從業務領域解決開發人員與領域專家之間的溝通問題。
對此,本文在用戶界面程序MVVM模型中,加入領域驅動設計的思想,提出了領域驅動的MVVM架構設計模型。將軟件分析與設計的關注點引導到業務上來,使用領域模型作為分析與設計的通用語言(Ubiquitous Language)。領域驅動的MVVM模型,以領域模型為核心,指導相關人員以領域驅動的思想進行系統分析、設計、開發工作,形成了統一的系統語言(Ubiquitous Language),使最終實現的軟件真正滿足需求。
本章1.1節和1.2節分別介紹了MVVM模型和領域驅動設計,為下文提出領域驅動的MVVM架構模型奠定了理論基礎。
MVVM中很重要的一項技術,即“數據綁定(Data Binding)”技術[3]。數據綁定技術實現了View與Model的完全解耦。其中View與ViewModel是一一對應的,業務邏輯保存在ViewModel中,作為領域數據對象的Model是“貧血”模型。MVVM架構沒有從整體業務領域的交互方面進行充分設計,當涉及多個領域對象交互時,會出現多個ViewModel互相調用、軟件邏輯混亂的情況。因此,隨著業務需求越來越復雜,業務領域內部關聯性的提高,軟件分析、設計、開發的復雜性都會提高[4]。
Eric Evans將領域驅動設計架構分為四層:用戶界面層、應用層、領域層和基礎設施層[1]。
其中,領域層為業務軟件的核心。負責表達業務概念、業務狀態信息及業務規則。領域層包含領域模型。領域驅動設計中,領域模型是由基本的模型元素構成。Eric Evans 提出了6種領域模型元素:實體、值對象、聚合、領域服務、工廠和倉儲。其中,實體、值對象和聚合為領域對象,包含了領域業務數據和流程,即整個領域知識。
在標準MVVM模型基礎上,本文引入了領域驅動設計的思想。使得領域驅動的MVVM設計模型(DDMVVM)既繼承了MVVM模型優點,又遵循領域驅動設計思想。

圖1 MVVM架構各層結構
本文提出的DDMVVM模型在需求獲取、系統設計階段,能夠根據客戶需求,準確、完整地獲取領域知識,并正確地抽象出領域模型,實現領域模型中各要素之間正確的依賴、分治。領域專家、設計人員、開發人員以以領域模型作為“通用語言”(Ubiquitous Language)進行溝通,不斷地迭代開發、優化領域模型[5][6]。
DDMVVM的系統架構,在遵循領域驅動設計分層架構基礎上,結合用戶前端程序開發的MVVM架構層次要求,實現了DDMVVM模型整體架構的設計。
如圖2所示,將DDD的各模型元素與MVVM三層做映射。分別在View、ViewModel和Model層,實現領域驅動的模型元素。在領域層即完成業務領域的邏輯處理能力[3]。
其中,“Repository倉儲”,即為與后端程序交互層,其主要功能為:1.將領域層數據傳到后端,進行持久化;2.響應“領域層”請求,從后端程序獲取數據作為領域數據。
對照“圖1 MVVM整體架構圖”,DDMV VM的改進之處:
(1)DDMVVM將領域相關的業務邏輯放在了“Model層”,即業務邏輯分布在各自領域對象中,實現了“充血模型”。
(2)“ViewModel層”作為協調角色存在,負責協調相關聯的多個領域對象處理;不保存領域相關業務邏輯代碼,只保存系統流轉狀態;MVVM中的“數據綁定”和“命令”技術,由“ViewModel層”實現。
(3)“View層”不需要實現與Model層關聯的邏輯,由“ViewModel層”實現View與Model的一對一或多對一關聯。
(4)Model層作為核心,實現了“充血”的Model層。
(5)工廠和倉儲位于模型層,分別負責領域對象創建和管理工作。
這樣,避免了標準MVVM模型中出現的因業務邏輯交互而出現的邏輯混亂的情況。

圖2 DDMVVM模型整體架構圖

圖3 DDMVVM Framework框架結構示意圖
DDD提供了戰略設計和戰術設計兩種領域模型設計方式。
戰略設計幫助我們從更高的宏觀層面把握整體業務領域,正確的劃分邏輯上相互獨立的子領域,并按照“一個子領域對應一個BC”的標準,為每個子領域定義對應的一個BC。在子領域內,使用通用語言明確定義BC邊界內各個概念、術語、定義。
在限界上下文中,使用戰術設計方法,設計實現領域模型,創建領域模型中的各個構成元素,以表示子領域中的所有領域概念。根據Eric Evans提出的領域模型構成元素,DDMVVM模型的設計,也由6種元素構成:實體、值對象、聚合、領域服務、工廠和倉儲。
DDMVVM模型可以有效指導相關人員以領域模型為核心,進行系統分析、設計和開發工作。本文不僅提出了DDMVVM模型,而且以該模型為指導,在移動開發平臺下實現了一個具體的開發框架DDMVVM Framework。該框架基于JS語言,將移動開發平臺中的開發代碼、功能組件進行重構,使系統的設計、開發過程符合領域驅動設計的規范。
DDMVVM開發框架:
該框架的設計目標是在實際項目開發中,引導相關人員以DDMVVM模型為指導,規范地設計、開發方式實現系統,以提高系統分析、設計和開發的效率。
如圖3所示,該框架編程語言為移動開發平臺下的JS語言,具體實現了圖2所示DDMVVM架構中各層領域模型元素,并實現了面向對象的程序設計。
本文以第3章提出的DDMVVM模型為指導,對之前在移動開發平臺下實現的一個政務系統項目進行了設計重構、代碼重構。該項目采用第4章提出的DDMVVM Framework開發框架進行具體設計、開發實現。
將新舊系統進行對比后發現,采用DDMVVM設計開發的新系統要比之前舊系統實現的系統架構更優秀,新系統在系統完成效率、代碼性能及可維護性等方面都有了顯著提高。
本文提出了適用于用戶界面應用程序開發的一種新的設計模型:領域驅動的MVVM設計模型(DDMVVM)。并以該模型為指導,在移動開發平臺下實現了具體的開發框架DDMVVM Framework。
[1]EricEvans,埃文斯,趙俐,等.領域驅動設計:軟件核心復雜性應對之道[M].人民郵電出版社,2016.
[2]李引,袁峰.基于領域驅動設計的應用系統模型[J].計算機工程與應用,2013,49(16):1-8.
[3]黃強,王薇,倪少權.基于SOA和DDD的鐵水聯運信息平臺構架設計[J].計算機應用與軟件,2013,30(6):124-126.
[4]陳明,李猛坤,張強.一種基于擴展MVVM模式的SaaS面向服務計算模型[J].微電子學與計算機,2010,27(8):27-30.
[5]劉立.MVVM模式分析與應用[J].微型電腦應用,2012,28(12):57-60.
[6]Kouraklis J.MVVM as Design Pattern[M]//MVVM in Delphi.Apress,2016.