Page 35 - 《软件学报》2021年第9期
P. 35
贾子甲 等:领域驱动设计模式的收益与挑战:系统综述 2659
对象等.例如,C2 就与子系统结构的决策相关.设计决策是软件设计的基础,因此也存在许多相关研究,
比如文献[66−69].尽管这些挑战背后的设计决策具有一定的特殊性,但一些观点仍然可以为实践者提
供参考.比如在决策过程中,理性分析和主观经验都需要得到重视 [27] .具体而言,前者是根据预先定义的
标准对备选决策进行评估和选择,比如应用 DDD 战术设计模式进行实体与值对象的划分时就需要理
性分析;而后者则是根据经验形成令人满意的解决方案,比如在应用 DDD 战略设计模式来划分限界上
下文时,无法完全脱离设计者的主观经验.因此,本文建议实践者在应对建模问题时既要进行理性决策,
也要采纳一些合理的主观经验;
[1]
• 理解领域的困难:C1,C7,C9,C15.领域驱动设计要求在建模时与领域专家进行紧密配合 ,然而在具体
实践中,想要让领域专家持续地参与建模过程并非易事,这需要软件开发组织为领域专家增加一笔额
[4]
外的开销 .此外,即使有领域专家的参与,开发团队仍需要面对与领域专家进行沟通(如 C7 和 C15)和
领域认知(C9)方面所存在的挑战.本文建议实践者增加对于理解领域这一过程的投入,并应用一些创
新方法,如尝试从多个角度(M12)来管理复杂性;
• 对于除领域外的其他方面关注过少:C5,C12,C13.这些挑战的重点在于,DDD 强调通过关注业务领域的
建模来解决软件开发的复杂性问题,因此,DDDP 也主要涉及建模方面,而缺少对其他方面(比如实现)
的明确指导.上述挑战可以通过补充工件或更加完善的规范来解决,比如领域层之外的工件(M6)和来
自 MDD 的中间模型(M14)等;
• DDD 理论的成熟度欠佳:C6,C8,C14,C16,C17.无论是通用语言还是战略和战术设计模式,都是 DDD 所
提供的抽象指导,实践者仍然缺乏应用这些 DDDP 进行软件开发所需要的工具、方法以及过程管理等
成熟能力.因此,在 DDD 领域未来的研究工作中,可以考虑通过提出创新性解决方案(如 M7)或者参考
其他软件工程社区中已有方法(如 M17),为将 DDDP 规范化地应用于软件开发过程提供更完善的支持.
Table 10 Classification of the challenges of applying DDD patterns
表 10 应用 DDDP 的挑战分类
分类描述 DDD 挑战
建模本身的复杂性 C2~C4,C10,C11
理解领域的困难 C1,C7,C9,C15
对于除领域外的其他方面关注过少 C5,C12,C13
DDD 理论的成熟度欠佳 C6,C8,C14,C16,C17
为便于理解,本文将这 4 类挑战对应到领域驱动设计方法及其模式在软件开发中扮演的角色,如图 7 所示.
Fig.7 Relation ship between four categories of challenges
图 7 4 类挑战的关系
[1]
作为一种软件设计方法,领域驱动设计旨在加速具有复杂领域逻辑的软件项目开发 .领域驱动设计利用
一系列 DDDP 从领域逻辑中抽象领域模型的过程,从本质上看,可以理解为用户应用软件的领域(即问题空间)
到可运行的软件(即解空间)之间的映射和转换.这个过程大体上可以分为两个阶段:对问题空间的理解和基于