领域特定语言(DSL)实践(1)

前一段时间在读《领域特定语言》这本书,回顾之前项目,有几个似乎用到领域特定语言(DSL)的例子。

第一个例子:消息处理流程

1、背景:应用系统A要对其它系统传递过来的消息进行处理,传递消息的方式可以有kafka消息中间件或直接调用应用系统A的接口。
在这里插入图片描述
上图是消息处理的流程,kafkaMessageSource作为一个消息源需要把kafka消息转换成MessageProcessor能处理的消息。MessageProcessor能处理实现Message接口的消息,不同类型的消息由不同的消息过滤器和处理器。
在这里插入图片描述
上图描述消息处理流程的领域模型。

2、以下配置用于描述整个处理流程的结构:

// 消息处理配置示例
    <!-- handler处理器 -->
    <bean id="aiHandler" class="com.xxxx.message.handler.AIHandler"/>
    <bean id="pushHandler" class="com.xxxx.message.handler.PushHandler"/>
    <!-- handler处理器 -->
    <!-- filter过滤器 -->
    <bean id="securityFilter" class="com.xxxx.message.filter.SecurityFilter"/>
    <!-- filter过滤器 -->
    <bean id="messageProcessor" class="com.xxxx.message.processor.MessageProcessor">
        <constructor-arg index="0">
            <list>
                <bean class="com.xxxx.message.MessageHandleConfig">
                    <property name="messageClass" value="com.xxxx.message.XxxxxMessage"/>
                    <property name="filters">
                        <list>
                            <ref bean="securityFilter"/>
                        </list>
                    </property>
                    <property name="handlers">
                        <list>
                            <ref bean="aiHandler"/>
                            <ref bean="pushHandler"/>
                        </list>
                    </property>
                </bean>
                
                <!-- 其它消息处理 -->
                <bean class="com.xxxx.message.MessageHandleConfig">
                    <property name="messageClass" value="com.xxxx.message.XxxxxMessage"/>
                    <property name="filters">
                        <list>
                        </list>
                    </property>
                    <property name="handlers">
                        <list>
                        </list>
                    </property>
                </bean>
            </list>
        </constructor-arg>
    </bean>
   
    <!-- 消息源 -->
     <bean id="kafkaMssageSource" class="com.xxxx.message.source.KafkaMessageSource">
           <constructor-arg index="0">
           <list>
                <bean class="com.xxxx.message.source.CommonKafkaMessageConfig">
                      <property name="kafkaMessageClass" value="com.xxxx.message.XxxxxKafkaMessage" />
                      <property name="converter" ref="kafkaMessageConverter"/>
                </bean>
             </list>
     </constructor-arg>
     </bean>
     <!-- 设备消息源 -->
</beans>

这个配置文件被放在spring 项目,借助spring框架自动完成配置文件的解析工作,这已有DSL的味道。

参考资料:马丁·福勒的《领域特定语言》

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高清英文PDF版。 DSL领域的丰碑之作,软件开发“教父”Martin Fowler历时多年的心血结晶,ThoughtWorks中国翻译。    全面详尽地讲解各种DSL及其构造方式,揭示与编程语言无关的通用原则和模式,阐释如何通过DSL有效提高开发人员的生产力以及增进与领域专家的有效沟通。 《领域特定语言》是dsl领域的丰碑之作,由世界级软件开发大师和软件开发“教父”martin fowler历时多年写作而成,thoughtworks中国翻译。全面详尽地讲解了各种dsl及其构造方式,揭示了与编程语言无关的通用原则和模式,阐释了如何通过dsl有效提高开发人员的生产力以及增进与领域专家的有效沟通,能为开发人员选择和使用dsl提供有效的决策依据和指导方法。    全书共57章,分为六个部分:第一部分介绍了什么是dsldsl的用途,如何实现外部ds和内部dsl,如何生成代码,语言工作台的使用方法;第二部分介绍了各种dsl,分别讲述了语义模型、符号表、语境变量、构造型生成器、宏和通知的工作原理和使用场景;第三部分分别揭示分隔符指导翻译、语法指导翻译、bnf、易于正则表达式表的词法分析器、递归下降法词法分析器、解析器组合子、解析器生成器、树的构建、嵌入式语法翻译、内嵌解释器、外加代码等;第四部分介绍了表达式生成器、函数序列、嵌套函数、方法级联、对象范围、闭包、嵌套闭包、标注、解析数操作、类符号表、文本润色、字面量扩展的工作原理和使用场景;第五部分介绍了适应性模型、决策表、依赖网络、产生式规则系统、状态机等计算模型的工作原理和使用场景;第六部分介绍了基于转换器的代码生成、模板化的生成器、嵌入助手、基于模型的代码生成、无视模型的代码生成和代沟等内容。
领域特定语言DSL)是一种根据特定领域需求和约束而设计的编程语言。相比通用编程语言DSL更加专注于解决特定领域的问题,能够提供更高效、简洁和易于理解的解决方案。 DSL的设计与实践包括以下几个方面: 首先,DSL的设计要考虑特定领域的需求和约束。通过深入了解和分析特定领域的问题与业务逻辑,设计者可以确定DSL所需的语法、语义和功能,以满足领域内的编程需求。 其次,DSL实践需要选择合适的实现方式。常见的DSL实现方式包括内部DSL和外部DSL。内部DSL通常是在通用编程语言的基础上构建,使用该语言的语法和库来扩展和定制。而外部DSL则是基于独立的语法和语义,通过解析器和执行器来实现。 另外,DSL的设计还需要注重易用性和可读性。DSL应该是简洁而直观的,让领域专家和非专业开发人员能够容易理解和使用。为了提高可读性,可以使用领域特定的术语和表达方式,使代码更富有表达力和可解释性。 此外,DSL实践过程中,还需要提供良好的工具和支持。这包括编写DSL的编辑器、调试器和代码生成器,以及相关的开发环境和文档。这些工具可以帮助开发人员更快地开发和调试DSL程序,提高开发效率和质量。 总之,领域特定语言的设计与实践需要深入了解特定领域的需求和约束,选择合适的实现方式,注重易用性和可读性,并提供相应的工具和支持。通过合理的设计和实践DSL能够提供更高效、简洁和易于理解的解决方案,提升领域内编程的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值