极客视点
极客时间编辑部
极客时间编辑部
113242 人已学习
免费领取
课程目录
已完结/共 3766 讲
2020年09月 (90讲)
时长 05:33
2020年08月 (93讲)
2020年07月 (93讲)
时长 05:51
2020年06月 (90讲)
2020年05月 (93讲)
2020年04月 (90讲)
2020年03月 (92讲)
时长 04:14
2020年02月 (87讲)
2020年01月 (91讲)
时长 00:00
2019年12月 (93讲)
2019年11月 (89讲)
2019年10月 (92讲)
2019年09月 (90讲)
时长 00:00
2019年08月 (91讲)
2019年07月 (92讲)
时长 03:45
2019年06月 (90讲)
2019年05月 (99讲)
2019年04月 (114讲)
2019年03月 (122讲)
2019年02月 (102讲)
2019年01月 (104讲)
2018年12月 (98讲)
2018年11月 (105讲)
时长 01:23
2018年10月 (123讲)
时长 02:06
2018年09月 (119讲)
2018年08月 (123讲)
2018年07月 (124讲)
2018年06月 (119讲)
时长 02:11
2018年05月 (124讲)
时长 03:16
2018年04月 (120讲)
2018年03月 (124讲)
2018年02月 (112讲)
2018年01月 (124讲)
时长 02:30
时长 02:34
2017年12月 (124讲)
时长 03:09
2017年11月 (120讲)
2017年10月 (86讲)
时长 03:18
时长 03:31
时长 04:25
极客视点
15
15
1.0x
00:00/04:58
登录|注册

DDD、DSL和DCI的关系

讲述:丁婵大小:6.85M时长:04:58
对于 DDD (Domain-Driven Design)和 DSL(Domain-Specific Language)、DCI(Data,Context, Interactive)的关系,很多人心存疑问。最近,中兴通讯资深软件架构师张晓龙在 DDD-China 2019 大会上分享了这个话题,以下为核心内容。
DDD 概念最早提出于 2004 年,作为一种软件开发的指导思想,DDD 对软件开发带来了诸多可能与方向,张晓龙认为 DDD 为软件开发带来的好处主要有以下几点:
第一,最大好处就是所有参与者围绕一个统一的领域模型工作,传统的分析模型和设计模型不再割裂,不管是做设计、做分析还是写代码、写文档,脑海中所构建的画面都是一致的。
第二,DDD 是一个软件开发过程,它显式地把领域和设计放到了软件开发的核心,软件人员和业务人员受到同样的重视,他们合作来构建领域模型,使得软件的交付质量更高且维护成本更低;
第三,DDD 提出的分层架构,有效分离了业务复杂度和技术复杂度,凸显了领域模型,使得领域层的代码和领域模型保持高度一致;
第四,统一语言非常重要,每个概念在各自的上下文中是清晰的无歧义的,同时要控制领域模型的复杂度,于是 DDD 在战略上提出了分离子域(问题域空间)和拆分 BC(解决方案空间)的模式,BC 间通过 Context Mapping 来集成;
第五,DDD 在战术层面提出了很多模式(聚合、实体、值对象、服务、工厂、仓储),对领域模型中的元素进行了分类,并给出了每类元素在领域模型中的职责和特征,降低了领域模型的构建成本。
张晓龙此前曾分别做过《当 DDD 遇上 DSL》和《当 DDD 遇上 DCI》的演讲,在他看来,DDD 和 DSL、DCI 之间存在极强的关联性。
先来看 DSL,DDD 和 DSL 的融合有三点,面向领域、模型的组装方式以及分层架构演进。
DSL 可以看作是在领域模型之上的一层外壳,可以显著增强领域模型的能力。它的价值主要有两个,一是提升了开发人员的生产力,二是增进了开发人员与领域专家的沟通。
举个例子:想让 BA 负责流程契约的设计,该流程契约是一个活文档,可以跑测试,而 BA 不熟悉宿主语言。于是,中兴通讯团队设计了一种外部 DSL 来专门描述流程契约,对 BA 非常友好,学习成本也很低(不超过 5 分钟就可以学会),最后发现 BA 很快就广泛使用了起来。
外部 DSL 并不一定要定义新文法,中兴通讯团队直接复用了 plantUML 文法,安装该插件可以自动生成序列图。对于外部 DSL,需要自己实现一个解析器将 DSL 文法解析成语法树,再根据语法树生成语义模型。语义模型可以看作领域模型(严格的讲语义模型是领域模型的子集),外部 DSL 就是对领域模型的一种组装方式。
再来看 DCI,DCI 的作用主要有两方面。首先,DCI 助力 DDD 战术设计,这体现在以下三方面:
显式地对 ROLE 建模,解决了贫血模型与充血模型之争;
明确一个聚合可以支持哪些 ROLE、一个 ROLE 可以由哪些聚合扮演以及一个场景下哪些聚合要扮演哪些角色;
当 Aggregate 内部实体行为比较多时可以嵌套使用 DCI 来拆分和组合。
其次,DCI 助力 DDD 代码落地,这体现在以下三个方面:
对象就是 Data,Client 为 Context,对象在 Client 中的行为就是 ROLE;
根据正交设计原则得到小类(素材库),根据多重继承(only C++)或依赖注入来组合素材,不管是行为类还是数据类,都按 ROLE 的方式来组合,对像仅仅组合 ROLE 并注入依赖;
类作为一种模块化手段,遵循高内聚,低耦合的原则,让软件易于应对变化。对象作为一种领域对象的直接映射,解决了过多的类带来的可理解性问题,让领域可以指导设计,设计真正反映领域。领域对象需要真正意义上的生命周期管理。
张晓龙认为,DCI 对一些开发人员的影响可能比 DDD 和 DSL 还大,因为开发人员每天都在不断倒腾代码,想让代码的组合性更强,以便快速应对需求的变化。
以上就是今天的内容,希望对你有所帮助。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • 阿玛铭
    DCI没有听过😭
收起评论
显示
设置
留言
1
收藏
85
沉浸
阅读
分享
手机端
快捷键
回顶部