谈在代码中嵌入标记生成模版

  • 问题提出

通过将代码抽取出模版,再通过模版生成代码,极大的提高代码生成的效率。但随着代码的优化,模版也需要不断的人工优化。那么,能不能在代码修改后,模版自动更新呢?以及能否提供一些方法自动生成模版和调用模版的代码呢?

 

  • 方案提出

定义一组生成模版的标记,然后在代码中嵌入这些标记(为了不影响代码运行,必须以注释的方式),根据标记的指示生成模版。因为是根据嵌入的标记生成模版的,所以模版可以反复自动生成。代码优化后,重新生成模版即可。

 

  • 实现

1)定义一组生成模版的标记。

2)开发能够解释这些的标记的程序。

3)在代码中嵌入这些标记

4)生成模版

 

为形象说明,下面举例。

一段sql语句(您需要熟悉etl才能读懂):

   DECLARE GLOBAL TEMPORARY TABLE temp_cr_member
     (
        member_id  INT GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) ,
        member_code VARCHAR(28),  
        member_name VARCHAR(50),
        m_code3 VARCHAR(20),
        memo VARCHAR(4)
      ) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED IN temp_usertmp_32;

 

下面为嵌入了标记之后的sql语句:

   DECLARE GLOBAL TEMPORARY TABLE temp_cr_member
     (
        member_id  INT GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) ,
        --<list temp-sourcecols > 可以抽取出一个list 类型的 名字为temp-sourcecols的模版参数
        --<element>
        member_code --element-name
        VARCHAR(28) --elment-type
        --</element> 定义list中的元素如何构成 
        , --<cat/>元素各字段用什么符号连接
        member_name VARCHAR(50),
        m_code3 VARCHAR(20),
        memo VARCHAR(4)
        --</list>
      ) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED IN temp_usertmp_32;

 

根据代码中嵌入的注释形式的标记,生成的模版:

DECLARE GLOBAL TEMPORARY TABLE temp_cr_member
     (
        member_id  INT GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) ,
        <#list col in  temp-sourcecols > 
          <#col.name> <#col.type> ${cat}
        </#list>
     ) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED IN temp_usertmp_32;
    

 

调用这个模版生成代码时候,传入下面的参数

temp-sourcecols=[{name:member_code,type:varchar(28)},{name:member_name,type:varchar(50)},{name:m_code3,type:varchar(20)},{name:memo,type:varchar(4)}], cat=","

 ,即可生成上面的代码片段。

传入参数

temp-sourcecols=[{name,varchar(28)},{age,number},{sex,varchar(20)},{memo,varchar(4)}]

 

则可生成的代码如下:

   DECLARE GLOBAL TEMPORARY TABLE temp_cr_member
     (
        member_id  INT GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) ,
        name VARCHAR(28),  
        age number,
        sex VARCHAR(20),
        memo VARCHAR(4)
      ) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED IN temp_usertmp_32;
      

      

更多的嵌入示例参看附件createjgmem.sql和使用模版生成代码的示意gencode_demo_createjgmem.txt

 

  • 延伸
通过在代码中以注释形式嵌入标记,不影响原来程序运行。对这些标记进行解释,不仅可以自动的持续的生成模版,而且可以生成调用模版的代码。实际上是一种将代码抽取为模版的一个自动化的重构过程。
  • 缺陷

嵌入,要以人工的形式进行。需要对代码特别清楚,能够根据代码在大脑有模版的轮廓,需要具备一定的模型抽象能力,这对人提出一定的要求。

 

  • 改进

给出若干相似代码实例,机器能否自动抽取出模版?这可能是机器学习研究的课题。

 

  • 附件

嵌入示例createjgmem.sql

使用模版生成代码的示意 gencode_demo_createjgmem.txt

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值