Page 29 - 《软件学报》2021年第9期
P. 29
贾子甲 等:领域驱动设计模式的收益与挑战:系统综述 2653
Table 8 Benefits of applying DDD Patterns
表 8 应用 DDDP 所带来的收益
阶段 ID 描述 计数 相关模式及研究文献
领域设计 B1 领域间清晰的依赖关系 5 CM [52,53] ,RL [41,52,53]
B2 不同实现间轻松切换 3 Repository [37,39] ,Factory [39]
领域 B3 减少集成开销 1 AL [55]
模型 [52]
实现 B4 促进接口复用 1 OHS [37]
B5 明确的代码意图 1 MultiPattern(UL,VO,Entity,Repository,Aggregate)
B6 提升架构质量 4 BC [30] ,CM [52] ,LA [54] ,CD [30]
B7 更加有效的沟通 4 UL [35,36,38,44]
普适性 B8 促进业务理解 3 CD [52] ,UL [36] ,MultiPattern(UL,BC) [42]
活动 B9 以敏捷方式实现复杂架构的不断演进 2 LA [54] ,MultiPattern(UL,BC,Aggregate) [42]
B10 提升开发资源的利用率 1 CD [52]
B11 应对具有巨大领域复杂性的软件系统 1 MultiPattern(Entity,VO,Service,Aggregate) [56]
注:表格使用简写表示相关模式,其中,CM=“上下文映射”,RL=“职责分层”,OHS=“开放主机服务”,AL=“防腐层”,BC=“限界上下
文”,LA=“分层架构”,CD=“核心域”,UL=“通用语言”,VO=“值对象”.MultiPattern 代表这种收益可能与多种 DDDP 的综合作用相关
值得注意的是:一些研究文献所提到的显著收益可能来自于其对于多种 DDDP 的综合作用,而不是某一种
DDDP 的作用.接下来,本文将分阶段讨论应用 DDDP 所带来收益的细节.
3.3.1 领域设计
在领域设计中,应用 DDDP 的收益在于能够使各个领域之间的依赖关系更加明确(B1).上下文映射(context
map)和职责分层(responsibility layer)用于组织系统的不同部分:前者表示不同限界上下文之间的关系,每个上
下文表示一个特定的领域;后者则根据领域对象的职责,将它们组织成具有清晰依赖关系的层次结构.借助这些
DDDP,我们能够清晰地认识领域之间的关系和依赖.本质上,正如基础研究 [53] 所宣称的,我们可以利用这些模式
了解功能之间的依赖关系.因此在确定系统边界时,不同领域的战术设计知识以及领域之间的关联关系将变得
更加明确.理清领域之间的依赖关系还可以帮助开发人员更加深入地了解系统,降低认知复杂性 [52] ,有助于分析
系统架构.
3.3.2 领域模型实现
应用 DDDP 有助于领域模型的落地实现.比如应用资源库(repository)和工厂(factory)模式分别可以将存储
和初始化的复杂逻辑从领域模型中剥离出来 [37,39] ,因此能够改善软件开发的效率,使得开发人员能够在存储和
初始化的不同实现方案之间的更加轻松地进行切换(B2).一方面,借助资源库模式,当需要更改系统时,往往只需
要更改相关的代码实现,而不必去检查整个对象模型 [37] ;另一方面,工厂模式隐藏了复杂的初始化逻辑,因此可
以在不引用具体实现的情况下轻松地切换实现方式 [39] .
当涉及到限界上下文之间的通信时,防腐层(anticorruption layer)封装了两个上下文之间领域概念的转换,
从而避免一个上下文过多地掌握另一上下文的知识.正如基础研究 [55] 所指出的:通过将领域模型从执行与其他
系统相关的任务中解放出来,防腐层允许实践者在不改变领域模型的情况下集成外部系统,从而减少系统集成
的开销(B3),这对于需要与遗留系统或第三方系统进行集成的应用程序至关重要.此外,开放主机服务(open-host
[1]
service)通过一组服务提供了对限界上下文的访问 ,即,将这些服务发布为设计构件.这样一来,接口的重用性
(B4)和松耦合得到了极大改善.
让代码意图更明确(B5),也是应用 DDDP 带来的一个显著收益.DDD 强调对于模型和实现的绑定,所以在编
写代码时需要使用与领域建模过程相同的术语 [37] ,也就是通用语言.这样一来,由于整个团队将通用语言作为相
互沟通的基础,能够使代码的业务逻辑将变得更加清晰 [37] .与此同时,借助于通用语言这种模式,不同涉众之间
可以直接基于代码而不是海量的文档进行信息交换,这使得团队的沟通、协作效率大大提升.
3.3.3 普适性活动
应用 DDDP 可以提升软件架构的质量属性(B6),如可维护性、可扩展性、可重用性和可测试性等.这一观
点在现有研究文献中被广泛认可.首先,限界上下文和上下文映射将一个复杂的领域分解为几个部分,帮助系统