[rapid-generator] 基于模型的编程辅助工具
chenlang_soft
2008-11-28
Codehelper 简介 -- 基于模型的编程辅助工具 Codehelper 的目标是为开发者提供一个工具,辅助其以更快的速度来得到代码。 Codehelper 以模型为中心来实现这个目标。下面发布几张解图来了解一下其概貌。如要下载演示代码请访问: http://code.google.com/p/fastcoder/downloads/list 。 <!-- [if !supportLists]-->1、 <!-- [endif]-->构建模型 <!-- [if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1032" type="#_x0000_t75" style="width:415.5pt;height:312pt;visibility:visible;mso-wrap-style:square" mce_style="width:415.5pt;height:312pt;visibility:visible;mso-wrap-style:square"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.png" o:title="" /> </v:shape><![endif]--><!-- [if !vml]--> <!-- [endif]--> 在本工具中,模型是实现快速开发的基础。一切工作都是从模型的构建开始的,以模型构建为中心。除了具备建模工具的基本要素之外,我觉得本工具的建模功能中比较重要的一个特点就是对修饰词的管理。修饰词,帮助使用者在模型上做各种标记,这些标记在以后的代码生成和 ui 自动生成上具有重要的作用。 <!-- [if !supportLists]-->2、 <!-- [endif]-->引进模型 <!-- [if gte vml 1]><v:shape id="图片_x0020_4" o:spid="_x0000_i1031" type="#_x0000_t75" style="width:415.5pt;height:322.5pt; visibility:visible;mso-wrap-style:square" mce_style="width:415.5pt;height:322.5pt; visibility:visible;mso-wrap-style:square"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image003.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image003.png" o:title="" /> </v:shape><![endif]--><!-- [if !vml]--> <!-- [endif]--> 除了自己从头创建模型,本工具支持从数据库中引入模型。但是需要指出的是,通常情况下,从数据库引入的信息只是一些基本的信息,对于准确的生成代码是不充分的。因为数据库系统的元数据并不考虑模型在代码生成中的用途。所以引入之后通常需要使用者补充必要的信息。 此外,为了能够从更多的来源引入模型,本工具在引入功能上设置了一个扩展点,通过这个扩展点,使用者可以把自己的引入逻辑挂接在本工具上,从而将其它形式的模型信息引入本工具中。
<!-- [if !supportLists]-->3、 <!-- [endif]-->模型基因
<!-- [if gte vml 1]><v:shape id="图片_x0020_7" o:spid="_x0000_i1030" type="#_x0000_t75" style="width:202.5pt;height:465.75pt; visibility:visible;mso-wrap-style:square" mce_style="width:202.5pt;height:465.75pt; visibility:visible;mso-wrap-style:square"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image005.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image005.png" o:title="" /> </v:shape><![endif]--><!-- [if !vml]--><!-- [endif]--> 可以参照 Java 接口的概念来理解模型基因。作为一种范型,模型基因描述了某一个模型应该具备的特征。与接口的不同之处在于,模型基因除了规范的作用,同时还是代码生成的逻辑,或者代码生成的模板。例如数据基因中定义了 5 个接口,当添加到模型之后,就会为该模型添加这 5 个方法的具体实现,下面看一段生成的代码示例: /** * 查询函数,以 json 格式返回 *@param qxml String: 查询字符串 *@param start int: 开始索引 *@param limit int: 结束索引 *@return String */ public static String queryByPage(String qxml, int start, int limit) { /*startqueryByPage*/ String s = ""; String total = "5"; Connection conn = DBConnection.getConnection(); String wsql = XMLUtil.where_str(qxml); try { String csql = "select count(*) as num from yuangong"; if (!wsql.equals("")) { csql = csql + " where " + wsql; } PreparedStatement cstmt = conn.prepareStatement(csql); ResultSet crs = cstmt.executeQuery(); if (crs.next()) { total = crs.getInt("num") + ""; } crs.close(); cstmt.close(); s = s + "{'totalCount':'" + total + "','datas':["; String sql = "select yuangong.uuid,yuangong.label,yuangong.nianling,yuangong.zhiwei,yuangong.bumen,(select label from bumen where bumen.uuid=yuangong.bumen) as bumenlabel from yuangong "; if (!wsql.equals("")) { sql = sql + " where " + wsql; } Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); int i = 0; int from = start; int to = start + limit - 1; while (rs.next()) { if (i > to) { break; } if (i >= from) { if (i > from) { s = s + ","; } s = s + "{'uuid':'" + rs.getString("uuid") + "'"; s = s + ",'label':'" + rs.getString("label") + "'"; s = s + ",'nianling':'" + rs.getString("nianling") + "'"; s = s + ",'zhiwei':'" + rs.getString("zhiwei") + "'"; s = s + ",'bumen':'" + rs.getString("bumen") + "'"; s = s + ",'bumenlabel':'" + rs.getString("bumenlabel") + "'"; s = s + "}"; } i++; } s = s + "]}"; rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } finally { try { conn.close(); } catch (Exception e) { } } return s; /*endqueryByPage*/ } <!-- [if !supportLists]-->4、 <!-- [endif]-->建模和代码编辑的双向同步 工具中实现了简单的代码和建模之间的双向同步功能。使用“同步”按钮,可以为选定的模型生成代码。使用“源码”按钮,切换到 Java 代 码编辑器查看生成的代码,并可以修改(注意,这种修改是有限制的),然后可以将修改的结果反向同步的模型中。刚才我说修改是受限制的,指的是,使用者无法 修改函数名和参数,也无法修改函数体前面的注视,只能修改函数体里面的代码。这也是出于以后的代码自动化的需要,以后的代码自动生成过程中,对这些接口的 调用是根据模型基因中的规范来的,如果允许使用者修改函数名和参数的话,则调用这些接口的地方会产生冲突。 <!-- [if !supportLists]-->5、 <!-- [endif]-->基于模型的生成算法的扩展点 本工具中,模型作为生成代码的基础,在别的模块中使用。同时,本工具在此处设置了扩展点,使用者可以在此挂接自己需要的生成逻辑。例如基于模型生成 Hibernate 需要的配置文件和对象的功能。 <!-- [if !supportLists]-->6、 <!-- [endif]-->基于 ExtJs 的 WebUI 设计器 先看一下概貌: <!-- [if gte vml 1]><v:shape id="图片_x0020_10" o:spid="_x0000_i1029" type="#_x0000_t75" style="width:415.5pt;height:312pt; visibility:visible;mso-wrap-style:square" mce_style="width:415.5pt;height:312pt; visibility:visible;mso-wrap-style:square"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image007.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image007.png" o:title="" /> </v:shape><![endif]--><!-- [if !vml]--> <!-- [endif]--> 这是一个所见即所得的 ui 开发工具。帮助使用者开发 ext 前端应用。
<!-- [if !supportLists]-->7、 <!-- [endif]-->基于模型的 UI 开发助手 这是一个很能体现模型的作用的地方。通过模型提供的信息,可以快速的构建 UI 界面。 <!-- [if gte vml 1]><v:shape id="图片_x0020_13" o:spid="_x0000_i1028" type="#_x0000_t75" style="width:192.75pt;height:451.5pt; visibility:visible;mso-wrap-style:square" mce_style="width:192.75pt;height:451.5pt; visibility:visible;mso-wrap-style:square"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image009.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image009.png" o:title="" /> </v:shape><![endif]--><!-- [if !vml]--> <!-- [endif]-->
大家看一下这个窗口,里面列举了很多可以添加到 ui 界面中的 ui 元素,向 form,grid,tree 等等。这些元素都是使用特定的算法,根据模型中的信息,准备的很完整的 ui 元素,拖放到 UI 界面上就可以使用的,包括所需要的 js 脚本,后台的 java 服务及对服务的调用,都会随着使用者的拖动鼠标的动作添加到 ui 模型中。希望大家赶紧下载示例代码体验一下。 最后再强调一点:提供这些元素的算法也是可以扩展的。这使得本工具在满足不同的使用者的生成不同风格、场景的代码方面,也具备足够的灵活性。只要你愿意,本工具绝对可以帮助你减轻写代码中的重复劳动。 <!-- [if !supportLists]-->8、 <!-- [endif]-->UI 设计器和代码之间的双向同步 使用者可以随时将 UI Designer 中的编辑同步到源码中,使用 Ctrl+D 快捷方式,可以进行双向的同步。使用者可以在代码试图中修改 UI 界面上的控件的属性,也可以根据自己的需要添加 js 代码,这些会同步到 ui 模型中。 <!-- [if !supportLists]-->9、 <!-- [endif]-->单表和主从表向导 生成单表维护和主从表维护界面,来看一张截图: <!-- [if gte vml 1]><v:shape id="图片_x0020_16" o:spid="_x0000_i1027" type="#_x0000_t75" style="width:415.5pt;height:312pt; visibility:visible;mso-wrap-style:square" mce_style="width:415.5pt;height:312pt; visibility:visible;mso-wrap-style:square"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image011.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image011.png" o:title="" /> </v:shape><![endif]--><!-- [if !vml]--> <!-- [endif]--> <!-- [if !supportLists]-->10、 <!-- [endif]-->脚本助手 本工具提供智能编程助手。在设计 UI 的时候就有一个这样的助手,可以帮助使用者快速添加 js 代码。先看一下外观: <!-- [if gte vml 1]><v:shape id="图片_x0020_22" o:spid="_x0000_i1026" type="#_x0000_t75" style="width:415.5pt;height:312pt; visibility:visible;mso-wrap-style:square" mce_style="width:415.5pt;height:312pt; visibility:visible;mso-wrap-style:square"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image013.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image013.png" o:title="" /> </v:shape><![endif]--><!-- [if !vml]--> <!-- [endif]--> 在编程助手窗口中,列出了助手为您准备的代码片断,双击一个选项,可以将该代码片断放入剪切板中,下面这段 js 就是编程助手自动准备的: var grd7=Ext.getCmp("mygrid"); var d7=grd7.getStore().getCurrentRecord().get("id"); window.showModalDialog('','../bumen/bumen.editView.jsp'); 这是一段实现双击 grid 中的一行弹出编辑界面的脚本。有了这样的编程助手,您可以省却编写 js 的工作量。虽然目前的编程助手只能为您准备这些实现控件之间的数据流动的代码,但是拥有了这个基础,使用者可以进一步丰富其功能,也可以通过网络获得我们的服务功能,是编程助手拥有更丰富的功能。 <!-- [if !supportLists]-->11、 <!-- [endif]-->图形化的 Java 代码开发 本工具提供的另外一个功能,可视化的 java 代码开发。看一下截图: <!-- [if gte vml 1]><v:shape id="图片_x0020_25" o:spid="_x0000_i1025" type="#_x0000_t75" style="width:415.5pt;height:312pt; visibility:visible;mso-wrap-style:square" mce_style="width:415.5pt;height:312pt; visibility:visible;mso-wrap-style:square"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image015.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image015.png" o:title="" /> </v:shape><![endif]--><!-- [if !vml]--> <!-- [endif]--> 这个功能我就不详细介绍了。只说一点,对于使用者来说,这个功能也是可以扩展的。通过提供自己的代码翻译器,使用者可以实现自己需要的图形表示,得到自己想要的代码。工具中提供了基本的实现:如方法调用、循环、判断、开关及常量、变量、参数、返回值的实现,目前支持生成 java 和 js 代码。欢迎有兴趣的同学下载示例体验一下。 |
|
wnay184163.com
2008-12-18
感觉到是好东西,先从头看看,支持开源,谢谢分享
|
|
littleJava
2009-06-02
看了楼主的描述,彻底晕了,真是牛人,不过项目很久没有进展了,楼主难道放弃了吗?很天才的项目啊,适用于小型项目的快速开发
|