代码生成器的存在价值 选择自 mechiland 的 Blog
多年前用ASP的時候,就聽說了有一種叫做代碼生成器的神奇的東西。只需要指定數(shù)據(jù)庫鏈接,這個代碼生成器就能夠產(chǎn)生一個界面,然后選擇你需要進(jìn)行生成的數(shù)據(jù)表,按一下按鈕,馬上基于這個表的增刪改查界面以及對應(yīng)的ASP程序代碼就生成出來,著實方便。當(dāng)時的我對ASP已經(jīng)輕車熟路,看了一眼這個工具后,心中評估了一下,然后使用了一把……看到這個工具生成的ASP程序源代碼,讓人確實有點(diǎn)接受不了——大小寫不區(qū)分,大段大段的冗余代碼。雖然生成的代碼確實能夠完成特定的業(yè)務(wù)操作,但是維護(hù)性確實太差了。據(jù)說后來有一些優(yōu)質(zhì)的代碼生成器能夠生成更好的程序,但是確實是從那個時候開始,代碼生成器在我心里成了垃圾代碼堆砌的代名詞。我情愿自己編寫一行一行代碼也不愿意用代碼生成器。
現(xiàn)在,當(dāng)專注于某一個行業(yè),某一種特定業(yè)務(wù)時,你會發(fā)現(xiàn)重復(fù)性是如此之大。——用戶管理在大多數(shù)地方都是類似的,只是用戶相對的字段有些不一樣;用戶登錄界面、登出界面可能也是一樣的,只是把某些圖片換一下而已;大部分的業(yè)務(wù)操作都是增刪改查,對于這種操作不斷的采用同一種方式進(jìn)行重復(fù)、還得小心出錯;權(quán)限管理界面看起來也沒什么大的不同……也許我們早就煩了。框架在某種程度上保證了項目的質(zhì)量,但并不能減少編碼量;某些框架甚至需要更多的編碼(以及學(xué)習(xí)時間)。例如,與Servlet+JSP方式相比,Struts除了JSP, 還需要編寫特定的Form, Action,并在struts-config.xml中加上幾行;Tapestry則需要編寫.page, .html, 對應(yīng)的Page類,如果需要驗證還得編寫Delegate類;至于FreeMaker,Velocity之類界面工作量可能小了一些,但還得需要編寫自己的簡單框架用以實現(xiàn)MVC模式。Spring集成了這些表示層,看起來比較好……
上述解決方案的根本問題在于,框架只是保證了項目的質(zhì)量、可維護(hù)性,但是沒有減少編碼量。因此,代碼生成器的使用便是理所當(dāng)然的了。這方面已經(jīng)有先例了,最有效、最能夠顯示代碼生成的威力的,當(dāng)屬xdoclet的ejb任務(wù)。我們知道,創(chuàng)建一個EJB需要同時創(chuàng)建其他四個無聊的接口,xdoclet在這方面將代碼生成的威力發(fā)揮到了極致。另外,middlegen也能夠創(chuàng)建基于數(shù)據(jù)庫,使用Hibernate, Struts, EJB技術(shù)的Web應(yīng)用程序,他能夠生成JSP, Hibernate映射文件,Java類,EJB類等。middlegen應(yīng)該是我見到的最完整的應(yīng)用程序生成器的雛形,但是他還不足以具體,不足以縮短編碼時間。
我思考了幾天,在做OpenBUGZ和公司項目的過程中,想出了這種模型:
基礎(chǔ)架構(gòu):Spring, Hibernate, Tapestry
Spring,Hibernate的好處自不待言,前臺沒有采用Struts或者WebWork,是因為前兩者在界面表示上不夠靈活,Struts需要配合Tiles才能實現(xiàn)靈活的布局,WebWork不太熟悉,不知道如何實現(xiàn)靈活的布局。然而在Tapestry中布局的問題幾乎不是問題。
應(yīng)用技術(shù):Ant, Xdoclet, FreeMaker, JUnit
用FreeMaker而不用Velocity是因為前者有更多的支持,而且從我的使用感覺來說,FreeMaker相對較強(qiáng)大。
開發(fā)步驟:
1 首先開發(fā)者(項目經(jīng)理或者技術(shù)經(jīng)理)根據(jù)需求對整個系統(tǒng)建模,完成基本類圖,生成所有的業(yè)務(wù)模型類;
2 根據(jù)業(yè)務(wù)模型類編寫Hibernate映射文件(用xdoclet可能不太方便,特別是業(yè)務(wù)模型類存在繼承關(guān)系時);
3 (代碼生成)生成對應(yīng)的DAO接口例如XXXDAO,用來對XXX對象進(jìn)行增刪改查 (如果采用Spring Hibernate Template,這一步可以省略)
4 (代碼生成)生成采用Hibernate的DAO實現(xiàn)
5 (代碼生成)生成業(yè)務(wù)邏輯層代碼XXXManager,用來調(diào)用DAO層實現(xiàn)各種業(yè)務(wù)邏輯操作;
6 (代碼生成)生成XXXManager對應(yīng)的單元測試
7 (代碼生成)生成業(yè)務(wù)模型類的增刪改查界面Html(通過模板)
8 (代碼生成)生成界面對應(yīng)的Tapestry所需要的.page文件
9 (代碼生成)如果需要驗證,還需要生成需要的Delegate類
10 (代碼生成)生成對應(yīng)的增刪改查Page類
11 (代碼配置)在Spring的配置文件中配置DAO的事務(wù)
12 (代碼配置)在Spring的配置文件中配置XXXManager
13 配置數(shù)據(jù)庫鏈接,利用Hibernate的SchemaExport直接生成數(shù)據(jù)庫
14 生成整個項目的文件結(jié)構(gòu),包括build.xml,如果需要,也可以生成JBuilder或者Eclipse項目
15 開發(fā):對 XXXManager進(jìn)行更改,對界面進(jìn)行修飾。
從上面可以看到,整個項目工作量已經(jīng)很低了;-) 這樣對業(yè)務(wù)分析人員的要求比較高,要求一次能夠分析全面徹底。項目中最后的工作只剩下修改業(yè)務(wù)邏輯,修改修改頁面了。這就是代碼生成器的威力。
作者Blog:http://blog.csdn.net/mechiland/
轉(zhuǎn)載于:https://www.cnblogs.com/sunsonbaby/archive/2004/12/09/75054.html
總結(jié)
以上是生活随笔為你收集整理的代码生成器的存在价值 选择自 mechiland 的 Blog的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Junit Test使用样例
- 下一篇: chrome 开启 JSONview