`
canonical
  • 浏览: 367062 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于代码生成和DSL

阅读更多

      代码生成(Code Generation)本身是一个非常宏大的概念。从某种意义上说,当我们明确了计算的意义之后,所做的一切都只是一系列代码生成的过程,最终的目标是生成某种可执行的机器码。对web程序员来说,代码生成是最熟悉不过的了,每天我们所做的工作就是JSP=>Servlet=>HTML。不过,现在多数人脑海中的代码生成,指的一般只是根据配置输出一个或多个程序文本的过程,最常见的是根据数据库模型生成增删改查相关代码。这种技术其实很少在小型以上的项目中起到积极的作用.因为一般的生成工具都没有实现追加功能,无法适应模型的增量修改。此外一般生成的代码相比于手工书写的代码要更加冗长,需要被直接理解的代码总量不降反升.为图一时之快,所要付出的是长期的维护成本。

   在应用开发中,有些领域是非常适合于使用代码生成技术的。例如根据领域模型生成ORM(对象-关系映射)描述,或者根据接口描述生成远程调用代理/存根(Proxy/Stub)等。因为它们实际上只是对同一信息的不同技术形式或者不同技术层面的同义反复而已。这种生成最理想的方式是动态进行,可以随时保持模型的有效性。RoR(RubyOnRails)框架中ActiveRecord技术便是一个成功的范例,它甚至提供了动态生成的DAO函数,减少了一系列的包装调用过程。


   代码生成更加深刻的应用是完成高层模型向低层模型的转化,这一过程往往是非平凡(non-trivial)的。在Witrix平台中通过代码生成来支持领域抽象,可以用非常低的成本跨越结构障碍,将自定义的领域模型嵌入到现有的技术体系中。这其中我们的主要工作是解决了生成代码与手工书写代码之间的有效隔离及动态融合问题,确保代码生成可以反复的以增量的方式进行,同时支持最细粒度处对生成的代码进行定制调整。


   举一个简单的例子,假设现在需要开发一个三步审批的流程,每一步的操作人可以录入意见,可以选择通过或者回退,可以选择下一步操作的具体操作人,系统自动记录操作时间,每个操作人可以查看自己的操作历史等。虽然在现有技术体系中实现这一功能需要不少代码,但是在业务层面上描述这一功能并不需要很多文字,实际需要提供的信息量很小。显然,建立领域模型是比较适合的做法,可以定义一种DSL(Domain Specific Language)来描述这一模型。

   <flow_cp:SeqFlow>
     <step id="draft" userField="draferId" dateField="draftTime" waitStatus="drafted" />
     <step id="check" userField="checkerId" dateField="checkTime" opinionField="checkOpinion" 
                   waitStatus="sent" />
     <step id="approve" userField="approverId" dateField="approveTime"
                opinionField="approveOpinion" waitStatus="checked" passStatus="approved" />  
   </flow_cp:SeqFlow>
 


   以上功能涉及到多个操作场景,实现的时候需要补充大量具体信息,其中很大一部分信息来自于背景知识,例如显示样式,界面布局,前后台通信方式等。以上模型可以进一步抽象为如下标签

   <flow_cp:StepFlow3/>


  在不同应用中复用以上流程逻辑的时候可能需要局部修正,例如

   <flow_cp:StepFlow3>
      <step id="check" userField="checker" />
   </flow_cp:StepFlow3>
 


  更加复杂的情形是DSL本身提供的抽象无法满足全部需求,而需要在局部补充更多模型之外的信息,例如物品接收单审批通过后自动导入库存等。
 
   在Witrix中,代码生成不是直接产生最终的输出,而是在编译期生成基础模型,它与补充描述通过extends算子进行融合运算之后产生最终输出, 这种融合可以实现基础功能的新增,更改或者删除。典型的调用形式为

  <biz-flow>
       <extends>
         <flow_cp:StepFlow3>
           <step id="check" userField="checker" />
          </flow_cp:StepFlow3>
       </extends>
       ...
       <action id="pass_approve">
         ....
       </action>
   </biz-flow>
 


这里的操作过程可以看作是BizFlow extends SeqFlow<FlowConfig extends StepFlow3Config>,与泛型技术非常类似,只是需要更强的局部结构控制能力。


       按照级列理论http://canonical.iteye.com/blog/33824 ,我们可以定义一个DSL的级列,整个抽象过程为

     Context0 + DSL1 + EXT0 = DSL0
     Context1 + DSL2 + EXT1 = DSL1
     ...   
 


    在目前一些通用语言中,也有一些所谓内嵌DSL的方案,可以提供比较简洁的业务描述。但是仅仅建立DSL描述是不充分的,从级列理论的观点看,我们必须提供一种DSL的补充手段,能够在细节处补充DSL模型之外的信息,实现两者的自然融合。同时我们应该可以在不同的抽象层面上独立的进行操作,例如在DSL1和DSL2的层面上都可以通过类似继承的操作实现局部调整,这同时也包括在不同的抽象层面上都能对模型进行合法性校验。

 
1
0
分享到:
评论
1 楼 deepthink 2008-12-05  
有点类似与模板,挖洞
然后根据不同的情况往洞里面放东西

相关推荐

    Go-go-codon-从REST和工作流DSL组合生成Go服务器代码

    《Go-go-codon:利用REST和工作流DSL构建Go服务器代码的艺术》 ...通过自动化代码生成,它促进了开发效率,提高了代码质量,对于任何使用Go语言进行后端开发的团队来说,都是一个值得探索和采用的解决方案。

    JavaCodeGenerator:功能强大的Java代码生成器DSL

    JCG是功能强大的Java代码生成器。 与大多数生成器不同,JCG不是基于模板的;而是基于模板的。 在纯Java中使用DSL来生成Java! JCG的目标不是涵盖所有Java语言功能,而是允许创建功能强大,健壮且设计良好的生成器。...

    xtext.第05章-代码生成.pdf

    在第五章中,我们专注于使用Xtext和Xtend来实现代码生成,这是域特定语言(DSL)开发中一个重要的环节。DSL允许开发者专注于特定的业务领域,而Xtext和Xtend则是实现这些语言的强大工具。Xtext框架能够帮助我们构建...

    代码生成器(完整源码)

    通过这个完整的源码,开发者不仅可以直接使用这个代码生成器,还可以学习其设计思想和实现方式,为自己的项目定制专属的代码生成方案。同时,对于初学者,这是一个很好的学习资源,可以帮助理解代码生成的过程,提升...

    java代码自动生成.txt数据文件

    这些流行的IDE都有内置的代码生成工具,可以快速生成构造函数、getter和setter,甚至整个类的骨架代码,极大地提高了开发速度。 7. **DSL(Domain Specific Language)**: 创建特定领域的语言,可以用于描述业务...

    auto,Java源代码生成器的集合。.zip

    标题中的“auto,Java源代码生成器的集合”暗示了这是一个关于自动化生成Java源代码的开源项目。在软件开发过程中,源代码生成器能够大大提高开发效率,减少重复性工作,尤其是对于那些基于模板或规则的代码片段。...

    卡麦代码生成器

    这个安装文件很可能是Windows平台的应用程序,包含了运行卡麦代码生成器所需的所有组件和依赖。 在更广泛的IT背景中,代码生成器通常与元编程相关,即在程序运行时生成或修改其他程序。它们可能基于模板、数据库...

    Mybatis的Mapper方式整合elasticsearch的DSL调用,基于接口和代理生成bean注入的方式进行调用

    CGlib是一个强大的字节码生成库,它可以在运行时生成新的类和接口的实例,这正是我们需要的——为每个Mapper接口创建一个代理类,以便在调用实际方法之前执行DSL查询。 以下是整合步骤: 1. **创建Mapper接口**:...

    代码自动生成

    除了上述工具,开发者还可以利用编程语言内置的功能,比如Python的`string.Template`或`jinja2`,JavaScript的`ejs`等模板引擎,或者通过编写自定义脚本实现代码生成。 在实际开发中,代码自动生成带来诸多好处: 1...

    无垠式代码生成器最新功能与文档增强版0.7.22

    改进了Simplejee技术栈的Add,Update,SoftDelete和Delete等动词的代码生成物 改进了理论PPT,进行了一些修正 ===============0.7.15=========================== 本版本为InfinityGPGenerator的文档增强版本,支持...

    自动生成代码

    - **文档与维护**:记录代码生成的规则和流程,以便团队成员理解和维护。 总的来说,自动生成代码是提高开发效率的有效手段,但需要注意的是,过度依赖代码生成可能导致代码难以理解和维护。因此,在使用时要适度,...

    Java通用代码生成器InfinityGPGenertor新版0.79支持Json,免积分下载

    3)请使用本代码生成器的DSL即SGS(标准生成器脚本)完成您的工作 4)不吝反馈jerry_shen_sjf@qq.com 5)支持Java语言的两种技术组合:Simplejee和s2sh 6)生成相应对象的CRUDFLS等常用功能 7)生成完整的Eclipse JEE版...

    代码自动生成工具

    2. **DAO和Service层代码生成**:基于实体类,自动生成数据访问对象(DAO)和业务服务层(Service)的代码,用于CRUD操作。 3. **控制器代码生成**:在Web应用中,根据Action或Controller的设计,生成处理HTTP请求...

    模型驱动下的Java代码自动生成.pdf

    2. 强大的代码生成功能:MetaEdit+可以生成高质量的Java代码,减少软件开发的时间和成本。 模型驱动下的Java代码自动生成方法可以提高软件开发的效率和质量,降低软件维护的成本。MetaEdit+是一种常用的元建模工具...

    java代码生成器知识.pdf

    8. **领域特定语言(DSL)**:高级的代码生成器可能会包含对特定领域的DSL支持,让生成代码的过程更加直观和高效。 9. **代码生成框架**:有一些开源框架如Apache Velocity Tools、MyBatis Generator、JHipster等,...

    生成代码.zip

    "生成代码.zip"这个文件可能是一个包含相关工具、模板或者教程的压缩包,用于帮助用户理解和实践代码生成技术。 代码生成主要涉及以下几个知识点: 1. **模板引擎**:如Jinja2(Python)或Mustache,它们允许...

    代码生成器

    总的来说,代码生成器是现代软件开发中的利器,通过自动化代码生成,可以显著提高开发效率,减少重复劳动,让开发者更专注于业务逻辑和创新。正确理解和使用代码生成器,能够对提升整个项目的质量和效率产生积极影响...

    基于深度学习的Web用户界面代码生成技术研究.pdf

    本文探讨了基于深度学习技术的Web用户界面(WebUI)代码生成技术的研究,这一技术旨在自动化前端开发过程中繁琐的界面编码工作。 首先,文章指出深度学习模型尤其是卷积神经网络(CNN)在图像特征提取方面表现出色...

    一种Java EE平台的代码生成方法.zip

    Eclipse和IntelliJ IDEA等IDE也内置了代码生成功能,能快速生成getter、setter、构造函数等基础代码。 4. **Maven插件**:Maven可以通过插件如JAXB2 Maven Plugin或JPA Model Generator自动创建Java对象,这些对象...

Global site tag (gtag.js) - Google Analytics