馬晨溪 李彥平
摘要:在研究了現(xiàn)代信息系統(tǒng)軟件架構(gòu)模式的基礎(chǔ)上,提出了軟件工廠模式的項(xiàng)目軟件快速開發(fā)和構(gòu)建技術(shù)。設(shè)計(jì)了一個(gè)自動(dòng)模型開發(fā)和代碼自動(dòng)生成方法,通過CodeSmith代碼模板可以將數(shù)據(jù)模型轉(zhuǎn)化成為平臺(tái)無關(guān)的可執(zhí)行程序,并在此基礎(chǔ)上研究了基于逆向工程的項(xiàng)目文檔自動(dòng)生成技術(shù)。通過在實(shí)際項(xiàng)目中的驗(yàn)證,使軟件產(chǎn)品的開發(fā)時(shí)間縮短到1/10,設(shè)計(jì)文檔編寫的時(shí)間縮短到1/17,并且代碼質(zhì)量極大提高,應(yīng)用開發(fā)和維護(hù)成本大大降低。
關(guān)鍵詞:MDA;模型驅(qū)動(dòng);軟件架構(gòu);代碼模板;逆向工程;軟件產(chǎn)品線
中圖分類號(hào):TP311文獻(xiàn)標(biāo)志碼:A文章編號(hào):1008-1739(2021)15-61-5
0引言
如何提高軟件項(xiàng)目開發(fā)效率、降低研發(fā)成本、交付高質(zhì)量的、客戶滿意的軟件系統(tǒng)一直是軟件開發(fā)企業(yè)追求的終極目標(biāo)。而實(shí)現(xiàn)這一切的根基是建立在組織的核心資產(chǎn)建設(shè)和一套先進(jìn)的軟件工程方法,其中核心資產(chǎn)包括穩(wěn)定可靠的軟件架構(gòu)、正確的業(yè)務(wù)邏輯和注釋清晰的軟件構(gòu)件集合,可以不依賴于組織人力資源的變化而持續(xù)演進(jìn)和發(fā)展。而一套先進(jìn)的軟件工程方法和自動(dòng)化開發(fā)平臺(tái)是實(shí)現(xiàn)核心資產(chǎn)快速構(gòu)建的前提和保證。
從架構(gòu)、開發(fā)方法和工具3個(gè)方面闡述了大型項(xiàng)目的開發(fā)方法,結(jié)合工具的使用,提出了一套軟件工廠模式的自動(dòng)化開發(fā)平臺(tái)和產(chǎn)品線開發(fā)方法[1],將模型驅(qū)動(dòng)開發(fā)(MDD)自動(dòng)化代碼生成、軟件架構(gòu)、設(shè)計(jì)模式、平臺(tái)+插件、基于模板的開發(fā)、基于逆向工程的文檔自動(dòng)生成等幾個(gè)方面的技術(shù)相結(jié)合,解決大型軟件系統(tǒng)開發(fā)中速度和質(zhì)量二者不可兼得的問題。
1軟件工廠模式軟件產(chǎn)品開發(fā)
采用軟件工廠模式的軟件開發(fā)方法的核心關(guān)鍵是基于MDA的軟件開發(fā)過程[2],采用模型驅(qū)動(dòng)開發(fā)(MDD)快速構(gòu)建系統(tǒng)[3],主要特點(diǎn)是在軟件開發(fā)生命周期的需求階段建立模型,并在模型的基礎(chǔ)上快速導(dǎo)出目標(biāo)系統(tǒng)。
軟件工廠模式軟件產(chǎn)品開發(fā)分為業(yè)務(wù)對(duì)象模型開發(fā)、自動(dòng)化代碼生成和自動(dòng)化文檔生成3個(gè)階段,整個(gè)過程如圖1所示。
第1步是業(yè)務(wù)對(duì)象模型開發(fā)(AMD)。該階段,首先采用面向?qū)ο蠓治龊驮O(shè)計(jì)方法,對(duì)用戶需求進(jìn)行建模,建立領(lǐng)域的概念模型[6]和業(yè)務(wù)對(duì)象模型[4],分析出系統(tǒng)的界面類、控制類和實(shí)體類,然后對(duì)實(shí)體類進(jìn)行建模抽象出系統(tǒng)的實(shí)體對(duì)象模型,并進(jìn)行數(shù)據(jù)建模,建立系統(tǒng)的數(shù)據(jù)庫物理模型。
第2步是自動(dòng)代碼生成(ASCG)階段。根據(jù)系統(tǒng)的架構(gòu)約束要求選擇合適的架構(gòu)實(shí)現(xiàn)模板、目標(biāo)系統(tǒng)的編程語言和數(shù)據(jù)庫實(shí)體,采用CodeSmith工具編寫架構(gòu)各層(數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層和界面層)的代碼模板文件以及代碼引擎模板。然后運(yùn)行代碼引擎自動(dòng)生成架構(gòu)各層的軟件代碼和為便于集成開發(fā)環(huán)境(IDE)開發(fā)的解決方案文件(如sln等),對(duì)代碼業(yè)務(wù)邏輯進(jìn)行簡單的定制和修改,通過IDE進(jìn)行編譯自動(dòng)生成可執(zhí)行軟件。
第3步是用自動(dòng)文檔生成(ADG)階段。生成符合組織文檔規(guī)范要求的數(shù)據(jù)庫設(shè)計(jì)、概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)文檔。通過代碼逆向分析工具抽取類的屬性、方法以及類之間的關(guān)系自動(dòng)生成符合組織文檔規(guī)范要求的數(shù)據(jù)庫設(shè)計(jì)、概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)說明等文檔[5]。
2自動(dòng)模型開發(fā)
AMD是一種自動(dòng)化的實(shí)體對(duì)象生成方法,能夠根據(jù)數(shù)據(jù)庫模型自動(dòng)生成代碼,根據(jù)數(shù)據(jù)庫表一對(duì)一、一對(duì)多、多對(duì)一關(guān)系生成實(shí)體類,支持多平臺(tái)語言,方便上層應(yīng)用使用[2]。
自動(dòng)模型開發(fā)的原理是讀取數(shù)據(jù)庫元數(shù)據(jù),按照指定的經(jīng)過測試的成熟代碼模板文件、領(lǐng)域規(guī)則和軟件架構(gòu)約束,混合產(chǎn)生源代碼。典型的代碼生成器模型如圖2所示,為了能夠自動(dòng)生成程序代碼,必需的4個(gè)關(guān)鍵要素是設(shè)計(jì)模式(所產(chǎn)生代碼的模板文件)、領(lǐng)域元數(shù)據(jù)、領(lǐng)域規(guī)則和軟件架構(gòu)約束。
3自動(dòng)代碼生成
軟件架構(gòu)是軟件系統(tǒng)的頂層設(shè)計(jì)[3],基于最常用的分層架構(gòu)模式和軟件系統(tǒng)的使用場景,采用CodeSmith工具設(shè)計(jì)編寫了軟件架構(gòu)各層(界面層、業(yè)務(wù)處理層、數(shù)據(jù)訪問層和領(lǐng)域模型層)模板及代碼引擎模板,以支持代碼的自動(dòng)生成[6]。如表1所示。在領(lǐng)域模型層定義了主要包括業(yè)務(wù)對(duì)象和屬性相應(yīng)的getter和getter方法;在數(shù)據(jù)訪問層模板中,通過接口定義了不同的接口方法,包括數(shù)據(jù)庫CRUD操作;在業(yè)務(wù)邏輯層的模板中,定義了初始化、表單驗(yàn)證、CRUD常用業(yè)務(wù)邏輯;在界面層模板中,定義了面向最終用戶的頁面流邏輯;代碼生成引擎,定義了集成多類模板和批量執(zhí)行的功能,并能夠根據(jù)項(xiàng)目需要生成目標(biāo)平臺(tái)的工程項(xiàng)目文件,便于使用IDE打開項(xiàng)目文件并進(jìn)行編譯和調(diào)試。
每個(gè)層次的模板都具有各自獨(dú)立的功能,通過代碼生成引擎串聯(lián)起來形成完整的系統(tǒng),如圖3所示。
(1)數(shù)據(jù)訪問層模板
數(shù)據(jù)訪問層主要包括用于與數(shù)據(jù)庫關(guān)聯(lián)映射的實(shí)體對(duì)象以及數(shù)據(jù)訪問層(Dao)接口層和接口實(shí)現(xiàn)(DaoImpl)3個(gè)模板文件。業(yè)務(wù)數(shù)據(jù)庫中的每張數(shù)據(jù)表都會(huì)對(duì)應(yīng)生成一個(gè)Model對(duì)象,每個(gè)Model對(duì)象定義了get/set方法,Dao定義操作數(shù)據(jù)庫的基本功能(如增刪改查),接口實(shí)現(xiàn)DaoImpl層實(shí)現(xiàn)Dao層定義接口的具體實(shí)現(xiàn),為業(yè)務(wù)層提供調(diào)用接口,適應(yīng)不同的數(shù)據(jù)庫類型,如Oracle、sqlserver、國產(chǎn)數(shù)據(jù)庫和Nosql數(shù)據(jù)庫等。
(2)業(yè)務(wù)邏輯層模板:調(diào)用DaoImpl層接口,向界面層提供調(diào)用接口服務(wù)。
BLL.cst:生成業(yè)務(wù)邏輯層代碼的模板文件主要的方法包括:
CheckValid:對(duì)界面輸入進(jìn)行數(shù)據(jù)有效性、合法性檢查,包括非空、類型和長度等;
Delete:根據(jù)主鍵從數(shù)據(jù)庫中刪除相關(guān)記錄,并返回受影響的行數(shù);
GetAllList:從數(shù)據(jù)庫中讀取并返回所有數(shù)據(jù)對(duì)象列表;
GetDataById:根據(jù)數(shù)據(jù)對(duì)象的主鍵從數(shù)據(jù)庫中獲取數(shù)據(jù)對(duì)象的實(shí)例;
GetPageList:從數(shù)據(jù)庫中分頁讀取數(shù)據(jù)僅用于在數(shù)據(jù)控件中顯示;
Insert:將數(shù)據(jù)對(duì)象新增到數(shù)據(jù)庫中,并返回受影響的行數(shù);
IsExist:檢測是否存在該主鍵的數(shù)據(jù);
Update:根據(jù)主鍵將業(yè)務(wù)對(duì)象數(shù)據(jù)更新到數(shù)據(jù)庫中。
(3)用戶界面層生成模板
支持桌面應(yīng)用和Web應(yīng)用2類,以滿足C/S和B/S兩種不同的架構(gòu)模式。根據(jù)數(shù)據(jù)庫描述文件的備注文件生成界面標(biāo)簽(label)項(xiàng),根據(jù)數(shù)據(jù)庫字段的類型生成表單元素,包括文本框、組合框、按鈕及圖片等,生成表單的提交按鈕、取消按鈕以及響應(yīng)事件,包括表單初始化、數(shù)據(jù)填充、表單驗(yàn)證及取消等。主要的模板文件示例如圖4所示。
(4)配置文件生成模板
系統(tǒng)運(yùn)行必須配置文件,如數(shù)據(jù)庫連接等,也在代碼引擎運(yùn)行時(shí)根據(jù)生成配置自動(dòng)修改,如數(shù)據(jù)庫類型、數(shù)據(jù)庫名稱、鏈接用戶名、密碼等。
(5)解決方案生成模板
根據(jù)目標(biāo)語言的類型和軟件開發(fā)的IDE環(huán)境,生成項(xiàng)目解決方案。支持VisualStudio2010以上版本、Eclipse3.5以上版本,支持exe、dll、jar等類型的組件和運(yùn)行程序,打開解決方案文件,相關(guān)生成的領(lǐng)域模型層、數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層和界面層類文件能夠自動(dòng)加載。編譯執(zhí)行就可以生成可執(zhí)行軟件。包括的模板文件有:
WebConfig.cst:生成WebConfig的模板文件;
csproj.cst:生成csproj.cs文件的模板文件;
Default.asp..cst:生成defalut.asp文件的模板文件;
sln.cst生成sln文件的模板文件;
vs2010.cst:生成2010工程解決方案的主文件,被BuildAll.cst調(diào)用。
(6)代碼生成引擎
支持根據(jù)項(xiàng)目需求,批量選擇多個(gè)數(shù)據(jù)庫表,完成領(lǐng)域模型層、數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層和界面層代碼的批量生成,生成工程文件的模板文件。啟動(dòng)界面如圖5所示。
開發(fā)人員根據(jù)需要設(shè)置作者名稱、組織名稱、系統(tǒng)中英文名稱、命名空間、代碼輸出路徑以及軟件架構(gòu)數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層、客戶端C/S軟件或Web網(wǎng)站界面,選擇待生成的多個(gè)數(shù)據(jù)庫實(shí)體,點(diǎn)擊“generate“,根據(jù)用戶的選項(xiàng)將自動(dòng)生成軟件代碼和項(xiàng)目解決方案文件。主界面如圖6所示。
生成后的文檔的代碼結(jié)構(gòu)如圖7所示。
(7)與傳統(tǒng)的人工代碼編寫方法的對(duì)比
通過對(duì)一個(gè)由4個(gè)軟件組成的中等規(guī)模軟件系統(tǒng)來測算,新開發(fā)代碼行數(shù)95 387,按照平均每人每天開發(fā)代碼行數(shù)100計(jì)算,需要953/22/8≈8個(gè)人5個(gè)月的工時(shí),使用自動(dòng)代碼生成方法,軟件代碼在分鐘級(jí)生成,60%以上的業(yè)務(wù)邏輯實(shí)現(xiàn)基本生成,只需要在需要定制的部分做出修改,加上調(diào)試和測試的時(shí)間,總的研制時(shí)間不會(huì)超過1個(gè)月。軟件開發(fā)的時(shí)間降低到1/10。這樣的結(jié)果是建立在有可靠穩(wěn)定的代碼模板和成熟的關(guān)鍵算法組件的基礎(chǔ)之上。通過軟件代碼模板的編寫達(dá)到“一次編寫,永久使用”的目的,極大地降低了人力成本,提高了軟件測試用例的通過率。
4自動(dòng)文檔生成
在軟件項(xiàng)目研制中,除了軟件代碼之外,工作量最大、最耗時(shí)的是數(shù)據(jù)庫設(shè)計(jì)說明文檔和軟件設(shè)計(jì)說明文檔的編寫工作,對(duì)于大型軟件項(xiàng)目常常需要耗費(fèi)1~2個(gè)月的編寫時(shí)間。針對(duì)這2類文檔,研制了DBDcoumentCreater數(shù)據(jù)庫設(shè)計(jì)文檔生成工具和DocBuilder兩類工具。
(1)數(shù)據(jù)庫設(shè)計(jì)說明文檔自動(dòng)生成
為了提高數(shù)據(jù)庫設(shè)計(jì)文檔的編寫效率,研制了DBDcoumentCreater數(shù)據(jù)庫設(shè)計(jì)文檔生成工具,能夠讀取領(lǐng)域元數(shù)據(jù),通過讀取數(shù)據(jù)庫表包含數(shù)據(jù)庫字段名稱、類型、長度、非空項(xiàng)說明和主鍵、外鍵等內(nèi)容生成數(shù)據(jù)庫描述文檔。數(shù)據(jù)庫說明文檔自動(dòng)生成過程如圖8所示。
(2)軟件設(shè)計(jì)說明文檔自動(dòng)生成
軟件設(shè)計(jì)文檔包括概要設(shè)計(jì)部分和詳細(xì)設(shè)計(jì)兩部分,主要使用了DocBuilder和Doxgen兩個(gè)工具,通過逆向分析對(duì)軟件代碼的類和類間關(guān)系進(jìn)行抽取,然后按照文檔模板的特定格式要求,對(duì)章節(jié)內(nèi)容進(jìn)行填充。設(shè)計(jì)說明文檔自動(dòng)生成過程如圖9所示。
①軟件概要設(shè)計(jì)文檔(軟件架構(gòu)設(shè)計(jì)):主要包括邏輯視圖、部署視圖、開發(fā)視圖、進(jìn)程視圖和用例視圖。在邏輯視圖中類包的組成通常由表格組成,詳細(xì)描述類及其說明文件。文檔模板根據(jù)逆向生成的類及其注釋自動(dòng)生成表格及其說明文件。
②軟件詳細(xì)設(shè)計(jì)文檔:主要是對(duì)類包內(nèi)每個(gè)類的屬性、操作、操作內(nèi)部算法的描述以及類關(guān)系的描述,通過代碼逆向工程方法獲取上述內(nèi)容,根據(jù)文檔模板,按照模板格式依次批量生成類的詳細(xì)設(shè)計(jì)內(nèi)容,尤其對(duì)于大型項(xiàng)目來講,將會(huì)帶來效率的極大提升。
(3)與傳統(tǒng)文檔編寫方法的對(duì)比
通過對(duì)一個(gè)由4個(gè)軟件組成的中等規(guī)模軟件系統(tǒng)來測算,數(shù)據(jù)庫設(shè)計(jì)文檔和軟件設(shè)計(jì)文檔的總頁數(shù)在998頁,大量時(shí)間耗費(fèi)在類詳細(xì)設(shè)計(jì)部分,按照一周可以編寫160頁文檔計(jì)算,耗費(fèi)的人時(shí)在170人時(shí),在采用自動(dòng)化文檔生成方法之后,假設(shè)一篇設(shè)計(jì)文檔需要2 h進(jìn)行文檔格式標(biāo)準(zhǔn)化,4個(gè)軟件的總設(shè)計(jì)時(shí)長不超過10 h。將文檔編寫的時(shí)間降低到1/17,而且設(shè)計(jì)文檔和軟件代碼高度一致,避免了人為編寫造成的設(shè)計(jì)文檔與代碼不一致的情況。
5結(jié)束語
詳細(xì)介紹了基于模板的MDD、ASDG、ADG軟件產(chǎn)品開發(fā)的具體實(shí)現(xiàn)過程,通過本方法,可以實(shí)現(xiàn)模板一次編寫,多樣化產(chǎn)品生成的軟件工廠軟件產(chǎn)品開發(fā)模式,使軟件系統(tǒng)的構(gòu)建可以像工業(yè)系統(tǒng)生產(chǎn)流水線一樣,通過用戶簡單的定制,選擇不同類型的模板、數(shù)據(jù)模型,平臺(tái)就能夠按照用戶的需求自動(dòng)化生產(chǎn),批量生成所見及所得的軟件產(chǎn)品。產(chǎn)生的代碼非常健壯,是高品質(zhì)、高一致性、高效率的統(tǒng)一體;產(chǎn)生的文檔與設(shè)計(jì)一致,是風(fēng)格一致、邏輯清晰、可讀性強(qiáng)、整潔規(guī)范的統(tǒng)一體;產(chǎn)生的測試用例可重用、可復(fù)用、可執(zhí)行,是一致性、覆蓋率高、可執(zhí)行性高、執(zhí)行準(zhǔn)確、持續(xù)更新、復(fù)用性高的統(tǒng)一體。
參考文獻(xiàn)
[1]普爾.軟件產(chǎn)品線工程[M].張佳驥,李彥平,譯.北京:國防工業(yè)出版社,2010.
[2]袁曉桂,吳掬鷗.基于MDA的軟件開發(fā)方法的研究.現(xiàn)代電子技術(shù),2017,40(14):52-54.
[3]岳輝,王全宇.基于MDD的住宅報(bào)警系統(tǒng)開發(fā)模型分析[J].蘭州交通大學(xué)學(xué)報(bào),2013,32(4):31-34.
[4]埃文斯.領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):軟件核心復(fù)雜性應(yīng)對(duì)之道[M].趙俐,盛海艷,劉霞,譯.北京:人民郵電出版社.
[5]葉彭飛,彭鑫,趙文耘.通過靜態(tài)分析逆向恢復(fù)面向?qū)ο蟪绦蛑械挠脹r[J].計(jì)算機(jī)研究與發(fā)展,2010,47(12):2192-2200.
[6]朱曉輝,王杰華,石振國,等. NET下基于PowerDesigner和CodeSmith的軟件自動(dòng)化開發(fā)技術(shù)[J].計(jì)算機(jī)科學(xué),2010,37(7):156-159.