Page 20 - 《软件学报》2021年第9期
P. 20
2644 Journal of Software 软件学报 Vol.32, No.9, September 2021
具体而言,本研究工作的主要贡献包括以下 3 个方面:首先,本文揭示了 DDDP 在软件开发项目中的实际应
用情况;其次,总结了应用 DDDP 所带来的收益,便于实践者能够在软件项目中更好地把握机遇;再次,本文对于
DDDP 应用实践中所面临的挑战以及应对挑战的缓解方法进行了论述,能够帮助实践者更好地应对挑战,并为
研究者提供了未来可能的探索方向.
本文第 1 节介绍 DDDP 的背景知识.第 2 节介绍本文所采用的系统文献综述方法.第 3 节给出综述的结果.
第 4 节对于综述结果进行深入分析和讨论.第 5 节分析本研究中存在的效度威胁.最后,第 6 节给出对于应用
DDDP 的总结与展望.
1 背景介绍
1.1 领域驱动设计的本质
领域模型(domain model)作为设计具有复杂业务规则的企业应用程序的一种软件设计模式,该模式可以被
看作是一个具有行为和数据的领域对象模型 [16] .领域模型正是领域驱动设计的基础.具体而言,DDD 方法说明
[1]
了如何利用 DDDP 从业务中抽象出领域模型,并将其置于软件开发的核心位置 .
DDD 具有几个基本原则.
[1]
• 第一,在首先提出 DDD 的书籍中 ,Evans 强调设计概念必须在代码中成功实现,否则,它们将会变成抽
象的讨论.DDD 通过引入模型驱动设计(model driven design)建模范式及其构造块,弥补了模型与可运
行的软件之间的差距;
[1]
• 第二,DDD 还提倡迭代开发,并说明了如何借助敏捷 [17] 中的迭代式领域建模加速软件开发 .领域驱动
设计与具体实现过程间的紧密关系,使得 DDD 比其他软件设计方法更具有实用性;
• 第三,在实践 DDD 的过程中,开发人员和领域专家之间需要展开紧密协作,这是因为 DDD 追求的领域
[1]
模型需要依靠头脑风暴的创造性和对领域的深入了解 ;
[4]
• 第四,DDD 是一种软件设计方法,而任何设计出来的领域模型都应该与架构无关 .也就是说,除了领域
[4]
模型,在软件开发过程中仍然需要架构设计,比如微服务架构和六边形架构 .
1.2 领域驱动设计模式概览
[1]
DDD 由 Evans 作为一种大型模式语言(pattern language)引入,其由一组相互关联的模式组成.模式语言提
供了讨论问题的交流术语,它定义了特定场景、特定问题的解决方案,其主要目的是帮助开发者解决在设计和
编程中遇到的通用问题.模式语言在软件工程中被广泛地应用,比如设计模式(design pattern)、企业架构模式
(enterprise architecture pattern)等.DDD 与 DDDP 的关系,正如同面向对象设计(object-oriented design,简称 OOD)
与面向对象设计模式(即设计模式)的关系.
对于领域驱动设计而言,最基本的模式是通用语言(ubiquitous language),它是一种供不同涉众(如开发人员
[4]
和领域专家)共同使用的语言,主要用于辅助领域建模 .一种通用语言只适用于单个限界上下文(bounded
[4]
context),后者作为一个显式的模型边界来维护模型的完整性.根据 Vernon 的观点,除了通用语言之外的 DDDP,
要么属于战略设计模式(strategic design pattern),要么属于战术设计模式(tactical design pattern).
战略设计模式旨在应对具有多个领域模型的大型软件开发项目的复杂性,其中,每个领域模型都属于单独
的限界上下文.具体而言,限界上下文作为一个显式的模型边界来维护模型的完整性,从而避免了模型之间的相
[1]
互连接使彼此变得模糊 .限界上下文以外的其他战略设计模式关注如何管理不同限界上下文(如上下文映射
和职责分层)之间的关系,比如,上下文映射(context map)负责描述不同领域模型间的通信,而职责分层
(responsibility layer)则站在更高的抽象层级来组织不同领域模型间的概念依赖关系.
[4]
战术设计模式负责根据通用语言对单个限界上下文进行领域建模 ,并结合面向对象的原则来绑定领域
建模和编码实现.战术建模的典型模式包括实体(entity)、值对象(value object)、聚合(aggregate)、服务(service)、
资源库(repository)等.具体来讲:实体和值对象用于对具有不同领域特征的领域对象进行建模;聚合将一组领域