冉春娟,黃華
(武漢大學 計算機學院,湖北 武漢 430071)
近年來,企業(yè)或政府部門的核心業(yè)務大多通過管理信息系統(tǒng)MIS實現,MIS系統(tǒng)開發(fā)成為應用系統(tǒng)開發(fā)的主流.在當前計算機技術條件下,MIS系統(tǒng)大部分是構建在關系數據模型上,其系統(tǒng)的開發(fā)方法也有很多的相似性.通過考察基于主流開發(fā)平臺(如Java與.Net)多層架構的程序實現代碼,發(fā)現大量相似程序代碼都與關系數據模型相關,根據所做的統(tǒng)計,其平均代碼行數占到總代碼行數的50%,有的甚至接近70%.如能以關系數據模型作為輸入,自動生成相關程序代碼,必將可以大大縮短MIS系統(tǒng)的開發(fā)周期,提高軟件代碼的質量,也可快速適應MIS系統(tǒng)頻繁的需求變化.
從現有的主流代碼生成技術看,都采用了基于模板的方法,即以成功應用的程序代碼作為藍本,將其中固定不變的部分作為靜態(tài)代碼框架部分,將其中需要變化的部分通過結合一定的標記或生成語言改寫為可動態(tài)替換的腳本,從而構成代碼模板文件,再結合生成工具同數據源相作用,生成實際的程序代碼[1].盡管原理相似,但不同的代碼生成工具在具體實現技術上卻不盡相同,概括起來分為兩種類型:內置模板型和可定制模板型.(1)內置模板型:代碼的模板與生成工具是一體的,模板的格式和內容都隱含在生成工具中,不能定制.這一類的生成工具如動軟.Net代碼生成器,JAG-Java代碼生成器等.(2)可定制模板型:代碼的模板與生成工具分離,代碼生成工具提供一種標記語言作為模板的編寫規(guī)則.用戶可通過標記語言編寫代碼模板,從而滿足不同應用平臺和應用環(huán)境的需要.這一類的生成工具如CodeSmith,Freemarker,Velocity等.
對于以上兩種類型的代碼生成工具,內置模板型由于將模板內置在程序中,用戶不能定制模板和生成規(guī)則,其應用環(huán)境非常有限,通用性也比較差.對于CodeSmith,Freemarker,Velocity等[2]可定制模板型生成工具.盡管功能強大,能滿足各種代碼生成需要,具備較強的通用性,但這些生成工具所支持的代碼生成控制語言要么基于一種實際的開發(fā)語言(如CodeSmith基于C#語言),要么基于一種通用解釋型語言,掌握語言本身就需要花費大量的時間,同時這些語言同關系數據模型結合不緊密,往往編寫的模板代碼結構復雜,難于維護,也很難在軟件開發(fā)團隊中得到快速的應用.
2.1設計思路通過上述代碼生成技術分析可知:如果能在保持可定制模板型代碼生成工具框架結構基礎上,對其代碼生成控制語言進行改進,采用一種與關系數據模型緊密結合的代碼生成控制語言,將可以保持生成工具通用性,并提高代碼生成工具的可用性.據此,我們對代碼生成工具的設計劃分為兩部分:(1)與關系數據模型緊密相關的代碼生成控制語言(以下稱RDM CodeMark語言)的設計;(2)基于RDM CodeMark語言的代碼生成工具(以下簡稱RDM代碼生成工具)的設計.
2.2 RDM代碼生成工具工作原理
圖1 RDM代碼生成工具結構模型
2.2.1 RDM代碼生成工具結構模型 RDM代碼生成工具在原理上仍是一種基于模板的代碼生成工具,具有該類型代碼生成工具的通用結構,具體實現上有特殊之處,圖1是RDM代碼生成工具組成模型:(1) 關系模型建模:對關系模型進行的形式化描述,代表系統(tǒng)的關系模式信息,構成RDM代碼生成器的輸入.模型可以采用Word文檔、運行的數據庫以及UML文檔等;(2) RDM CodeMark語言:同關系數據模型相關的代碼生成控制語言,采用類XML語言的語法格式和迭代語義規(guī)則,用于編寫代碼模板文件中動態(tài)代碼生成腳本;(3) 模板文件:采用RDM CodeMark語言編寫的代碼生成控制腳本文件(即RDM CodeMark語言程序),用于定義輸出代碼文件的創(chuàng)建信息和在生成文件中定制代碼內容;(4) RDM代碼生成器:代碼生成工具核心程序,以關系模型建模作為輸入,執(zhí)行指定代碼模板文件,輸出生成后的代碼文件.主要由關系數據模型管理部件和代碼生成部件兩部分組成,其中關系數據模型管理部件用于將不同的外部關系模型建模導入后轉換到內部標準關系模型對象集進行維護和管理,為代碼生成部件提供一致的關系模型訪問接口.代碼生成部件則通過調入指定模板文件按照RDM CodeMark語言迭代語義規(guī)則執(zhí)行,在執(zhí)行過程中嵌入對關系數據模型對象集標記的解析,最終生成實際程序代碼文件;(5) 代碼文件:實際生成代碼的輸出文件,是可以在項目系統(tǒng)中加入的可編譯源程序文件.
2.2.2 代碼生成工具工作過程 (1) 采用RDM CodeMark語言編寫代碼模板文件;(2) 采用word文檔、數據庫建庫工具或UML對關系模型建模;(3) 在RDM代碼生成器中導入關系模型建模,轉換為內部統(tǒng)一關系數據模型對象集,并維護對象集信息的完整性;(4) 在RDM代碼生成器中選擇模板文件并執(zhí)行,生成目標代碼輸出文件.
表1 表對象屬性及其標記
3.1關系數據模型對象集設計
關系數據模型對象集是對具體項目所設計的數據字典的統(tǒng)一對象化表示,構成代碼生成部件的實際輸入支持對象.關系數據模型對象集由表集合、表、列集合、列對象組成,對應關系數據模型中的元模型數據.
表對象主要屬性及其在腳本中的代碼標記如表1,列對象主要屬性及其在腳本中的代碼標記如下表2.
表2 列對象屬性及其標記
3.2 RDM CodeMark標記語言RDM CodeMark標記語言是結合關系數據模型設計的代碼標記語言,在語法格式上接近XML語言,通過在代碼模板中嵌入標記語言編寫的腳本程序,為代碼生成部件提供代碼生成控制.RDM CodeMark語言的語法成分分為三種類型:迭代控制語句、輸出控制語句和關系模型對象代碼標記.
3.2.1 迭代控制語句
1) 表迭代語句TableLoop:執(zhí)行對所有的表進行一次迭代展開.
語法格式:
(1)
.
(2)
2) 表檢查語句TableCheck:執(zhí)行表屬性檢查,滿足條件的,執(zhí)行對應的模板.
語法格式為:
.
(3)列迭代語句ColumnLoop:對表中所有列進行一次迭代展開.
語法格式為:
(4)列檢查語句ColumnCheck:執(zhí)行列屬性檢查,滿足條件的,執(zhí)行對應的模板.
語法格式為:
(5)調用腳本語句CallScript:將嵌入的模板腳本執(zhí)行,并引用其輸出.
語法格式為:.
(6) 腳本包含語句Using:將指定的模板文件嵌入到當前文本中.
語法格式為:.
3.2.2 輸出控制語句 輸出控制語句只有一個OutputToFile語句,用于將迭代生成的文本寫入到指定文件中.在一個文本文件中多次使用則可控制生成多個文件.
語法格式為:
其中,
3.2.3 關系模型對象代碼標記 見表1和表2中各個對應屬性的標記語法部分.
3.3 RDM代碼生成腳本(模板)文件使用RDM CodeMark標記語言編寫的腳本文件是一種特殊的解釋型代碼生成控制程序(簡稱RDM CodeMark腳本程序),能夠在對應的翻譯器中控制執(zhí)行,以關系數據模型對象集作為輸入,動態(tài)生成與關系數據模型相關的各種程序代碼.
RDM CodeMark腳本程序中文本分為兩類:RDM CodeMark標記語言語法成分和普通文本.RDM CodeMark腳本翻譯器針對RDM CodeMark標記語言語法成分進行迭代解釋輸出,而對于普通文本則不做處理直接輸出.RDM CodeMark腳本程序的編寫規(guī)則取決于翻譯器的代碼生成規(guī)則,具體規(guī)則見4.2節(jié)代碼生成的算法.
RDM CodeMark腳本程序示例如下:
(1)用于生成對表進行Insert操作的SQL語句,見圖2:
圖2 表的Insert操作模板腳本
(2).Net平臺下數據操作模型對象的生成實例,見下圖3:
圖3 .Net數據操作對象模板及代碼生成實例
4.1 RDM代碼生成器的靜態(tài)類結構RDM代碼生成器的靜態(tài)類設計可劃分為數據模型管理、數據模型導入,詞法解析,文件寫入,腳本迭代解析,代碼生成等不同職責的類集合.其對象關系見圖4.
圖4 RDM 代碼生成工具類結構框架
數據模型管理類集合的作用是對關系數據模型的標準化表示和統(tǒng)一管理.由TableStandar-dModel、TableSet、Column-StandardModel、ColumnSet、DataModel-Catalog類構成,分別對應表標準模型類、表集合類、列標準模型類、列集合類、數據模型管理類.
數據模型導入類集合的作用是將外部各種形式的應用系統(tǒng)關系數據模型設計轉換為內部標準數據模型,IDataModelImporter是導入類的抽象接口,主要方法為 DataModel-Catalog ImportDataModel(),為所有具體的導入類提供統(tǒng)一的功能規(guī)約.DataBase-Importer、XMLImporter、DocImporter、UmlImpo-rter類實現IDataModel-Importer接口,對應實現以數據庫系統(tǒng)、XML數據模型設計文檔、Word數據模型設計文檔和UML數據模型設計文檔作為源模型向標準數據模型的轉換.ScriptBuilder、FileWriter、CodeParser-Util類屬于工具類,分別實現腳本文件的構造、腳本文件的輸出、腳本的語法成分解析,為模板文件的迭代生成提供底層支持.
腳本迭代解析類集合按照RDM CodeMark標記語言的各個語句的語義要求,實現各種語句的腳本迭代解析,解析的過程就是局部生成目標代碼的過程.所有語句解析類實現一個統(tǒng)一的腳本解析接口IScriptParser,其主要方法為string ParseScript(),實現腳本的迭代生成的功能規(guī)約.圖2中實現IScriptParser的各類分別對應實現各個語句的語義迭代翻譯,限于篇幅此處不再詳述.RDMCodeGenerator類是代碼生成器的核心控制器類,以數據模型為輸入,執(zhí)行加載的模板文本,并生成最終的程序代碼.
4.2 RDM代碼生成的關鍵算法RDMCodeGenerator類的方法Generate()是生成目標程序代碼的關鍵方法,該方法的執(zhí)行算法見下圖5的代碼生成序列圖.
圖5 代碼生成序列圖
圖6 采用Delphi實現的RDM代碼生成工具的主界面
4.3 RDM代碼生成器界面與功能按照RDM代碼生成工具的設計,可以采用任意支持面向對象編程的開發(fā)工具進行實現,圖6為采用Delphi實現的RDM代碼生成工具的主界面,其主要功能包括:數據模型設計文件的導入和編輯管理,模板文件的編輯和管理,模板的選擇與執(zhí)行管理,腳本的生成與輸出管理等.
RDM代碼生成工具可按照應用系統(tǒng)數據模型設計快速生成應用系統(tǒng)開發(fā)的基礎框架代碼,以“武漢大學本科生課程標準化考試系統(tǒng)”為例說明生成工具搭建系統(tǒng)框架程序的過程,如下圖7所示:
圖7 RDM代碼生成工具搭建系統(tǒng)框架程序實
圖8 .Net中生成的項目解決方案圖示
過程說明:(1)采用word文檔將系統(tǒng)的數據模型設計進行文檔化并導入工具中轉換為標準數據模型對象;(2)生成數據庫建庫腳本SQL文件,在MS SQL Server2005中執(zhí)行并創(chuàng)建數據庫;(3)按照.Net多層程序框架,依次生成應用系統(tǒng)的Model層(模型層)、DAL層(數據存取層)、FacadeBLL層(基礎數據邏輯層)、UI層(基礎用戶界面層)代碼[3],見圖8;(4)在.Net開發(fā)工具VS2005中完成系統(tǒng)業(yè)務邏輯編程以及界面和程序的優(yōu)化.
在此項目的實踐中,大約70%的程序代碼編寫工作轉變?yōu)楣ぞ呱?,大大提高了系統(tǒng)開發(fā)的效率,增強了代碼的穩(wěn)定性.
通過采用RDM代碼生成工具,可以形成一套完整的程序開發(fā)模式.通過在WORD文檔或直接在軟件中建立系統(tǒng)數據模型,使用此生成工具可以生成從數據庫創(chuàng)建SQL腳本文件,到.Net或J2EE開發(fā)平臺上的各層直接可編譯代碼文件,從而大幅度簡化項目的代碼開發(fā)工作量.另通過在開發(fā)工具中增加對生成文檔和程序文件的自動比對功能,則可識別出生成代碼中被維護的部分,從而在數據模型改變時可很快的遷移這部分修改,進一步增強了代碼的可維護性.
當然,本文所描述的關系數據模型只是一個簡化模型方案,若在此基礎上結合更多的數據模型特征或增加腳本語言的功能,則可進一步提高生成代碼的質量和生成工具的可適用性.
參考文獻:
[1] 肖寒.J2EE平臺下代碼自動生成技術研究[J].電腦知識與技術,2009,5(20):5421-5422,5434.
[2] 孫茂增,李鳳華,都婧.基于Velocity的J2EE應用代碼生成系統(tǒng)[J].儀器儀表用戶,2008,15(1):105-106.
[3] 陸遠,胡瑩..NET平臺下敏捷開發(fā)架構及代碼生成技術[J].微計算機信息,2009(33):11-12,32.
[4] 楊美榮,史建鋒,李明星.基于MDA 的代碼生成器設計與實現[J].計算機工程,2009,35(12):47-49,53.
[5] 楊皓,楊忠,吳愚.基于XML腳本的代碼生成技術及其應用[J].電腦知識與技術,2009(7):7.