自动代码生成,数据驱动编程,这都是一些比较好的理念。
编程编到一定程度,对数据驱动编程都不会太陌生。如果有数据,并且可以直接编写算法对这些数据进行操作,那是再好不过的了。
不过并非事事完美,你有数据,但是你没法直接通过算法对数据进行操作,因为这些数据必须是代码的一部分,嵌入到代码中。幸好,这种代码的格式多半有规律的,因此,自动代码生成可以在此使用。
托微软的福,也许windows下的开发人员对自动代码生成稍有陌生,不过这习惯在unix社区却长久而广泛(看看lex和yacc)。不过我仍不得不简要介绍一下,什么是自动代码生成(例子引自《unix编程艺术》)。
你有这样一份数据:
pitter,08977135,usa,male,...
lucy,97869652,canada,female,...
welliem,2087987,england,male...
...
...
你希望把这些数据用表格的形式显示到网站的一个页面上,你肯定不想逐条的写<tr>这种东西。于是,也许你会写一个程序,读取这份数据,并解析其中每个字段,然后将它们放进<tr>的标记中输出。这就是自动代码生成的开始。
我前阵子也有这样的自动代码生成需求,于是我写了一个比较通用的工具。之所以说通用,是所生成的代码的样子,不是写死在程序中的,而是外部的一个样式文件定义的。
首先是数据文件的格式,我采用了xml,而不是像之前提到的,用基于换行的记录。使用xml绝非偶然或者突发奇想,而是因为我所面对的数据确实是不平坦的,有着父子结构。简单的举个该格式的例子可能如下:
<r>
<data name="pitter" tel="08977135"/>
<data name="lucy" tel="9786952"/>
<data name="welliem" tel="2087987">
<im>
<data name="qq"/>
<data name="msn"/>
</im>
</data>
</r>
也许这个xml例子,还是可以用基于换行的记录格式所描述的,不过更复杂的例子确实是平坦的格式力所不及的。
样式文件的格式则很简单,其中包含一个极小的微型语言,用来指定和控制xml数据如何替换到样式文件中。比如:
$NODE<r>
$FOR_EACH_NODE<data>
printf( "$ATTR<name>" );
$END
然后,我们使用一下工具
h_replace -x data.xml -t css > a.cpp
a.cpp中将会生成如下代码:
printf( "pitter" );
printf( "lucy" );
printf( "welliem" );
很显然,$是命令的起始符号,更多的命令,大家可以从init_parser函数中看到。
关于源码,rapidxml组件是sf.net上的,对于简单的xml开发,这个东西足够轻便和高效。其他的几个文件都是我写的。代码很少,即使可读性很差,相信大家还是能够看明白的。代码中肯定有诸多漏洞,样式文件(微型语言)也会不太完整,不过这已经可以满足我的绝大多数需要,所以也就没有再修缮和拓展。
当然,欢迎感兴趣的人对其改进,并把代码发给我~
点击这里下载源码
posted on 2008-03-29 15:23
LOGOS 阅读(3050)
评论(6) 编辑 收藏 引用