posts - 27, comments - 207, trackbacks - 25, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

也谈代码生成器

Posted on 2006-11-14 12:06 风云 阅读(3337) 评论(18)  编辑 收藏 所属分类: .NETNDOrails

      关于代码生成器 Teddy's Knowledge Base 兄在博客园上已经谈过几次了,如他的也谈orm和代码生成没有ORM或代码生成数据就不能持久化了? - 用范型技术代替代码生成! 等,今天我不谈代码生成器的意义,只谈代码生成器的设计方案,最后给一个DEMO供大家下载.

    代码生成器的用途一般是根据表自动生成(Model,存储过程,Dao,Biz,UI(html,asp,aspx,jsp,winForm ....))等,分析其特性代码生成器其实就是MVC的结构,M 指的是数据库表或其他(数据源),C指的是代码生成器引擎,V指的是代码输出。

         那么代码生成器的方案有哪些可以选择?

         第一:模型逻辑,控制器逻辑,视图逻辑都在WinForm的代码中混着。

                     很多设计者由于项目的状况(时间比较紧)或为了暂时的方便就把代码生成的逻辑直接放在代码生成器的引擎中,就像JAVA中有些人把所有的控制逻辑和展现逻辑都放在Servlet中一样。这样的程序虽然在一定程度上符合了很多开发者的需求,但是很多的项目框架和你的代码生成器生成出来的框架不一致,那就不行了,要么重新修改接口修改内部的代码,要不再转为指定的项目框架再设计一套代码生成器。优点:速度快 ; 缺点: 扩张性差.

       第二:在特定项目的数据库中建几个存储过程来实现代码生成,优点:速度快 ; 缺点: 扩张性差.

       第三:表示层采用服务器视图模板引擎的MVC结构,如JSP 视图引擎,ASP/ASPX/PHP等服务器视图引擎,优点:开发非常方便,可以很好的分离了视图/控制器/模型,缺点:依赖于特定的Web服务器,使用起来没有CS结构的方便好用

         第四:自行开发一个视图模板引擎,然后基于该模板引擎建造一个MVC的代码生成器,如商业上的CodeSmith.优点:功能强,灵活,扩展性好;缺点:收费的。。。。

         第五:基于开源模板引擎 Velocity,StringTemplate /NVelocity,StringTemplate.Net 建造一个MVC的代码生成器。

         第六:基于动态语言 IronPython,Boo ,ruby等

         第七:视图引擎采用Velocity,StringTemplate 等开源引擎,控制器引擎采用JAVA/.NET, Shell 接口采用动态语言,利用动态语言把模板引擎和控制器引擎有机的结合起来。

         关于代码生成器的7种模式是我在日常工作中的总结,欢迎大家再多提提其它的设计方案。

         最后备上一个基于第五种方案的DEMO--NDO.Tools,该生成器根据数据库表自动生成模型类,以及填补了CoR代码生成器缺少的一部分----根据表自动生成模型,控制器,以及对应的视图。

         关于CoR的介绍请看,我前几天写的顶着Rails的浪潮,用NDO + Castle的monorail 也来秀一把  

Feedback

#1楼    回复  引用  查看    

2006-11-14 12:57 by 木野狐[匿名]      
总结的很好,楼主辛苦了。

#2楼    回复  引用  查看    

2006-11-14 22:56 by Clark Chan      
正在给我的项目,写代码生成器。嘿嘿,学习,

以前做过第一种,面向逻辑的.
现在在做第二种,但是又好像不一样,我是很多存储过程。
而且主要还是靠视图做桥梁,存储过程是为了业务服务,而非仅仅为了代码生成。采用面向对象封装的逻辑,方便以后将对象属性,配置化(比如新加的枚举配置管理)。

另外其他几种都不太懂,如果时间方便,心情方便,帮忙鉴定一下我的是那一种,有什么优缺点。谢谢(要帮就在我博客有下载)!!

明天去公司学习你的DEMO--NDO.Tools

#3楼    回复  引用    

2006-11-15 10:17 by a[匿名] [未注册用户]
http://www.spdevelop.com 上的那个代码生成工具也挺不错的。

#4楼 [楼主]   回复  引用  查看    

2006-11-15 10:24 by 风云      
@a[匿名]
这个代码生成器不错,它属于我所说的第四种,自己写了一个模板引擎,这个引擎很像CodeSmith的模板引擎

#5楼 [楼主]   回复  引用  查看    

2006-11-15 11:14 by 风云      
@Clark Chan
Clark Chan 你好,我刚找到你的代码生成器,我看了一下,做的也不错,该类型属于第一种,是一种比较传统的那一种,如果把代码生成的展现逻辑用模板引擎就好了!

#6楼    回复  引用  查看    

2006-11-15 13:48 by Clark Chan      
@风云
感谢指导!学习中。

#7楼    回复  引用  查看    

2006-11-15 16:49 by Clark Chan      
今天学习了几个代码生成器,一个都没有搞明白。
最后在本机G:\My Documents\CodeSmith\Samples\v4.0\Projects\CSharpCodeGeneratorSample\businessobject.cst

里面是这样写的
<script runat="template">

public string GetCamelCaseName(string value)
{
return value.Substring(0, 1).ToLower() + value.Substring(1);
}

===================================
public string GetReaderMethod(ColumnSchema column)
{
switch (column.DataType)
{
case DbType.Byte:
{
return "GetByte";
}
case DbType.Int16:
{
return "GetInt16";
}
case DbType.Int32:
{
return "GetInt32";
}
case DbType.Int64:
{
return "GetInt64";
}
case DbType.AnsiStringFixedLength:
case DbType.AnsiString:
case DbType.String:
case DbType.StringFixedLength:
{
return "GetString";
}
case DbType.Boolean:
{
return "GetBoolean";
}
case DbType.Guid:
{
return "GetGuid";
}
case DbType.Currency:
case DbType.Decimal:
{
return "GetDecimal";
}
case DbType.DateTime:
case DbType.Date:
{
return "GetDateTime";
}
default:
{
return "__SQL__" + column.DataType;
}
}
}
=====================================
</script>
给我很强的震撼,因为我的生成器里面就是这样写的!!
只是不知道他如何把脚本翻译成C#代码执行的。

我终于理解风云兄的意思了:
像这样:
protected <%= GetPrimaryKeyType(SourceTable) %> _id;
<% foreach (ColumnSchema column in SourceTable.NonPrimaryKeyColumns) { %>
<%= GetMemberVariableDeclarationStatement(column) %>
<% } %>
把代码展现逻辑公开!!才好.

注:以上代码都来自codesmith的脚本中。

#8楼 [楼主]   回复  引用  查看    

2006-11-15 16:54 by 风云      
@Clark Chan
哈哈!!是的,这样降低了系统的耦合度,以后如果想改变输出模型,可以不用动引擎,直接该模板就可以了!

#9楼    回复  引用  查看    

2006-11-15 17:01 by Clark Chan      
@风云
要把这个解析引擎做出来,真不是盖的啊(真不容易)。
1》既要能处理脚本转C#执行。(处理固定函数)
2》又要能解析<%%>等字符按换,传递参数<="123"> 键值对。(处理变量)
3》还要能读取固定代码,输出固定代码。(处理固定代码)

开发spdevelop.com 的家伙,真猛,居然把引擎搞出来了!佩服!

我现在都想放弃给我的项目做代码生成器了,复杂。而且我最终的目的仍然是我的项目,而非代码生成器。犹豫了~~·是否应该直接用别人的生成器,完成我的项目呢,嘿嘿!用引擎的代码生成器太强了。

#10楼 [楼主]   回复  引用  查看    

2006-11-15 17:03 by 风云      
@Clark Chan
是,厉害,很佩服,国内有这样的人真是感到很高兴呀!

#11楼 [楼主]   回复  引用  查看    

2006-11-15 17:30 by 风云      
@Clark Chan
      如果别人的代码生成器是基于模板并且比较稳定(如CodeSmith)的话,是可以直接用别人的,但是也要注意学习成本和版权纠纷.
 
      现在你基本已经写了一个主要针对于你们项目的,优点是自己亲手写的没有学习成本,如果再把你的代码生成器的输出逻辑换成用NVelocity或StingTemplate这些比较稳定的开源模板引擎,那即做了一个相对比较稳定的代码生成器又学习了开源的模板引擎,岂不是两全其美.
 
      最后一点建议是如果代码生成器仅仅是基于项目的目的而开发的,那么做一个代码生成器时,不需要那么花的界面,界面越简单越好,因为我们提供的仅仅是一个工具而不是产品,仅仅是提供给自己用又不是提供给用户用的,哈哈!例如:顶着Rails的浪潮,用NDO + Castle的monorail 也来秀一把 那篇文章时所附的代码生成器的开发时间我只用了不到一个小时的时间就完成了(开发时间周期之短是因为NDO里面内置了很多助手类).这篇文章所附的代码生成器是在上一个的基础上进行了简单的修改,开发时间大约就是1个多小时,其它大部分的时间是在写模板和测试模板,而不是在写代码生成器,为什么这个版本复杂了很多有两个目的,一: 仅仅是为了更有效的说明代码生成器的设计方案;二:是为了研究CoR和使用CoR提供了方便
 
      我上面的说法仅仅代表我个人的观点,是不是用别人的代码生成器由你自己决定,哈哈!

#12楼    回复  引用  查看    

2006-11-15 18:04 by Clark Chan      
@风云
说的很有道理,我确是花了太多时间在这个鬼代码生成器上面了,
是因为我当初开发NToggery1.0的时候也开发了一个代码生成器:EntityCode2.0,当时她确是让我很快完成了20个表的业务逻辑以下的所有代码。但是这些代码基于SQL语句的方式,有很多自定义的地方,我只好手动修改,虽然也不需要太多的时间,但是感觉还是到处在补丁。

我深刻的体会到前期程序架构合理性 和 前期代码生成器的好与坏,
将直接影响后期的代码开发的速度。所以现在开发NToggery2.1 我花了2个月的时间在生成器上,实在累。现在面对codesmith和spdevelop等强大引擎下,觉得自己要继续开发好的生成器,太难了(时间需要太多了,而且不能总停留在生成器上面,最终是期望能早日开发出完整成熟的进销存),似乎别人做好了,我却在那里受难(困难的难)。实在没效率(今天想了一天也没能有个修改方向~~)。

只要NToggery设计合理性,稳定了。代码生成器能凑合就先用起来的。不敢大改了。(但是代码生成器不稳定,以后大改动也会对进销存造成威胁,只好找平衡了。)

如果NVelocity或StingTemplate等开源引擎,能实现 楼楼楼楼楼上(codesmith)的 类似代码处理,到是非常愿意尝试使用的。能合理使用第三方的技术,是最好不过了,嘿。

ps:别人的生成器,最大的麻烦,我想是学习成本,和维护成本!!(搞了n天都没有学会codesmith和spdevelop 生成一次代码~~~~~)

最后:很佩服你应用“NVelocity或StingTemplate这些比较稳定的开源模板引擎,”的效率,真快,嘿嘿。
感谢你的指导意见。(今天虽然,没有代码上面的进步,不过思想丰富了许多,谢谢风云兄)

#13楼    回复  引用    

2006-11-22 13:19 by 匿名 [未注册用户]
不错,分析的很透彻!

#14楼    回复  引用    

2006-11-27 16:10 by linq [未注册用户]
丰富了不少思想呀!

#15楼    回复  引用    

2006-12-09 12:54 by liangda [未注册用户]
好文章呀

#16楼    回复  引用  查看    

2007-03-08 15:00 by Stone      
不错

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-11-22 14:50 编辑过


相关链接: