薛召,王晶,李煒
(1 北京郵電大學網絡與交換技術國家重點實驗室,北京 100876;2 東信北郵信息技術有限公司,北京 100191)
一直以來,軟件工程界在如何減少軟件工程師的工作量和提高軟件產品的質量上做著不懈的探討和研究。近些年,一系列Web開發框架,如Struts、Hibernate和Spring等,都從軟件復用的角度成功地實現了減輕軟件設計和開發的負擔。這些框架均完成了底層邏輯代碼的復雜工作。然而,在實際的大型軟件系統或平臺的開發過程中,仍然有大量的上層業務邏輯是重復的,而且這部分的任務量也相當可觀,所以如何減少這部分的工作量就成了現階段軟件工程師需要解決的問題了。由于這些重復性的代碼在很大程度上是相似的,所以通過模板的方式來實現代碼自動生成的技術便應運而生[1]。
代碼生成技術是一個專注于解放代碼生產力,用程序來編程的研究方向,是MDA(模型驅動架構)思想的一個重要的技術基礎[2],同時,也是對軟件開發自動化的探索[3]。代碼生成技術可以幫助程序員完成枯燥且重復性的工作,提高軟件系統的健壯性和可維護性[4]。此外,也很容易進行擴展。
Velocity是一個基于Java的模板引擎,它可以獨立產生源代碼、HTML和報告,也可以和其它系統相結合提供模板服務[5]。它讓Web頁面設計者能使用簡單而功能強大的模板語言來引用Java代碼中定義的對象。作為Java代碼和網頁之間的分離層,其使得Web設計者和Java程序員可以根據MVC(Model View Controller)模塊并行設計一個Web站點,從而使得整個站點更容易維護。
如圖1所示,該代碼生成引擎主要由3部分組成:注解解析模塊、Generator Engine和文件輸出系統。其輸入為標記有Struts2注解的系統平臺業務對象[6]的Java代碼文件,輸出為該對象對應的JSP頁面文件、業務邏輯層[7]Java文件、數據持久層[7]Java文件以及相應的Spring配置文件。執行流程為首先對包含注解的Java文件進行注解解析處理,獲得注解信息后,由GeneratorEngine根據注解信息從模板庫加載模板文件,然后通過文件輸出系統生成各種文件。

圖1 代碼生成引擎結構圖
該代碼生成引擎實現了模型驅動的開發模式,允許用戶在編寫完成多個業務對象之后,通過添加注解,統一生成頁面文件、業務邏輯層和數據持久層CRUD(Create、Read、Update和Delete)Java代碼和配置文件。

圖2 注解解析模塊結構圖與UML圖
如圖2所示,注解解析模塊主要由注解掃描模塊、注解提取模塊和注解處理模塊組成。其涉及到的各個類主要為依賴關系。
注解掃描模塊會根據配置文件中的路徑去掃描相應的業務對象所在的源碼包,并掃描每一個業務對象類。若類中聲明了注解,則調用注解提取模塊提取業務對象上的注解。注解提取模塊提取到注解信息后,會調用注解處理模塊。然后,注解處理模塊會傳遞參數給GeneratorEngine,并委派其生成模板。
代碼生成引擎的核心是GeneratorEngine,其對Velocity的常用接口進行了封裝。

圖3 GeneratorEngine執行流程
如圖3所示,GeneratorEngine生成代碼的主要執行流程為:
(1)創建一個VelocityEngine實例,設置其屬性,并完成初始化;
(2)創建一個VelocityContext實例;
(3)根據GeneratorEngine的參數,添加必要的數據到VelocityContext實例中;
(4)創建一個IO流實例用來輸出模板內容;
(5)獲取VM模板,通過Template類,并使用Velocity的getTemplate方法加載模板;
(6)合并模板和數據;
(7)調用文件輸出系統生成各種文件。
文件輸出系統首先檢查配置文件中的輸出文件路徑是否存在,若不存在則創建相應路徑;然后根據模板輸出各種文件。
本文描述的代碼生成引擎作為手動開發的一個補充,可以避免開發者在那些重復性的工作上浪費時間與精力,同時也可以消除由于失誤而產生的錯誤[8],提高了代碼質量。
目前,代碼生成技術雖受到越來越多的開發者和學者的關注,但發展仍然很不足。一方面的原因是,目前的技術僅能做到自動生成部分代碼,只是作為手動開發的一個補充。所以導致眾多開發者的熱情不是很高。但是隨著代碼生成技術的理論基礎的不斷發展,隨著業界實踐的不斷推動,未來能夠滿足自動生成大部分代碼乃至全部代碼的生成引擎終將會實現。希望這一天能夠早日到來。
[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].計算機系統應用.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網頁程序設計[M].北京:人民郵電出版社.2001,11.
[6]楊柳.應用服務器業務層框架的設計與實現[D].2012,03.北京郵電大學.
[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.