问题提出
通过将代码抽取出模版,再通过模版生成代码,极大的提高代码生成的效率。但随着代码的优化,模版也需要不断的人工优化。那么,能不能在代码修改后,模版自动更新呢?以及能否提供一些方法自动生成模版和调用模版的代码呢?
方案提出
定义一组生成模版的标记,然后在代码中嵌入这些标记(为了不影响代码运行,必须以注释的方式),根据标记的指示生成模版。因为是根据嵌入的标记生成模版的,所以模版可以反复自动生成。代码优化后,重新生成模版即可。
实现
定义一组生成模版的标记。
开发能够解释这些的标记的程序。
在代码中嵌入这些标记
生成模版
为形象说明,下面举例。
一段 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;
复制代码
延伸
通过在代码中以注释形式嵌入标记,不影响原来程序运行。对这些标记进行解释,不仅可以自动的持续的生成模版,而且可以生成调用模版的代码。实际上是一种将代码抽取为模版的一个自动化的重构过程。
缺陷
嵌入,要以人工的形式进行。需要对代码特别清楚,能够根据代码在大脑有模版的轮廓,需要具备一定的模型抽象能力,这对人提出一定的要求。
改进
给出若干相似代码实例,机器能否自动抽取出模版?这可能是机器学习研究的课题。欢迎交流
评论