代码自动生成我目前所知有两种方法,一种是模板,一种是脚本,模板方法比较常见些,而且可以满足绝大多数情况的需要,通过插入一些自定义的TAG,再用程序来解析;而脚本执行的方法就是非常灵活和强大的,因为很多时候,需求是很古怪特殊的,所以普通的模板难以完成这种代码生成。
Ceg和CodeDG是我写的两个代码自动生成软件,分别就是上述两种方法的实现,长期以来,我用CEG完成我几个O/R Mapping框架的代码生成,并且在SinoLib之前,它都能很好地完成任务。但是SinoLib因为数据平台无关性的需要,所以使用了Xml文件来描述实体类所对应的表对象(可能是table、view或是一个select)信息,但由于其格式的特殊性,Ceg无法通过模板生成,我只能在生成后的Xml文件中再手工进行修改。另外还有一个特性Ceg无法满足,就是生成Java类文件时,类外的第一个字母需要大写,而表名却全是小写,这个时候如果要模板方法支持的话,只能再添加一个TAG,如<Ucase>,所以模板方法的扩充是极为不便的,并且功能有限,同时就软件实现来说,脚本方法实际要比前者更加容易得多。
因为前些时间在项目中使用了ScriptControl进行脚本支持,所以决定开发CodeDG来弥补Ceg的不足,并且完全替代Ceg,实际上关于脚本支持的想法我在很早以前就有了,只是一直没有将它实现。经过周末一天多时间的开发,CodeDG完成了,它的特性包括:
1、完成兼容VBA语法
2、类似于ASP的内嵌式脚本语法,并且支持<%= .. %>
3、支持函数和过程定义,添加IIF函数,App对象
4、通过软件传递进来的Schema、Table对象访问当前数据库的结构信息
其实CodeDG本来并不完成代码自动生成的功能,它主要是一种数据库结构信息获取和脚本解析和执行的平台,通过统一的接口向您的脚本暴露数据库结构信息(目前只支持MSSQL、Access的Table),您可以利用VBA创建文件生成需要的代码,也可以调用Excel或Word的Application来生成数据字典,它的整个表现模式和ASP非常相似,用动态的脚本,去创建静态的页面,当然,您还可以通过MsgBox来执行一些更加复杂的操作。
加入脚本支持在您的程序中其实非常容易,您可以定义一些您特有的语法特性,如CodeDG的<%..%>脚本包含,然后将程序中的对象通过AddObject方法添加到ScriptControl对象,这样脚本就能够访问这些和您程序有关的资源了,接着就是执行脚本了,而要获得执行结果,有两个方法:一是通过模块内的public级变量,二是通过FUNCTION直接得到返回值。
这个Post虽然不是.Net的,但是.Net下的CodeDom同样可以实现类似功能,并且会更加强大。