写点什么

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

作者:
  • 2022 年 6 月 07 日
  • 本文字数:1572 字

    阅读完需:约 5 分钟

问题提出

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

方案提出

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

实现

  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,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;
复制代码


延伸

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

缺陷

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

改进

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

用户头像

关注

还未添加个人签名 2018.12.27 加入

多年金融行业开发经验,擅长软件故障分析和性能调优。 目前关注代码生成和分布式数据库中间件

评论

发布
暂无评论
谈在代码中嵌入标记生成模版_6月月更_军_InfoQ写作社区