- 问题提出
通过将代码抽取出模版,再通过模版生成代码,极大的提高代码生成的效率。但随着代码的优化,模版也需要不断的人工优化。那么,能不能在代码修改后,模版自动更新呢?以及能否提供一些方法自动生成模版和调用模版的代码呢?
- 方案提出
定义一组生成模版的标记,然后在代码中嵌入这些标记(为了不影响代码运行,必须以注释的方式),根据标记的指示生成模版。因为是根据嵌入的标记生成模版的,所以模版可以反复自动生成。代码优化后,重新生成模版即可。
- 实现
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