多年前用ASP的时候,就听说了有一种叫做代码生成器的神奇的东西。只需要指定数据库链接,这个代码生成器就能够产生一个界面,然后选择你需要进行生成的数据表,按一下按钮,马上基于这个表的增删改查界面以及对应的ASP程序代码就生成出来,着实方便。当时的我对ASP已经轻车熟路,看了一眼这个工具后,心中评估了一下,然后使用了一把……看到这个工具生成的ASP程序源代码,让人确实有点接受不了——大小写不区分,大段大段的冗余代码。虽然生成的代码确实能够完成特定的业务操作,但是维护性确实太差了。据说后来有一些优质的代码生成器能够生成更好的程序,但是确实是从那个时候开始,代码生成器在我心里成了垃圾代码堆砌的代名词。我情愿自己编写一行一行代码也不愿意用代码生成器。
现在,当专注于某一个行业,某一种特定业务时,你会发现重复性是如此之大。——用户管理在大多数地方都是类似的,只是用户相对的字段有些不一样;用户登录界面、登出界面可能也是一样的,只是把某些图片换一下而已;大部分的业务操作都是增删改查,对于这种操作不断的采用同一种方式进行重复、还得小心出错;权限管理界面看起来也没什么大的不同……也许我们早就烦了。框架在某种程度上保证了项目的质量,但并不能减少编码量;某些框架甚至需要更多的编码(以及学习时间)。例如,与Servlet+JSP方式相比,Struts除了JSP, 还需要编写特定的Form, Action,并在struts-config.xml中加上几行;Tapestry则需要编写.page, .html, 对应的Page类,如果需要验证还得编写Delegate类;至于FreeMaker,Velocity之类界面工作量可能小了一些,但还得需要编写自己的简单框架用以实现MVC模式。Spring集成了这些表示层,看起来比较好……
上述解决方案的根本问题在于,框架只是保证了项目的质量、可维护性,但是没有减少编码量。因此,代码生成器的使用便是理所当然的了。这方面已经有先例了,最有效、最能够显示代码生成的威力的,当属xdoclet的ejb任务。我们知道,创建一个EJB需要同时创建其他四个无聊的接口,xdoclet在这方面将代码生成的威力发挥到了极致。另外,middlegen也能够创建基于数据库,使用Hibernate, Struts, EJB技术的Web应用程序,他能够生成JSP, Hibernate映射文件,Java类,EJB类等。middlegen应该是我见到的最完整的应用程序生成器的雏形,但是他还不足以具体,不足以缩短编码时间。
我思考了几天,在做OpenBUGZ和公司项目的过程中,想出了这种模型:
基础架构:Spring, Hibernate, Tapestry
Spring,Hibernate的好处自不待言,前台没有采用Struts或者WebWork,是因为前两者在界面表示上不够灵活,Struts需要配合Tiles才能实现灵活的布局,WebWork不太熟悉,不知道如何实现灵活的布局。然而在Tapestry中布局的问题几乎不是问题。
应用技术:Ant, Xdoclet, FreeMaker, JUnit
用FreeMaker而不用Velocity是因为前者有更多的支持,而且从我的使用感觉来说,FreeMaker相对较强大。
开发步骤:
1 首先开发者(项目经理或者技术经理)根据需求对整个系统建模,完成基本类图,生成所有的业务模型类;
2 根据业务模型类编写Hibernate映射文件(用xdoclet可能不太方便,特别是业务模型类存在继承关系时);
3 (代码生成)生成对应的DAO接口例如XXXDAO,用来对XXX对象进行增删改查 (如果采用Spring Hibernate Template,这一步可以省略)
4 (代码生成)生成采用Hibernate的DAO实现
5 (代码生成)生成业务逻辑层代码XXXManager,用来调用DAO层实现各种业务逻辑操作;
6 (代码生成)生成XXXManager对应的单元测试
7 (代码生成)生成业务模型类的增删改查界面Html(通过模板)
8 (代码生成)生成界面对应的Tapestry所需要的.page文件
9 (代码生成)如果需要验证,还需要生成需要的Delegate类
10 (代码生成)生成对应的增删改查Page类
11 (代码配置)在Spring的配置文件中配置DAO的事务
12 (代码配置)在Spring的配置文件中配置XXXManager
13 配置数据库链接,利用Hibernate的SchemaExport直接生成数据库
14 生成整个项目的文件结构,包括build.xml,如果需要,也可以生成JBuilder或者Eclipse项目
15 开发:对 XXXManager进行更改,对界面进行修饰。
从上面可以看到,整个项目工作量已经很低了;-) 这样对业务分析人员的要求比较高,要求一次能够分析全面彻底。项目中最后的工作只剩下修改业务逻辑,修改修改页面了。这就是代码生成器的威力。