薛召,王晶,李煒
(1 北京郵電大學(xué)網(wǎng)絡(luò)與交換技術(shù)國家重點實驗室,北京 100876;2 東信北郵信息技術(shù)有限公司,北京 100191)
一直以來,軟件工程界在如何減少軟件工程師的工作量和提高軟件產(chǎn)品的質(zhì)量上做著不懈的探討和研究。近些年,一系列Web開發(fā)框架,如Struts、Hibernate和Spring等,都從軟件復(fù)用的角度成功地實現(xiàn)了減輕軟件設(shè)計和開發(fā)的負擔(dān)。這些框架均完成了底層邏輯代碼的復(fù)雜工作。然而,在實際的大型軟件系統(tǒng)或平臺的開發(fā)過程中,仍然有大量的上層業(yè)務(wù)邏輯是重復(fù)的,而且這部分的任務(wù)量也相當(dāng)可觀,所以如何減少這部分的工作量就成了現(xiàn)階段軟件工程師需要解決的問題了。由于這些重復(fù)性的代碼在很大程度上是相似的,所以通過模板的方式來實現(xiàn)代碼自動生成的技術(shù)便應(yīng)運而生[1]。
代碼生成技術(shù)是一個專注于解放代碼生產(chǎn)力,用程序來編程的研究方向,是MDA(模型驅(qū)動架構(gòu))思想的一個重要的技術(shù)基礎(chǔ)[2],同時,也是對軟件開發(fā)自動化的探索[3]。代碼生成技術(shù)可以幫助程序員完成枯燥且重復(fù)性的工作,提高軟件系統(tǒng)的健壯性和可維護性[4]。此外,也很容易進行擴展。
Velocity是一個基于Java的模板引擎,它可以獨立產(chǎn)生源代碼、HTML和報告,也可以和其它系統(tǒng)相結(jié)合提供模板服務(wù)[5]。它讓W(xué)eb頁面設(shè)計者能使用簡單而功能強大的模板語言來引用Java代碼中定義的對象。作為Java代碼和網(wǎng)頁之間的分離層,其使得Web設(shè)計者和Java程序員可以根據(jù)MVC(Model View Controller)模塊并行設(shè)計一個Web站點,從而使得整個站點更容易維護。
如圖1所示,該代碼生成引擎主要由3部分組成:注解解析模塊、Generator Engine和文件輸出系統(tǒng)。其輸入為標記有Struts2注解的系統(tǒng)平臺業(yè)務(wù)對象[6]的Java代碼文件,輸出為該對象對應(yīng)的JSP頁面文件、業(yè)務(wù)邏輯層[7]Java文件、數(shù)據(jù)持久層[7]Java文件以及相應(yīng)的Spring配置文件。執(zhí)行流程為首先對包含注解的Java文件進行注解解析處理,獲得注解信息后,由GeneratorEngine根據(jù)注解信息從模板庫加載模板文件,然后通過文件輸出系統(tǒng)生成各種文件。
圖1 代碼生成引擎結(jié)構(gòu)圖
該代碼生成引擎實現(xiàn)了模型驅(qū)動的開發(fā)模式,允許用戶在編寫完成多個業(yè)務(wù)對象之后,通過添加注解,統(tǒng)一生成頁面文件、業(yè)務(wù)邏輯層和數(shù)據(jù)持久層CRUD(Create、Read、Update和Delete)Java代碼和配置文件。
圖2 注解解析模塊結(jié)構(gòu)圖與UML圖
如圖2所示,注解解析模塊主要由注解掃描模塊、注解提取模塊和注解處理模塊組成。其涉及到的各個類主要為依賴關(guān)系。
注解掃描模塊會根據(jù)配置文件中的路徑去掃描相應(yīng)的業(yè)務(wù)對象所在的源碼包,并掃描每一個業(yè)務(wù)對象類。若類中聲明了注解,則調(diào)用注解提取模塊提取業(yè)務(wù)對象上的注解。注解提取模塊提取到注解信息后,會調(diào)用注解處理模塊。然后,注解處理模塊會傳遞參數(shù)給GeneratorEngine,并委派其生成模板。
代碼生成引擎的核心是GeneratorEngine,其對Velocity的常用接口進行了封裝。
圖3 GeneratorEngine執(zhí)行流程
如圖3所示,GeneratorEngine生成代碼的主要執(zhí)行流程為:
(1)創(chuàng)建一個VelocityEngine實例,設(shè)置其屬性,并完成初始化;
(2)創(chuàng)建一個VelocityContext實例;
(3)根據(jù)GeneratorEngine的參數(shù),添加必要的數(shù)據(jù)到VelocityContext實例中;
(4)創(chuàng)建一個IO流實例用來輸出模板內(nèi)容;
(5)獲取VM模板,通過Template類,并使用Velocity的getTemplate方法加載模板;
(6)合并模板和數(shù)據(jù);
(7)調(diào)用文件輸出系統(tǒng)生成各種文件。
文件輸出系統(tǒng)首先檢查配置文件中的輸出文件路徑是否存在,若不存在則創(chuàng)建相應(yīng)路徑;然后根據(jù)模板輸出各種文件。
本文描述的代碼生成引擎作為手動開發(fā)的一個補充,可以避免開發(fā)者在那些重復(fù)性的工作上浪費時間與精力,同時也可以消除由于失誤而產(chǎn)生的錯誤[8],提高了代碼質(zhì)量。
目前,代碼生成技術(shù)雖受到越來越多的開發(fā)者和學(xué)者的關(guān)注,但發(fā)展仍然很不足。一方面的原因是,目前的技術(shù)僅能做到自動生成部分代碼,只是作為手動開發(fā)的一個補充。所以導(dǎo)致眾多開發(fā)者的熱情不是很高。但是隨著代碼生成技術(shù)的理論基礎(chǔ)的不斷發(fā)展,隨著業(yè)界實踐的不斷推動,未來能夠滿足自動生成大部分代碼乃至全部代碼的生成引擎終將會實現(xiàn)。希望這一天能夠早日到來。
[1]Toeppe,S.Automatic code generation requirements for production automotive powertrain applications[A].Proceedings of 1999 IEEE International Symposium on Computer Aided Control System Design[C].Kohala Coast,HI.Aug,1999: 200-206.
[2]盛剛,韓莉莉著.J2EE代碼自動生成研究[J].計算機系統(tǒng)應(yīng)用.2006,(8): 31-33.
[3]Fang M,Ying J,Wu MH.A Template Engineering Based Framework for Automated Software Development[A].Proceedings of 10th International Conference on Computer Supported Cooperative Work in Design[C].Nanjing.May,2006: 1-6.
[4]Yang M H,Liao J X,Chen X.Performance analysis of service platform with unstructed supplementary service data[J].Journal of Beijing University of Posts and Telecommunications.Vol29,No5,Oct,2006: 93-97.
[5]李曉黎,張曉輝.Velocity網(wǎng)頁程序設(shè)計[M].北京:人民郵電出版社.2001,11.
[6]楊柳.應(yīng)用服務(wù)器業(yè)務(wù)層框架的設(shè)計與實現(xiàn)[D].2012,03.北京郵電大學(xué).
[7]Naji,H A H.Research and design of library information system based on three layers architecture[A].Information Engineering and Computer Science.2010 2nd International Conference[C].Wuhan.Dec,2010: 1-3.
[8]Whalen M W.On the requirements of high-integrity code generation[A].Proceedings of 4th IEEE International Symposium on High-Assurance Systems Engineering[C].Washington,DC.Nov,1999: 217-224.