1、当 DDD 遇上 DSL中兴通讯资深软件架构师1.2.3.DSL 简介 DDD 与 DSL 融合三个典型案例DSL 简介命令式 vs 声明式命令式编程声明式编程侧重点HowWhat声明式1.程序员声明想要的 What,计算机设计 step-by-step2.归纳和提取完备的 What 并不是件轻松的作命令式1.程序员习惯描述 How,喜欢控制事情的发展2.计算机按照命令执 step-by-step,并不对结果负责DSL 是什么DSL(Domain-Specific Language):领域专语 或 领域特定语DSL 是针对某特定领域,具有受限表达性的种计算机程序设计语DSL 并不会新鲜的技术:
2、SQL,HTML,CSS,正则表达式DSL 是最常的声明式编程形式DSL 的价值提升开发员的产 增进与领域专家的沟通1.领域专家与开发员结对,参与构建 DSL2.领域专家可以评审 DSL,并指出问题所在3.即使不实现 DSL,也可以把它当作沟通的平台1.相命令/查询 API,DSL 更容易理解2.DSL 的受限表达性使得开发员难于犯错3.DSL 的错误很容易被发现和修改DSL 的分类内部 DSL外部 DSLDSL脚本宿主语DSL脚本定义语【宿主语编译器】解析语义模型可选成标代码语法树解析【实现解析器】DDD 与 DSL 的融合向领域DDDDSLDomainDSLULSemantics Mode
3、lDomain ModelDDD 和 DSL 字含义都是领域DSL 丰富了 UL语义模型通常是领域模型的集模型组装的式命令/查询 API1.场景较简单2.使 DSL 得不到任何好处的场景3.使 DSL 获得的好处不以抵消它的成本的场景内部 DSL1.单元测试是内部 DSL 的产区2.从 API 的度看,连贯接就是内部 DSL 的同义词3.内部 DSL 感觉像个整句,不是个关命令的序列外部 DSL1.外部 DSL不受限于宿主语的语法,对户很友好,尤其是对于不懂宿主语语法的户2.创造外部 DSL 所需的背景知识要远远少于通语的特定领域在次业务中消息交互较多的领域1.电信领域的控制2.络领域的管理业
4、务场景具有的特征1.对象交互多2.业务流程3.事务操作分层架构关键点1.通过 Transaction DSL 来表达 Transaction 层2.当应层收到消息时,根据关键字找到业务实例,然后投递消息给相应的事务来处理,本质上是事务调度的功能,我们将应层重命名为调度层3.事务模型是横切模型的种实例化三个典型案例内部 DSL 案例:gomonkey APIgomonkey 介绍gomonkey 是作者研的款 Go 语的打桩框架,标是让户在单元测试中低成本的完成打桩,从将精聚焦于业务功能的开发gomonkey 接友好,功能强,前已被很多项使,户遍及世界多个国家领域模型FuncTargetPtrT
5、argetTargetTargetRepoConstDoubleVariableDoubleDoubleDoubleFactoryOutputCell1:nBinaryEntryAddressJmpDirective1:nReflect命令/查询 APIfunc ApplyFunc(target,double interface)*Patchesfunc ApplyMethod(target reflect.Type,methodName string,double interface)*Patchesfunc ApplyGlobalVar(target,double interface)*P
6、atchesfunc ApplyFuncVar(target,double interface)*Patchesfunc ApplyFuncSeq(target interface,outputs OutputCell)*Patchesfunc ApplyMethodSeq(target reflect.Type,methodName string,outputs OutputCell)*Patchesfunc ApplyFuncVarSeq(target interface,outputs OutputCell)*Patchesfunc NewPatc