王跃
(四川大学 计算机学院,四川成都 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.