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