随笔 - 119  文章 - 290  trackbacks - 0

博客搬家了哦,请移步
叫我abc

常用链接

留言簿(12)

随笔分类

我的博客

搜索

  •  

积分与排名

  • 积分 - 302361
  • 排名 - 84

最新评论

阅读排行榜

自动代码生成,数据驱动编程,这都是一些比较好的理念。
编程编到一定程度,对数据驱动编程都不会太陌生。如果有数据,并且可以直接编写算法对这些数据进行操作,那是再好不过的了。
不过并非事事完美,你有数据,但是你没法直接通过算法对数据进行操作,因为这些数据必须是代码的一部分,嵌入到代码中。幸好,这种代码的格式多半有规律的,因此,自动代码生成可以在此使用。
托微软的福,也许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)  编辑 收藏 引用

FeedBack:
# re: 自动代码生成 2008-03-29 23:34 owlcn
设计的很不错,扩展性很高。
我试用学习了一下,感觉挺好的。
不过发现两个小问题,
1、使用如下脚本

$NODE<r>
$FOR_EACH_NODE<data>
$IF_ATTR<name><!a>
printf( "$ATTR<tel>" );
$END
$END

会出现多打印三个空行的问题,经过我跟踪发现,是 Command.cpp 33 行后面少了一句处理回车换行,我改为如下代码后,正常了。

text += 4;
skip_next_line( text );
return;

所以我觉得处理 END 应该单独写个handler处理,这样END也不用做特例了,应该比直接 +4 好吧。

2、我觉得原来的程序一但 $NODE<r> 执行过后,就不能再从 doc 开头执行,也不太方便吧。可以吧 $NODE<> 特殊处理为取 doc node 从头开始。修改代码如下:

void node_handle( char*& text , xml_node<>& node )
{
string node_name = skip_get_value( text );

xml_node<>* child = 0;
if( node_name.empty() )
{
child = node.document();
}
else
{
child = node.first_node( node_name.c_str() );
}
if ( child )
{
parse( text , *child );
}
}

这样的话,使用

$NODE<>
$NODE<r>

就可以再从头开始执行代码了。  回复  更多评论
  
# re: 自动代码生成 2008-03-30 00:00 LOGOS
感谢你的回复~

处理$END的地方,确实存在没有处理换行的问题。

有关$NODE<>的建议非常好,不过滥用的话会使得样式文件的可读性不佳,因为节点的遍历已经不是简单的由父到子,而变得可以上窜下跳了。

在一段代码内使用父节点数据的可能性不是很大。多数情况下,都可以通过多个样式文件实现重新从根节点开始访问:
h_replace -x data.xml -t css1 > a.cpp
h_replace -x data.xml -t css2 > b.cpp
h_replace -x data.xml -t css3 > c.cpp  回复  更多评论
  
# re: 自动代码生成 2008-03-30 08:44 小名阿铁
程序确实不错,实效.但个人觉得这不算是自动代码生成.而仅仅是一个能按照规则输出文件的一个程序.  回复  更多评论
  
# re: 自动代码生成 2008-03-30 09:38 owlcn
@LOGOS

这个类似于 goto ,用的不好确实引起混乱。你的思路是对的,用多个文件分开控制更安全。

我提的只是实现一个可能,确实应该严格限制这种跳跃回零的使用。

主要是这种设计结构很好,赞一个~

PS : I'm liuyi, gaga~~  回复  更多评论
  
# re: 自动代码生成 2012-04-21 06:50 allen
最新最牛气的代码生成器,带视频演示,只需设计好数据库,直接生成可以用的BS项目,此代码生成器非常方便,做项目只需设计好数据库,然后按照生成提示一步步做,即可生成可直接使用的项目,从数据访问层到表示层,所有代码一气生成,生成后的功能有增、删、改、查、导出excel等等,只需作少许改动就可以完成多种常用项目,大大提高你的工作效率,而且是带ext功能的,大量用到了ajax技术。我接了十多个项目全是用它做的,客户非常满意。谢谢关注。

有需要加QQ:674012528



视频演示下载http://dba.wansogu.com/codemakervedio.zip




这里是代码生成的项目在线演示
http://dba.wansogu.com/view/login.aspx

admin
123456  回复  更多评论
  
# re: 自动代码生成 2012-04-21 06:51 我爱趣淘网
最新最牛气的代码生成器,带视频演示,只需设计好数据库,直接生成可以用的BS项目,此代码生成器非常方便,做项目只需设计好数据库,然后按照生成提示一步步做,即可生成可直接使用的项目,从数据访问层到表示层,所有代码一气生成,生成后的功能有增、删、改、查、导出excel等等,只需作少许改动就可以完成多种常用项目,大大提高你的工作效率,而且是带ext功能的,大量用到了ajax技术。我接了十多个项目全是用它做的,客户非常满意。谢谢关注。

有需要加QQ:674012528



视频演示下载http://dba.wansogu.com/codemakervedio.zip




这里是代码生成的项目在线演示
http://dba.wansogu.com/view/login.aspx

admin
123456




生成时可以选择架构,最后一项是最新最完整的架构,使用非常方便。



生成过程



生成后在架构



生成后的项目直接用vs2010打开,生成后就可以打开网页使用了,如图是登录  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理