專利名稱:基于類圖和活動(dòng)圖相結(jié)合生成c++代碼的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種軟件代碼自動(dòng)生成領(lǐng)域,具體涉及一種基于類圖和活動(dòng)圖結(jié)合生成C++代碼的方法。
背景技術(shù):
當(dāng)今隨著電子計(jì)算機(jī)技術(shù)的快速進(jìn)步,互連網(wǎng)絡(luò)Internet與計(jì)算機(jī)相連接,使今天的信息社會(huì)進(jìn)入了以計(jì)算機(jī)為核心的時(shí)代。在信息社會(huì)中,信息的處理、獲取、決策和交流都需要許多高性能的軟件架構(gòu),因而就促使人們對(duì)計(jì)算機(jī)軟件的功能、質(zhì)量、品種、數(shù)量、開發(fā)和成本時(shí)間等提出越來越高的需求,而人們對(duì)各種軟件開發(fā)方法也進(jìn)行著深入的學(xué)習(xí)。但不幸的是,若要使計(jì)算機(jī)的軟件功能變得越全面、使用越便捷,必然將使開發(fā)出的軟件越巨大、越復(fù)雜,這樣極大地挫傷了人們的積極性,以致開發(fā)軟件的成本翻倍增長、開發(fā)周期不斷向后拖延,最終難以保證軟件質(zhì)量。而在這些問題中,項(xiàng)目嚴(yán)重超期無疑是軟件開發(fā)中的致命打擊,一些調(diào)查表明,70%的項(xiàng)目超出了估算的時(shí)間,大型項(xiàng)目平均超出計(jì)劃交付時(shí)間的20%到50%,項(xiàng)目越大,超出計(jì)劃的時(shí)間越長,很多學(xué)者認(rèn)為軟件開發(fā)的問題主要在于開發(fā)的速率。那怎么才能在保證軟件質(zhì)量的同時(shí)又縮短開發(fā)周期呢?使用MDA開發(fā)軟件時(shí),代碼生成可以很好的消除之前提出的問題。代碼生成主要是區(qū)別于傳統(tǒng)的由程序員手工進(jìn)行的編程,它可以從一些文件、模型、數(shù)據(jù)信息直接轉(zhuǎn)化為可運(yùn)行的代碼。代碼生成器的工作原理如下:首先輸入一個(gè)抽象業(yè)務(wù)模型(例如UML模型),然后通過映射規(guī)則確定的模板生成基于該模型的代碼文件?,F(xiàn)階段,代碼生成方法有很多,主要包括以下四種方法:基于對(duì)象關(guān)系的、基于契約的、基于模型的、基于模板的。其中:1、基于對(duì)象關(guān)系的代碼生成該類技術(shù)主要是基于面向?qū)ο蠛完P(guān)系數(shù)據(jù)庫技術(shù)的結(jié)合體。已經(jīng)被許多大型的廠商所支持,例如!Microsoft的.Net框架、IBM的Websphere服務(wù)框架、Java的眾多開源框架(Hibernate、Ejb、Spring等)。這種技術(shù)往往使用比較方便,因?yàn)檐浖w系已經(jīng)在內(nèi)部封裝了許多功能,對(duì)外向用戶只是提供了少量的接口,編程人員容易掌握。其中,Hibernate是對(duì) JDBC (Java Database Connectivity)數(shù)據(jù)庫技術(shù)進(jìn)行了輕量級(jí)的對(duì)象封裝,從而能使開發(fā)人員能夠更加方便地編寫操作各種類型數(shù)據(jù)庫的代碼;Spring是一個(gè)輕量級(jí)的業(yè)務(wù)邏輯開發(fā)框架,只需少量編程就可以完成Ejb的許多功能,該框架的關(guān)鍵之處就是可以自動(dòng)生成業(yè)務(wù)邏輯代碼;還有一種企業(yè)應(yīng)用軟件ESA(EnterpriseSoftware and Applications)由于必須具備快速重構(gòu)的能力,往往利用日志(Log)來記錄對(duì)象間關(guān)聯(lián)關(guān)系與業(yè)務(wù)對(duì)象,從而在業(yè)務(wù)對(duì)象模型發(fā)生變化后,可以迅速的比對(duì)之前的對(duì)象模型并快速地自動(dòng)生成代碼。該技術(shù)優(yōu)點(diǎn)在于技術(shù)比較成熟,掌握以后比較容易使用。缺點(diǎn)在于生成代碼的性
能略差一些。
2、基于契約的代碼生成面向方面編程(Aspect-Oriented Programming, A0P)是一種新興的編程方法,其立足點(diǎn)在于關(guān)注點(diǎn)的分離。在AOP的概念中,軟件系統(tǒng)由多個(gè)關(guān)注點(diǎn)組成,其中一部分關(guān)注點(diǎn)與系統(tǒng)的業(yè)務(wù)邏輯相關(guān),被稱為“主關(guān)注點(diǎn)”,而其他的關(guān)注點(diǎn)則普遍存在于系統(tǒng)各個(gè)組件中,稱為“橫切關(guān)注點(diǎn)”。AspectJ是對(duì)Java語言的一種擴(kuò)展,它在語言層面實(shí)現(xiàn)了 AOP語言規(guī)范。契約式設(shè)計(jì)(Design by Contract, DbC)現(xiàn)在已成為廣泛使用的用于提高系統(tǒng)可靠性的方法。該技術(shù)優(yōu)點(diǎn)在于生成的代碼與語言比較吻合,可直接用于二次開發(fā)。缺點(diǎn)在于只能生成接口,不生成可運(yùn)行代碼。3、基于模型的代碼生成該技術(shù)往往把將要實(shí)現(xiàn)的軟件系統(tǒng)抽象為模型,然后通過模型到代碼的映射規(guī)則來自動(dòng)生成代碼。其中,建立模型屬于軟件開發(fā)的設(shè)計(jì)階段,代碼生成屬于編碼階段,從而完成設(shè)計(jì)與實(shí)現(xiàn)一體化的無縫集成。該類技術(shù)最為知名的是MDA技術(shù)。此外,模型還可以是流程圖,該方法首先對(duì)流程圖中所包含的關(guān)系和含義進(jìn)行解析,將它們分解為判斷嵌套關(guān)系、順序執(zhí)行關(guān)系、跳轉(zhuǎn)關(guān)系和循環(huán)關(guān)系,然后根據(jù)對(duì)應(yīng)的關(guān)系進(jìn)行代碼自動(dòng)生成;基于模型用戶界面的代碼生成用模型來定義界面中的所有元素,這種開發(fā)方式的好處是:以用戶為中心縮短了開發(fā)周期,集中了用戶界面的規(guī)范使各種生成代碼可以兼容,可以實(shí)現(xiàn)界面模型和代碼的交互編程,并且,用戶界面的設(shè)計(jì)和代碼可以重復(fù)利用。該技術(shù)優(yōu)點(diǎn)在于模型簡單直觀,易于對(duì)軟件系統(tǒng)進(jìn)行刻畫;系統(tǒng)設(shè)計(jì)與模型視圖的開發(fā)同步,項(xiàng)目集成度較高。缺點(diǎn)在于設(shè)計(jì)出模型之后多了一層編譯過程,代碼運(yùn)行效率較低。4、基于模板的代碼生成模板技術(shù)類似編程語言中的泛型編程,C++的STL(Standard Template Library)庫就相當(dāng)于一些模板,把一些經(jīng)常使用的、可變的代碼編制成為文檔代碼,待需要時(shí),根據(jù)極少的參數(shù)變量,生成通用的可執(zhí)行的代碼。在模板技術(shù)中,往往將不變的部分稱之為模板(Template),將可變的部分稱之為模型(Model),讓二者合并的部分是模板引擎,模板引擎的輸入是模型和模板,輸出即是自動(dòng)生成的代碼。XSLT將模型轉(zhuǎn)換為代碼,它分離了模型與轉(zhuǎn)換規(guī)則,這樣二者可以單獨(dú)改變而不影響對(duì)方。XSLT可以將XML文檔轉(zhuǎn)換成為其它XML文檔、HTML文檔或者其它編程語言。Velocity是當(dāng)今比較流行的基于模板代碼生成的利器,它允許用戶自定義一套模板,然后根據(jù)用戶提供的生成信息數(shù)據(jù),就可以快速地生成用戶所需要的任何類型的源代碼。該技術(shù)優(yōu)點(diǎn)在于生成代碼風(fēng)格統(tǒng)一,易于復(fù)用;代碼運(yùn)行效率取決于模板的編寫,好的模板可極大提高代碼運(yùn)行效率。缺點(diǎn)在于模板引擎的輸入信息較難獲取。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服上述已有技術(shù)的不足,并結(jié)合已有技術(shù)的優(yōu)點(diǎn),提供一種有效的代碼自動(dòng)生成技術(shù),以解決現(xiàn)階段軟件開發(fā)效率低下的問題。從現(xiàn)有技術(shù)的優(yōu)缺點(diǎn)可以看出,基于模型的與基于模板的代碼生成技術(shù)的優(yōu)缺點(diǎn)在很多方面是互補(bǔ)的。例如:基于模型的技術(shù)獲取軟件系統(tǒng)的信息比較簡單,而基于模板的技術(shù)往往難以獲取有效的信息;基于模板的技術(shù)可以在代碼生成之前對(duì)模板進(jìn)行反復(fù)推敲設(shè)計(jì),使生成代碼運(yùn)行效率極高,這正好可以彌補(bǔ)基于模型技術(shù)的代碼運(yùn)行效率較低的缺點(diǎn)。因此,本發(fā)明的代碼生成技術(shù)將結(jié)合二者的優(yōu)點(diǎn),以基于模板的技術(shù)為框架,模板引擎的輸入信息選擇基于模型技術(shù)中的類圖和活動(dòng)圖,這樣就形成了基于類圖和活動(dòng)圖的模板代碼生成技術(shù)。為了實(shí)現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案如下:一種基于類圖和活動(dòng)圖相結(jié)合生成C++代碼的方法,包括用于輸出自動(dòng)生成代碼的模板引擎,所述方法包括以下步驟:將用例圖轉(zhuǎn)換為類圖和活動(dòng)圖,所述用例圖描述了一組參與者、用例以及前兩者之間的鏈接關(guān)系,根據(jù)所述用例圖中的對(duì)該用例的描述、前置條件、后置條件、控制流等信息,生成所述類圖和所述活動(dòng)圖,其中,一個(gè)用例圖可以生成多個(gè)類圖和活動(dòng)圖,且所述類圖和所述活動(dòng)圖是一一對(duì)應(yīng)的所述類圖是對(duì)該用例的靜態(tài)信息的描述,所述活動(dòng)圖是對(duì)該用例的動(dòng)態(tài)信息的描述;(2)制定類圖和活動(dòng)圖到C++代碼的映射規(guī)則,所述映射規(guī)則包括將所述活動(dòng)圖中的活動(dòng)對(duì)應(yīng)生成類,活動(dòng)變遷相關(guān)的事件和函數(shù)對(duì)應(yīng)生成類的方法;為所述活動(dòng)圖生成一個(gè)RootContext類,其中,該類是外界調(diào)用所述活動(dòng)圖中事件函數(shù)的惟一接口 ;設(shè)置一個(gè)AbsRootContext抽象類,其中,該抽象類作為所述RootContext類訪問所述活動(dòng)圖中具體活動(dòng)的接口;(3 )通過模板弓丨擎生成模板代碼,將所述類圖與所述活動(dòng)圖結(jié)合,在所述模板弓I擎的輸入信息選擇基于素?cái)?shù)的類型和活動(dòng)圖,然后通過所述模板引擎生成模板代碼。需要說明的是,所述活動(dòng)圖中的每一個(gè)活動(dòng)均繼承于AbsRootContext類,在活動(dòng)類中完成與該活動(dòng)相關(guān)的變遷函數(shù)的實(shí)現(xiàn)。作為一種優(yōu)選的方案,所述活動(dòng)圖刻畫類圖信息時(shí),將所述活動(dòng)圖中活動(dòng)之間的變遷函數(shù)選擇為所述類圖中的方法。利用上述方法所生成C++的代碼結(jié)構(gòu),所述活動(dòng)圖生成的代碼放在一個(gè)文件夾下面,向外部設(shè)有RootContext類作為訪問的接口,所述類圖生成的代碼中設(shè)有一個(gè)所述類圖對(duì)應(yīng)的活動(dòng)圖生成代碼中RootContext類的對(duì)象context。作為一種優(yōu)選的方案,所述訪問接口數(shù)量為I個(gè)。需要說明的是,對(duì)類圖中每一個(gè)方法進(jìn)行判定:如果該方法作為了活動(dòng)圖中變遷事件函數(shù),則在類圖中該方法函數(shù)體中就調(diào)用context對(duì)象對(duì)應(yīng)的該方法,否則就不調(diào)用。需要進(jìn)一步說明的是,C++語言是面向?qū)ο蟮恼Z言,因此,它支持類圖中的語義概念,比如:類、繼承、實(shí)現(xiàn)、接口等,但是活動(dòng)圖中的許多概念,比如:活動(dòng)、分支、分叉、控制流等,在C++中并沒有體現(xiàn),所以,在本方法中建立了上述一種從活動(dòng)圖到C++代碼的映射規(guī)則。本發(fā)明有益效果在于:同時(shí)具備基于模型的與基于模板的代碼生成技術(shù)的優(yōu)點(diǎn),不但獲取軟件系統(tǒng)的信息比較簡單,而且可以在代碼生成之前對(duì)模板進(jìn)行反復(fù)推敲設(shè)計(jì),使生成代碼運(yùn)行效率極高。
圖1為本發(fā)明代碼生成方法流程圖。圖2為本發(fā)明的類圖和活動(dòng)圖結(jié)合方法圖。
具體實(shí)施例方式下面將結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步的描述。如圖1所示,本發(fā)明為一種基于類圖和活動(dòng)圖相結(jié)合生成C++代碼的方法,包括用于輸出自動(dòng)生成代碼的模板引擎,所述方法包括以下步驟:( I)將用例圖轉(zhuǎn)換為類圖和活動(dòng)圖,所述用例圖描述了 一組參與者、用例以及前兩者之間的鏈接關(guān)系,根據(jù)所述用例圖中的對(duì)該用例的描述、前置條件、后置條件、控制流等信息,生成所述類圖和所述活動(dòng)圖,其中,一個(gè)用例圖可以生成多個(gè)類圖和活動(dòng)圖,且所述類圖和所述活動(dòng)圖是一一對(duì)應(yīng)的所述類圖是對(duì)該用例的靜態(tài)信息的描述,所述活動(dòng)圖是對(duì)該用例的動(dòng)態(tài)信息的描述;(2)類圖和活動(dòng)圖到C++代碼的映射規(guī)則,所述映射規(guī)則包括將所述活動(dòng)圖中的活動(dòng)對(duì)應(yīng)生成類,活動(dòng)變遷相關(guān)的事件和函數(shù)對(duì)應(yīng)生成類的方法;為所述活動(dòng)圖生成一個(gè)RootContext類,其中,該類是外界調(diào)用所述活動(dòng)圖中事件函數(shù)的惟一接口 ;設(shè)置一個(gè)AbsRootContext抽象類,其中,該抽象類作為所述RootContext類訪問所述活動(dòng)圖中具體活動(dòng)的接口 ;所述活動(dòng)圖中的每一個(gè)活動(dòng)均繼承于AbsRootContext類,在活動(dòng)類中完成與該活動(dòng)相關(guān)的變遷函數(shù)的實(shí)現(xiàn)。(3)通過模板引擎生成模板代碼,將所述類圖與所述活動(dòng)圖結(jié)合,在所述模板引擎的輸入信息選擇基于所述的類圖和活動(dòng)圖,然后通過所述模板引擎生成模板代碼。如圖2所示,本發(fā)明中的類圖和活動(dòng)圖的結(jié)合方式是,在用例圖生成類圖和活動(dòng)圖時(shí),類圖和活動(dòng)圖是一一對(duì)應(yīng)的,為了使活動(dòng)圖更好地刻畫類圖的信息,可以將活動(dòng)圖中活動(dòng)之間的變遷函數(shù)選擇為類圖中的方法,因此,類圖的信息就可以通過活動(dòng)圖的動(dòng)態(tài)性更好地表達(dá)。利用上述方法所生成C++的代碼結(jié)構(gòu),所述活動(dòng)圖生成的代碼放在一個(gè)文件夾下面,向外部設(shè)有RootContext類作為訪問的接口,所述類圖生成的代碼中設(shè)有一個(gè)所述類圖對(duì)應(yīng)的活動(dòng)圖生成代碼中RootContext類的對(duì)象context,所述訪問接口數(shù)量為I個(gè)。需要說明的是,對(duì)類圖中每一個(gè)方法進(jìn)行判定:如果該方法作為了活動(dòng)圖中變遷事件函數(shù),則在類圖中該方法函數(shù)體中就調(diào)用context對(duì)象對(duì)應(yīng)的該方法,否則就不調(diào)用。對(duì)于本領(lǐng)域的技術(shù)人員來說,可根據(jù)以上描述的技術(shù)方案以及構(gòu)思,做出其它各種相應(yīng)的改變以及變形,而所有的這些改變以及變形都應(yīng)該屬于本發(fā)明權(quán)利要求的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種基于類圖和活動(dòng)圖相結(jié)合生成C++代碼的方法,包括用于輸出自動(dòng)生成代碼的模板引擎,其特征在于,所述方法包括以下步驟: (1)將用例圖轉(zhuǎn)換為類圖和活動(dòng)圖,所述用例圖描述了一組參與者、用例以及前兩者之間的鏈接關(guān)系,根據(jù)所述用例圖中的對(duì)該用例的描述、前置條件、后置條件、控制流等信息,生成所述類圖和所述活動(dòng)圖,其中,一個(gè)用例圖可以生成多個(gè)類圖和活動(dòng)圖,且所述類圖和所述活動(dòng)圖是一一對(duì)應(yīng)的所述類圖是對(duì)該用例的靜態(tài)信息的描述,所述活動(dòng)圖是對(duì)該用例的動(dòng)態(tài)信息的描述; (2)制定類圖和活動(dòng)圖到C++代碼的映射規(guī)則,所述映射規(guī)則包括將所述活動(dòng)圖中的活動(dòng)對(duì)應(yīng)生成類,活動(dòng)變遷相關(guān)的事件和函數(shù)對(duì)應(yīng)生成類的方法;為所述活動(dòng)圖生成一個(gè)RootContext類,其中,該類是外界調(diào)用所述活動(dòng)圖中事件函數(shù)的惟一接口 ;設(shè)置一個(gè)AbsRootContext抽象類,其中,該抽象類作為所述RootContext類訪問所述活動(dòng)圖中具體活動(dòng)的接口; (3)通過模板引擎生成模板代碼,將所述類圖與所述活動(dòng)圖結(jié)合,在所述模板引擎的輸入信息選擇基于所述的類型和活動(dòng)圖,然后通過所述模板引擎生成模板代碼。
2.根據(jù)權(quán)利要求1所述的生成C++代碼的方法,其特征在于,所述活動(dòng)圖中的每一個(gè)活動(dòng)均繼承于AbsRootContext類,在活動(dòng)類中完成與該活動(dòng)相關(guān)的變遷函數(shù)的實(shí)現(xiàn)。
3.根據(jù)權(quán)利要求1所述的生成C++代碼的方法,其特征在于,所述活動(dòng)圖刻畫類圖信息時(shí),將所述活動(dòng)圖中活動(dòng)之間的變遷函數(shù)選擇為所述類圖中的方法。
4.一種利用權(quán)利要求1生成C++的代碼結(jié)構(gòu),其特征在于,所述活動(dòng)圖生成的代碼放在一個(gè)文件夾下面,向外部設(shè)有RootContext類作為訪問的接口,所述類圖生成的代碼中設(shè)有一個(gè)所述類圖對(duì)應(yīng)的活動(dòng)圖生成代碼中RootContext類的對(duì)象context。
5.根據(jù)權(quán)利要求4所述的代碼結(jié)構(gòu),其特征在于,所述訪問接口數(shù)量為I個(gè)。
全文摘要
本發(fā)明公開了一種基于類圖和活動(dòng)圖相結(jié)合生成C++代碼的方法,其生成的過程是由用例圖轉(zhuǎn)換為類圖和活動(dòng)圖,以每一個(gè)用例為基礎(chǔ),根據(jù)用例圖中的對(duì)該用例描述、前置條件、后置條件、控制流等信息,生成一個(gè)類圖和一個(gè)活動(dòng)圖;建立類圖和活動(dòng)圖到C++代碼的映射規(guī)則,為了提高代碼的實(shí)用性與有效性,需要將類圖和活動(dòng)圖結(jié)合在一起來生成代碼;以基于模板的技術(shù)為框架,模板引擎的輸入信息選擇基于模型技術(shù)中的類圖和活動(dòng)圖,使用基于類圖和活動(dòng)圖的模板代碼生成技術(shù)生成代碼。
文檔編號(hào)G06F9/45GK103176830SQ201310129978
公開日2013年6月26日 申請(qǐng)日期2013年4月15日 優(yōu)先權(quán)日2013年4月15日
發(fā)明者段振華, 郭冬陽, 田聰, 張南, 王小兵, 羅玲 申請(qǐng)人:西安電子科技大學(xué)