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),如可维护性、可扩展性、可重用性和可测试性等.这一观
         点在现有研究文献中被广泛认可.首先,限界上下文和上下文映射将一个复杂的领域分解为几个部分,帮助系统
   24   25   26   27   28   29   30   31   32   33   34