代码生成器的存在价值

原创 2004年08月19日 17:51:00

多年前用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进行更改,对界面进行修饰。

从上面可以看到,整个项目工作量已经很低了;-) 这样对业务分析人员的要求比较高,要求一次能够分析全面彻底。项目中最后的工作只剩下修改业务逻辑,修改修改页面了。这就是代码生成器的威力。

不使用ATL向导,创建一个简单的ATL对话框程序.

本例使用CWindowImpl类创建对话框程序.第一步:建立一个新的Win32 Application工程.第二步:在stdafx.h中包含下面三行.      #include extern CCo...
  • sanjiang
  • sanjiang
  • 2001-09-25 12:19:00
  • 753

Tensorflow 实现VGGNet

下面是开始实现VGGNet-16。首先,我们载入几个系统库和Tensorflow。 from datetime import datetime import math import time imp...
  • Eason_oracle
  • Eason_oracle
  • 2018-01-10 17:10:55
  • 639

如何在高并发分布式系统中生成全局唯一Id

转载至:http://www.cnblogs.com/heyuquan/archive/2013/08/16/global-guid-identity-maxId.html 1、  使用数据库自增I...
  • aly1989
  • aly1989
  • 2016-07-21 15:59:54
  • 478

TensorFlow 教程

术语表 广播操作(Broadcasting operation) 一种用numpy-style broadcasting来保证tensor参数的形态兼容的操作。 Devices ...
  • u013378306
  • u013378306
  • 2017-02-21 09:31:39
  • 5157

如何使用InstallShield8.0制作自己的安装程序

  ::首页 >> 文档中心 >> 在线杂志 >>...
  • todototry
  • todototry
  • 2007-04-30 17:59:00
  • 1716

8 个最优秀的 Android Studio 插件

Android Studio是目前Google官方设计的用于原生Android应用程序开发的IDE。基于JetBrains的IntelliJ IDEA,这是Google I/O 2013第一个宣布的作...
  • qq_18495939
  • qq_18495939
  • 2015-10-20 10:07:31
  • 569

Tensorflow-3-使用RNN生成中文小说

这篇文章不涉及RNN的基本原理,只是从选择数据集开始,到最后生成文本,展示一个RNN使用实例的过程。对于深度学习的应用者,最应该关注的除了算法和模型,还应该关注如何预处理好自己的数据,合理降噪,以及如...
  • heisejiuhuche
  • heisejiuhuche
  • 2017-06-11 07:25:31
  • 7706

梦断代码--一个程序员的自白 (四)

本文谢绝转载 梦断代码--一个程序员的自白 (四)    一个周末过去,对于我所回复的,如何在运行时存储字符串的问题的解决方案,O也有了回应。O对我的方案非常不满,认为我的方案是他之前就考虑过...
  • wingfiring
  • wingfiring
  • 2012-09-19 15:58:32
  • 11704

程序员如何更好的提升自己

工作前三年是职业生涯中成长最快的几年,在这段时间里你会充满激情,做事专注,也容易养成良好的习惯。在我们公司有些同学在前三年中就快速成为某一个领域的技术专家,有些同学也可能止步不前。本文和大家一起探讨下...
  • hzp666
  • hzp666
  • 2017-10-17 08:54:24
  • 112

手把手教你用GAN实现半监督学习

引言 本文主要介绍如何在tensorflow上仅使用200个带标签的mnist图像,实现在一万张测试图片上99%的测试精度,原理在于使用GAN做半监督学习。前文主要介绍一些原理部分,后文详细介绍代码及...
  • u010159842
  • u010159842
  • 2017-12-18 18:24:39
  • 128
收藏助手
不良信息举报
您举报文章:代码生成器的存在价值
举报原因:
原因补充:

(最多只允许输入30个字)