王 博 ,華慶一,舒新峰
(1.西安郵電大學 計算機學院,陜西 西安 710121;2.西安郵電大學 陜西省網(wǎng)絡(luò)數(shù)據(jù)智能處理重點實驗室,陜西 西安 710121;3.西北大學 信息科學與技術(shù)學院,陜西 西安 710127)
隨著信息產(chǎn)業(yè)的不斷深入發(fā)展,應(yīng)用軟件需求和開發(fā)環(huán)境變得越來越復雜。傳統(tǒng)軟件開發(fā)方法開發(fā)周期漫長且工作重復較大,為系統(tǒng)演進和維護造成較大困難[1]。與此同時,新軟件開發(fā)方法和思想以及工具,導致軟件工程方法論發(fā)生深刻變化,尤其是以對象管理組織(Object Management Group,OMG)提出的模型驅(qū)動構(gòu)架(Model Driven Architecture,MDA)為代表的方法論。在David S.Frankel 的《應(yīng)用MDA》一書中指出:“把寶貴的時間浪費在‘紙上談兵’上是一種罪惡?!盵2]如果能夠把設(shè)計直接轉(zhuǎn)換成代碼,亦即把設(shè)計和實現(xiàn)對應(yīng)起來,那么無論對于代碼質(zhì)量和效率都會有較高提升。
自動代碼生成,即根據(jù)用戶任務(wù)需求建模而自動生成源代碼的程序或軟件。本文所特指自動代碼生成技術(shù)是在軟件開發(fā)過程中由經(jīng)驗而形成的一種軟件工程技術(shù),通過自動生成工具或者程序半自動/全自動的生成應(yīng)用系統(tǒng)所用到的原始框架和代碼,一般生成文本形式的源代碼[3]。自動代碼生成主要的優(yōu)點和意義在于:減少重復的編碼工作,生成代碼風格一致良好,系統(tǒng)設(shè)計成為開發(fā)的主導,易于修改和升級,設(shè)計和實現(xiàn)具有連貫性。
本文提出一種采用模型驅(qū)動構(gòu)架的設(shè)計思想,靈活配置的、融合模板和模型驅(qū)動的自動代碼生成方案,稱之為混合自動代碼生成(Hybrid Automatic Code Generation,HACG)。HACG 自動代碼生成方法的創(chuàng)新點如下:
1)HACG 融合基于模板和模型驅(qū)動的代碼生成的優(yōu)點,可以簡單高效地構(gòu)建自動代碼生成引擎;
2)HACG 提出針對不同語言、不同框架的統(tǒng)一的自動代碼生成解決方案;
3)HACG 針對元模型的不同實體關(guān)系模型的自動代碼生成方案和策略;
4)HACG 具有較高的靈活性、通用性、完整性和可擴充的特點;
5)HACG 對自動代碼生成提出一種新的劃分,分為基礎(chǔ)功能容器、全自動代碼生成、代碼框架生成和定制代碼。
當前主要的代碼生成主要有基于模板、基于模型驅(qū)動、基于對象關(guān)系映射、基于文檔注釋和基于代理的自動代碼生成[4]。與HACG 較為相關(guān)的是基于模板和基于模型驅(qū)動的自動代碼生成,下面主要從上述兩種方法展開。
基于模板的代碼生成(Template-Based Code Generation,TBCG)起源于 20世紀 90年代中期,模板的重用是基于“編寫一次,生成多次(Write Once,Produce Many)”的理念[3]?;谀0宓拇a生成是利用系統(tǒng)共性的需求(模板)和個性的需求(特定的外部輸入),通過代碼生成引擎來生成系統(tǒng)源代碼的方法?;谀0宓拇a生成較為困難的問題是明確區(qū)分輸入和轉(zhuǎn)化邏輯,亦即將元數(shù)據(jù)和具體業(yè)務(wù)規(guī)則進行分離,通過使用模板引擎技術(shù),可將業(yè)務(wù)規(guī)則抽象到模板文件中,將元數(shù)據(jù)作為動態(tài)插入數(shù)據(jù)[5]。分層技術(shù)是基于模板的自動代碼生成核心技術(shù)之一。
分層技術(shù)在當前的軟件開發(fā)中被廣泛的使用。在軟件開發(fā)過程當中,把具有不同過程的解決方案放置到不同的概念層,隨后整個層次形成不夠封閉的系統(tǒng),其中每個層次在級別上具有平等性[6]。 層與層之間通過層接口進行數(shù)據(jù)交互。分層的優(yōu)點在于提高系統(tǒng)的靈活性和可復用性,能夠提高軟件開發(fā)的效率。
定義1(分層結(jié)構(gòu)) 約定n層構(gòu)架的各層編號為1,2,…,n,其中,層的編號越大,則越處于系統(tǒng)的高層。那么分層構(gòu)架應(yīng)該滿足如下規(guī)則:
1)第k層(1<k≤n)層智能依賴于k-1 層,而不能依賴于其他低層;
2)如果p層依賴于q層,則p的編號大于q。
該原則保證層依賴的單向性,減少和降低系統(tǒng)邏輯的復雜性,使得系統(tǒng)在提高功能和可復用性前提下易于控制。
定義2(分層對象模型) 將基于分層體系的對象模型分成數(shù)據(jù)實體對象、持久層對象和業(yè)務(wù)邏輯層對象,每層的對象可以表示為一個n元組。
1)數(shù)據(jù)實體對象 MO=(mo_id,mo_name,attr_set,op_attr)。其中:mo_id,mo_name 分別對應(yīng)模型實體對象MO 的唯一的標識和名稱;attr_set 代表該實體的屬性集;op_attr 代表對該屬性的操作,一般對應(yīng)該實體的可讀和可寫算子。
2)持久層對象 PO=(po_id,po_name,mo,dll_set)。其中:po_id,po_name 分別對應(yīng)持久層對象PO 的唯一的標識和名稱;mo 為持久層關(guān)聯(lián)的模型層實體對象和實體對象集合;dll_set 為持久層對應(yīng)的操作集合,如添加、刪除、修改、查詢、分頁和排序等操作。
3) 業(yè) 務(wù) 邏 輯 層 對 象 BO=(bo_id,bo_name,mo,bll_set)。其中:bo_id,bo_name 分別對應(yīng)業(yè)務(wù)邏輯層 BO的唯一的標識和名稱;mo 為持久層關(guān)聯(lián)的模型層實體對象和實體對象集合;bll_set 為業(yè)務(wù)邏輯層對應(yīng)的操作集合,如登錄、注冊、審核等業(yè)務(wù)邏輯層的功能。
由于模板文件基于文本易于定制和調(diào)整,結(jié)合成熟的模板語言可使代碼生成過程更具靈活性,故其在中小企業(yè)中應(yīng)用較為廣泛[7]。在自動代碼生成方案中,模板、元數(shù)據(jù)和業(yè)務(wù)規(guī)則三個元素是必要的[8]?;谀0宓拇a生成過程見圖1,圖1a)描述基于模板的自動代碼生成過程,圖1b)說明基于模板的自動代碼生成的各個組成部分。
基于模板的自動代碼生成的過程如下:首先對用戶需求進行分析,進行初步的分析和設(shè)計,在實現(xiàn)階段制定要采用的框架和何種分層結(jié)構(gòu),根據(jù)功能需求,設(shè)計相應(yīng)的模板文件,并根據(jù)設(shè)計模型或元數(shù)據(jù)模型,使用代碼生成引擎去生成程序的源代碼。對生成的基礎(chǔ)源代碼進行代碼調(diào)整和特定代碼的添加,調(diào)試之后將代碼部署到基礎(chǔ)平臺和框架中。
模型驅(qū)動構(gòu)架的出現(xiàn)使得解決傳統(tǒng)軟件的開發(fā)問題并且以工廠化開發(fā)軟件成為可能。模型驅(qū)動構(gòu)架支持基于可視化模型驅(qū)動的軟件設(shè)計、內(nèi)容存儲與交換,是一種基于模型的軟件開發(fā)構(gòu)架[2]。其最終目標是把針對特定計算平臺的編碼工作交由機器完成,從此將業(yè)務(wù)邏輯與實現(xiàn)技術(shù)結(jié)合,很大程度地提升軟件開發(fā)效率和質(zhì)量,降低開發(fā)成本,延長軟件壽命,并實現(xiàn)工廠化開發(fā)軟件。
圖1 基于模板的代碼生成過程Fig.1 Process of code generation based on template
1.2.1 模型層次結(jié)構(gòu)
模型驅(qū)動構(gòu)架中的模型組織分成四層結(jié)構(gòu)[2],依次為 M0,M1,M2,M3。M3 是元-元模型,元對象機制(Meta Object Facility,MOF)位于該層。MOF 提供定義 M2層元模型所需要的更抽象一級的建模支持。MOF 是M2層所有元模型的元模型,同時它也是自描述的,即MOF可以描述MOF 元模型本身。在MDA 框架中,M3 層只有MOF 這一個模型,它是MDA 中基礎(chǔ)和核心的標準,為MDA 框架中的所有模型/元模型提供統(tǒng)一的語言基礎(chǔ),為模型語言(元模型)定義提供公共標準。M2 層為元模型,代表建議MOF 之上的各種模型語言,提供對應(yīng)不同領(lǐng)域的領(lǐng)域建模語言,為M1 層的建模提供建模符號。M1 層為模型層,是建模人員通常面對的模型,即采用模型語言為企業(yè)應(yīng)用建立的模型描述。MDA 的CIM,PIM和PSM 模型都位于該層,M0 層為實例層,是M1 層模型的實例化,對應(yīng)模型的具體應(yīng)用程序,是模型描述的最終目標。MDA 四層元模型體系結(jié)構(gòu)如圖2所示。
1.2.2 MDA 應(yīng)用模型
MDA 應(yīng)用模型包括計算無關(guān)模型(Computation Independent Model,CIM),平臺無關(guān)模型(Platform Independent Model,PIM)和平臺特定模型(Platform Specific Model,PSM)。它們與實例模型中的實現(xiàn)特定模型(Implementation Specific Model,ISM)關(guān)系如圖3所示。
圖2 MDA 四層元模型體系Fig.2 Architecture of meta-model of MDA four tier
圖3 應(yīng)用模型之間的轉(zhuǎn)換Fig.3 Transformation relation among applied models
CIM 計算無關(guān)模型用于描述系統(tǒng)需求、功能、行為和運行環(huán)境,也稱為業(yè)務(wù)模型。PIM 平臺無關(guān)模型是抽出的業(yè)務(wù)邏輯,不包括與實現(xiàn)平臺的技術(shù)相關(guān)的特定信息。PSM 平臺特定模型,從相應(yīng)的PIM 轉(zhuǎn)換而來。 ISM 實現(xiàn)特定模型是PSM 的實例化,包括PSM 用于構(gòu)建一個系統(tǒng)并使之運行的所有信息,如程序代碼、裝載規(guī)格、部署說明以及配置規(guī)范等,是一個可以實際運行的軟件系統(tǒng)[2]。
1.2.3 基于模型驅(qū)動的自動代碼生成過程
基于模型驅(qū)動的自動代碼生成的過程如下:首先根據(jù)用戶的需求編寫PIM,再根據(jù)PIM 和目標平臺編寫轉(zhuǎn)換規(guī)則,MDA 代碼生成引擎根據(jù)轉(zhuǎn)換規(guī)則自動將PIM轉(zhuǎn)化成PSM,最后將PSM 轉(zhuǎn)換成代碼[9]。MDA 通過兩次模型轉(zhuǎn)換和代碼生成技術(shù)提高軟件開發(fā)的效率,并使得系統(tǒng)具有較好的可一致性和可復用性。基于模型驅(qū)動的代碼生成過程見圖4。圖4a)是模型驅(qū)動工程(Model Driven Engineering,MDE)的總體說明,圖4b)是源模型到目標模型的模型轉(zhuǎn)換過程,圖4c)描述基于模型驅(qū)動的自動代碼生成過程。
基于模板的自動代碼生成具有較高的靈活性,定制和開發(fā)較為容易,可提高軟件開發(fā)的可復用度;但也有其缺點,模板化的程序可讀性差,生成的代碼依賴于某種語言和框架,移植性差。在其他類似項目中使用,如果不同框架或語言,需要重新構(gòu)建自動代碼生成引擎。
圖4 基于模型驅(qū)動的代碼生成過程Fig.4 Process of code generation driven by model
MDA 相比于傳統(tǒng)的軟件開發(fā)方式和基于模板的自動代碼生成方式,具有開發(fā)效率高、可維護性、可擴展性強的特點,系統(tǒng)具有良好的可移植性[10]。MDA 也存在一些缺點:雖然MDA 的目標遠大,但實現(xiàn)MDA 的技術(shù)模糊,基礎(chǔ)規(guī)范MOF 和UML 都存在著語義不精確、語言不可執(zhí)行的問題;PIM 到PSM 的轉(zhuǎn)換同樣也存在不精確的問題。
基于模板的自動代碼生成和基于模型的自動代碼生成兩者各有其優(yōu)點和缺點,前者更注重于時效性,后者更注重于通用性,兩者之間有一道鴻溝?;谀0宓拇a生成可以認為更關(guān)注類似PSM 到代碼的生成,基于模型的自動代碼生成更關(guān)注于模型的轉(zhuǎn)換和平臺無關(guān)模型到平臺相關(guān)模型之間的轉(zhuǎn)化。因此,可以在兩者之間架起一座橋梁,融合現(xiàn)有的基于模板的技術(shù)和基于模型的代碼生成基礎(chǔ)。因此產(chǎn)生本文提出的基于模型驅(qū)動和模板的混合自動代碼生成方法。
前面對兩種自動代碼生成的優(yōu)缺點進行分析,綜合基于模型和模板的自動代碼生成的方式,本文提出一種基于模板和模型的混合自動代碼生成方案。該方法可以根據(jù)現(xiàn)有的設(shè)計模型或者遺產(chǎn)系統(tǒng),生成不同框架和語言下的軟件系統(tǒng)代碼。該方案從不同的設(shè)計模型開始,如統(tǒng)一建模語言(Unified Modeling Language,UML)、概念數(shù)據(jù)模型(Concept Data Model,CDM)和 XML 等設(shè)計模型,將這些設(shè)計模型轉(zhuǎn)化成統(tǒng)一的平臺無關(guān)的設(shè)計模型,通過模型轉(zhuǎn)換變成平臺相關(guān)模型。結(jié)合通過模板編輯器生成的基礎(chǔ)模板、界面模板和擴展模板,通過代碼和引擎生成選定目標語言下的源代碼,最終將生成的源碼部署到不同容器和系統(tǒng)基礎(chǔ)框架中。在模板編輯器中的界面生成器,可以根據(jù)用戶要求,快速可視化地生成視圖層代碼,云代碼倉庫存儲大量的子模板和工具??捎眯詼y試用來評估反饋生成代碼的優(yōu)劣,對自動代碼生成引擎進行評估,以期發(fā)現(xiàn)代碼生成引擎的缺陷。在框圖中的底端是底層的技術(shù)框架支持,HACG 的代碼生成方案適合于不同的底層框架,如工作流、Web服務(wù)、面向服務(wù)構(gòu)架(Service Oriented Architecture,SOA)等技術(shù)框架??傮w框圖如圖5所示。
圖5 基于模型和模板融合的自動代碼生成方法Fig.5 Method of automatic code generation based on fusion of model and template
根據(jù)混合自動代碼生成的基本思想,下面給出一種混合自動代碼設(shè)計和實現(xiàn)過程,最后給出采用該方案的自動代碼生成器實現(xiàn)的原型系統(tǒng)。該原型系統(tǒng)的主要功能如下:
1)代碼生成。代碼生成是整個軟件的核心,負責將元數(shù)據(jù)與模板文件結(jié)合進行代碼生成,主要包含代碼生成、模型保存等功能。
2)元數(shù)據(jù)管理。文件模板主要包含對MetaModel、UML 文件、CDM 文件或者其他格式的數(shù)據(jù)的解析和存儲功能。
3)逆向生成。主要功能是將數(shù)據(jù)庫中的表信息映射為元數(shù)據(jù)信息,然后進行代碼生成,包含兩個功能:建立連接以及逆向生成。
4)代碼彈性部署。此功能為將生成的代碼部署到容器和基礎(chǔ)框架中,主要功能有執(zhí)行SQL、部署單表、部署樹形表、部署主表和明細表以及備份原有代碼。
5)模板管理。主要功能是創(chuàng)建或者編輯模板文件。
混合自動代碼生成引擎通過對生成系統(tǒng)中的基本元數(shù)據(jù)進行解析,并結(jié)合特定語言和框架的模板文件,生成框架和平臺相關(guān)的代碼。其中,模板文件是目標代碼的原型,元數(shù)據(jù)的通信和邏輯基本框架都在模板文件中體現(xiàn)。模板文件可通過模板編輯器以及用戶定義規(guī)則來生成平臺相關(guān)模板。系統(tǒng)總體功能結(jié)構(gòu)圖見圖6。
圖6 HACG 功能結(jié)構(gòu)圖Fig.6 Function structure diagram of HACG
HACG 自動代碼生成和配置部署過程包含任務(wù)分析和需求建模、模板建立、元數(shù)據(jù)創(chuàng)建、代碼生成和彈性部署。首先,用戶在進行詳細的任務(wù)分析和需求建模之后,產(chǎn)生平臺無關(guān)的元模型數(shù)據(jù),根據(jù)實際項目需要,將該元數(shù)據(jù)模型轉(zhuǎn)化成平臺相關(guān)的數(shù)據(jù)模型,比如相關(guān)于語言和框架等,然后使用自動代碼生成引擎生成對應(yīng)不同實體關(guān)系模型的基礎(chǔ)源代碼,選擇對生成的源代碼進行部署,可以采用一鍵部署、手工部署和局部部署等方案。如果需要對生成代碼做局部修改,可以進行完善和修改,不過生成代碼已經(jīng)完全可以滿足基礎(chǔ)框架運行的條件。經(jīng)過調(diào)試部署以及配置,即可實施運行。圖7是HACG 自動代碼生成詳細的流程。
代碼生成引擎的工作過程如下:
輸入:靜態(tài)設(shè)計模型半形式化描述;
輸出:系統(tǒng)可部署源碼;
程序:
Begin:
1)初始化代碼生成引擎CodeGenerator、MetaData 讀寫器和模板讀寫器;
2)選擇靜態(tài)設(shè)計視圖半形式化描述模型或遺產(chǎn)系統(tǒng)數(shù)據(jù)庫;使用ModelTransformer 轉(zhuǎn)化成統(tǒng)一標準的平臺無關(guān)語言MetaModel;
3)將生成的MetaModel 轉(zhuǎn)換成平臺相關(guān)模型SpecificModel;
4)根據(jù)選定的語言和框架讀取相應(yīng)的模板;
5)使用自動代碼生成引擎CodeGenerator 對SpecificModel 實體和模板進行代碼生成,生成的文件包含實體層、持久層、業(yè)務(wù)邏輯層和展示層;
6)根據(jù)選定的關(guān)系數(shù)據(jù)庫類型生成相應(yīng)的SQL 文件;
7)將生成的SQL 文件再進行生成,并根據(jù)用戶需求將生成的代碼彈性部署到基礎(chǔ)框架中。
圖7 HACG 代碼生成流程Fig.7 Flow chart of code generation of HACG
將通過代碼生成引擎生成的代碼部署到基礎(chǔ)框架中,這個基礎(chǔ)框架是獨立的、可運行的Web 框架,主要包含必要的基礎(chǔ)功能,如用戶管理、權(quán)限管理、功能管理、數(shù)據(jù)字典等[11]。如圖8所示,配置生成功能所在的上級菜單、名稱、序號和鏈接位置,就可以在后臺系統(tǒng)中通過菜單進行訪問管理。圖8a)是基于JavaFX 胖客戶端CS 結(jié)構(gòu)的HACG 自動代碼生成主界面;圖8b)是基礎(chǔ)功能中的角色權(quán)限管理的功能展示;圖8c)是對生成代碼快速部署之后的配置界面。
本文對兩種主流自動代碼生成技術(shù)進行分析,綜合基于模板和模型驅(qū)動的代碼生成的優(yōu)點,提出一種融合兩種自動代碼生成技術(shù)的通用的針對不同語言和不同框架的自動代碼生成方法——HACG。從實際使用效果來看(軟件著作權(quán):基于模型驅(qū)動的彈性自動代碼生成系統(tǒng)(02646104),登記號:2018SR402480),該方法結(jié)構(gòu)清晰,易于構(gòu)建自動代碼生成引擎,提高了代碼的生成率,減少了代碼出錯率,較大地縮短項目開發(fā)工期。
圖8 HACG 代碼生成器主界面及其基礎(chǔ)功能管理界面、功能部署和配置Fig.8 Main interface of the HACG code generator and its basic function management,function deployment and configuration
本文所提供的原型對有效性和生成系統(tǒng)的可用性測試尚不充分,對于特定需求的以用戶為中心的高可用性的界面生成考慮不足,在后續(xù)的研究中將繼續(xù)加強生成系統(tǒng)的評估反饋。自動代碼生成技術(shù)尚在不斷發(fā)展中,隨著人工智能的發(fā)展和對程序邏輯的機器學習能力加強,將能夠自動生成更加復雜安全的系統(tǒng)代碼。