• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于活動圖與順序圖的自動代碼生成

      2021-09-06 01:48文浩,蔣建民,張仕,洪中
      軟件工程 2021年8期

      文浩,蔣建民,張仕,洪中

      摘? 要:在模型驅(qū)動開發(fā)過程中,為了減輕開發(fā)人員的負(fù)擔(dān),通常采用自動工具生成代碼框架。本文提出了一種基于活動圖與順序圖自動生成代碼框架的方法,并且基于該方法開發(fā)了原型工具。首先,給出了活動圖和順序圖的形式化表達(dá);其次,基于活動圖和順序圖模型提出了三個實現(xiàn)自動代碼生成的算法,該算法是通過活動圖來描述對象內(nèi)部的活動次序,并且利用順序圖體現(xiàn)對象之間的交互;最后,給出了一個原型工具,實現(xiàn)了模型到代碼框架的自動轉(zhuǎn)換。該工作可以確保轉(zhuǎn)換的正確性,并且提高軟件開發(fā)效率。

      關(guān)鍵詞:模型驅(qū)動開發(fā);自動代碼生成;形式化方法

      中圖分類號:TP311.5? ? ?文獻(xiàn)標(biāo)識碼:A

      Automatic Code Generation based on Activity and Sequence Diagrams

      WEN Hao1,2, JIANG Jianmin3, ZHANG Shi1, HONG Zhong1

      (1.College of Computer and Cyber Security, Fujian Normal University, Fuzhou 350117, China;

      2.Chengdu Institute of Computer Applications, Chinese Academy of Sciences, Chengdu 610041, China;

      3.College of Software Engineering, Chengdu University of Information Technology, Chengdu 610225, China)

      caswh96@foxmail.com; jjm@cuit.edu.cn; shi@fjnu.edu.cn; fjfzhz@fjnu.edu.cn

      Abstract: In the process of model-driven development, automatic tools are usually used to generate code frameworks in order to reduce the burden on developers. This paper proposes a method to automatically generate code framework based on activity diagram and sequence diagram, and a prototype tool is developed based on this method. First, this paper gives a formal expression of activity diagrams and sequence diagrams; secondly, three algorithms for realizing automatic code generation are proposed based on the activity diagram and sequence diagram. The algorithm uses activity diagrams to describe the internal activity sequence of the object and uses the sequence diagram to reflect the interaction between the objects; finally, a prototype tool is given to realize the automatic conversion from the model to the code framework. This work can ensure the correctness of the conversion and improve the efficiency of software development.

      Keywords: model-driven development; automatic code generation; formal methods

      1? ?引言(Introduction)

      在各種開發(fā)方法中,模型驅(qū)動設(shè)計(Model-Driven Design)因其合理與高效已被工業(yè)界廣泛運用[1-2]。在模型驅(qū)動設(shè)計框架下,先對系統(tǒng)進(jìn)行建模,隨后通過大量的分析與驗證對該模型進(jìn)行更新與修改,這就使得在設(shè)計的早期階段就可以對錯誤進(jìn)行檢測和糾正。統(tǒng)一建模語言(UML)就是該開發(fā)過程中最常用的一種可視化建模工具,它提供了很多不同類型的圖表,分別從不同的視點去建模系統(tǒng),比如數(shù)據(jù)、行為、交互、組件架構(gòu)等機(jī)制。

      當(dāng)開發(fā)人員用UML完成對系統(tǒng)的建模后,需要進(jìn)一步將抽象模型轉(zhuǎn)換為更具體的模型,并最終轉(zhuǎn)換為可執(zhí)行代碼。但在過去的大部分轉(zhuǎn)換過程中,由于沒有完整的自動化方法,導(dǎo)致整個過程的成本較高,并且其中的手工部分因為缺乏形式化方法的支撐,也會造成整個過程容易出錯[3]。近些年來,由于自動生成代碼領(lǐng)域的火熱,關(guān)于從UML模型生成對應(yīng)代碼的研究變得越來越多[4-5]。但遺憾的是,目前大部分的研究都是將單一的UML模型與代碼之間進(jìn)行關(guān)聯(lián),這樣的策略在一定程度上會使得生成的代碼缺失一定的實施細(xì)節(jié)。為了解決上述問題,本文選擇了UML中的兩種模型,一種是活動圖(Activity Diagram),主要用于對業(yè)務(wù)流程進(jìn)行建模;另一種是順序圖(Sequence Diagram),主要用于描述軟件的對象或者進(jìn)程間的交互行為。基于這兩種不同圖的不同視點,本文提出了一個更加完善的自動代碼生成的方法。

      我們依次給出了活動圖和順序圖模型的形式化定義,并基于兩個模型之間的關(guān)聯(lián),將模型元素與代碼語句進(jìn)行了對應(yīng),從而實現(xiàn)了代碼生成。本文給出的三個算法,則對應(yīng)到如何實現(xiàn)代碼生成的自動化或半自動化。

      2? ?活動圖和順序圖(Activity diagram and sequence diagram)

      活動圖被廣泛運用于建模工作流或模擬業(yè)務(wù)流程,它在本質(zhì)上是一種流程圖,著重表現(xiàn)從一個活動到另一個活動的控制流,而順序圖主要是用于顯示對象之間交互的圖。相比于使用單一UML模型,將活動圖與順序圖之間進(jìn)行關(guān)聯(lián)后,可以結(jié)合不同的視點以及兩種圖不同的特性,使生成的代碼框架更加完整,細(xì)節(jié)更多,并更實用。在本節(jié)中,首先給出了活動圖和順序圖的形式化定義,隨后提出了一個關(guān)聯(lián)函數(shù),用于描述活動圖與順序圖之間的關(guān)系。

      活動圖是一種運用節(jié)點和邊的組合,可視化描述活動執(zhí)行過程的UML圖,其中的節(jié)點可以分為活動節(jié)點、對象節(jié)點和控制節(jié)點。活動節(jié)點是活動圖中最主要的元素之一,它用來表示一個活動;對象節(jié)點是用來幫助定義活動中對象流的抽象活動節(jié)點;而控制節(jié)點則是一種可以協(xié)調(diào)其他節(jié)點之間流的特殊的活動節(jié)點。下面給出了一個活動圖抽象語法的定義。

      定義1:一個活動圖是一個九元組AD=

      Fn,Jn,R,Ia,F(xiàn)a>,其中:

      (1)A=AODnMnFnJnIaFa;

      (2)AO,活動節(jié)點和對象節(jié)點的集合;

      (3)Dn,選擇節(jié)點的集合;

      (4)Mn,合并節(jié)點的集合;

      (5)Fn,分叉節(jié)點的集合;

      (6)Jn,匯合節(jié)點的集合;

      (7)RA×A,活動和節(jié)點間關(guān)系的集合;

      (8)Ia,初始節(jié)點的集合;

      (9)Fa,終止節(jié)點的集合。

      對活動圖的形式化定義來自我們目前的工作[6-8]。為了簡化處理,在本文中不區(qū)分對象節(jié)點和活動節(jié)點,即將所有對象節(jié)點都視作活動節(jié)點。同樣為了方便描述,我們給出了前置集和后置集的定義,即對于任意節(jié)點xA,它的前置集和后置集可以分別表示為。x={yA|(y,x)R}和x。={yA|(x,y)R}。

      例1:圖1(a)是一個活動圖,可以表示為AD=

      Mn,F(xiàn)n,Jn,R,Ia,F(xiàn)a>,其中A={i,a,b,p,c,d,e,g,h,j,k,

      dn1,dn2,mn1,mn2,fn,jn,f},AO={a,b,p,c,d,e,g,h,j,k},Dn={dn1,dn2},Mn={mn1,mn2},F(xiàn)n={fn},Jn={jn},R={(i,a),(a,mn1),(mn1,b),(b,dn1),(dn1,p),(p,mn1),(dn1,c),(c,dn2),(dn2,d),(d,mn2),(dn2,e),(e,fn),(fn,g),(fn,h),(g,jn),(h,jn),(jn,j),(j,mn2),(mn2,k),(k,f)},Ia={i},F(xiàn)a={f}。并且可以很明顯得知,對于A中任意一個元素,比如b,可以得到。b={mn1}和b。={dn1}。

      順序圖可視化地描述了對象之間按照時間順序進(jìn)行信息交互的過程,它將交互展示為一個二維圖表,垂直維度上是一條被稱為生命線的虛線,該虛線繪制在每個對象的下面,用于體現(xiàn)時間與順序;而水平維度上主要體現(xiàn)在對象之間的信息交互,即消息的傳遞。下面給出了一個順序圖抽象語法的定義。

      定義2:一個順序圖是一個三元組SD=,其中:

      (1)S,信號的集合;

      (2)O,對象的集合;

      (3)MS×O×O,消息的集合。

      在本文中,因為只關(guān)注對象之間的交互內(nèi)容,所以在給出順序圖的形式化定義時,選擇了一種比較簡易的表達(dá)方式,該方式能更清晰地描述消息的傳遞過程。

      例2:圖1(b)是一個順序圖,可以表示為SD1=

      其中S1={c1,c2,c3,c4,c5},O1={AD,x,y},M1={(c1,AD,x),(c2,x,y),(c3,y,x),(c4,x,AD),(c5,AD,y)}。

      為了在上述活動圖與順序圖之間建立聯(lián)系,本文利用一個關(guān)聯(lián)函數(shù),將每個順序圖視為活動圖中的某一個活動節(jié)點的精化,即活動圖中的每一個活動都可以通過順序圖展開,精化后的活動圖相比于原來的活動圖具有更多的細(xì)節(jié)。

      設(shè)為活動節(jié)點的集合,為所有順序圖的集合;稱函數(shù)map:為“關(guān)聯(lián)函數(shù)”。也就是說,對于所有的xAO,都可以通過關(guān)聯(lián)函數(shù)map得到與之對應(yīng)的順序圖map(x)=,即通過一次關(guān)聯(lián)函數(shù),得到的順序圖map(x)是對活動節(jié)點x所屬的活動圖AD的一次細(xì)節(jié)填充。

      例3:圖1(a)表示的是一個活動圖AD=

      Jn,R,Ia,F(xiàn)a>,圖1(b)、圖1(c)分別表示的是兩個順序圖SD1和SD2。當(dāng)c,pAO,分別存在map(c)=SD1,map(p)=SD2,即可以將SD1和SD2視作活動節(jié)點c和p所屬的活動圖AD的細(xì)節(jié)填充,其余的活動節(jié)點保持不變。

      3? ?代碼生成規(guī)則(The rules for code generation)

      前面介紹了關(guān)聯(lián)函數(shù),建立了活動圖與順序圖之間的聯(lián)系,基于這種聯(lián)系,此部分提出了具體的代碼生成規(guī)則。首先,給出了一種代碼生成函數(shù),使活動圖和順序圖中的節(jié)點與程序語句間形成對應(yīng)關(guān)系;接著設(shè)計了三個算法,用于實現(xiàn)基于活動圖和順序圖的代碼自動生成。

      3.1? ?代碼生成函數(shù)

      把UML圖轉(zhuǎn)換成代碼框架的核心問題,就是如何使得圖形中的核心元素——節(jié)點,與代碼語句一一對應(yīng)。為了在活動圖和順序圖的節(jié)點與Java語句之間建立聯(lián)系,下面給出了一個代碼生成函數(shù)的定義。

      設(shè)是活動節(jié)點和消息的集合,是構(gòu)成Java語言的語句集合;稱函數(shù)g:為“代碼生成函數(shù)”。

      當(dāng)代碼生成函數(shù)的輸入分別為活動節(jié)點和消息時,可以得到:

      (1) xAO,x。Dn:g(x)=boolean x();

      (2) xAO,x。A\Dn:g(x)=void x();

      (3) xM,x=(s,o1,o2):g(x)=o2.s()。

      表1給出了從活動節(jié)點和消息到Java代碼的詳細(xì)對應(yīng)關(guān)系。當(dāng)代碼生成函數(shù)的輸入是活動圖的活動節(jié)點時,可以根據(jù)該活動節(jié)點的后件進(jìn)行分類:一種是當(dāng)活動節(jié)點的后件為選擇節(jié)點時,因為選擇節(jié)點需要一個布爾值的輸入,所以將該活動節(jié)點對應(yīng)的方法的返回值設(shè)置成布爾型。另一種是當(dāng)活動節(jié)點的后件為非選擇節(jié)點時,因為除了選擇節(jié)點,其他的節(jié)點并不需要其前件的輸出作為該節(jié)點的輸入,所以將該活動節(jié)點對應(yīng)的方法的返回值設(shè)置為空。當(dāng)代碼生成函數(shù)的輸入是順序圖的消息時,可以通過識別該消息的發(fā)送對象與接收對象生成對應(yīng)的方法,即該消息的接收對象執(zhí)行該消息的對應(yīng)方法。

      3.2? ?算法設(shè)計

      本文的自動代碼生成策略是,通過依次訪問活動圖中的活動節(jié)點以及各類節(jié)點之間的執(zhí)行順序來生成代碼框架中的類定義與主函數(shù)內(nèi)部的執(zhí)行邏輯,再通過識別順序圖對象之間的通信來完善方法的調(diào)用?;陉P(guān)聯(lián)函數(shù)map和代碼生成函數(shù)g,本節(jié)提出了算法1Gcd(AD,set1)、算法2Sc(AD)和算法3Gel(AD,set2,lp,AD_code),用于實現(xiàn)從活動圖自動生成代碼。

      算法1Gcd(AD,set1)用于生成代碼框架中的類定義,如圖2所示。該算法以活動圖AD和順序圖的集合為輸入,輸出該活動圖AD對應(yīng)生成的代碼AD_code。下面給出算法的具體解釋。

      第1 行是根據(jù)輸入的活動圖的名字創(chuàng)建相應(yīng)的Java包。第2—13 行則是遍歷該活動圖中的所有活動節(jié)點。其中,第3—6 行是識別當(dāng)前活動節(jié)點的對象,如果在當(dāng)前的代碼框架中沒有與該對象名相同的類,則添加對應(yīng)的類定義;第7 行是向類中添加該活動節(jié)點對應(yīng)的方法;第8—12 行是通過映射函數(shù)map尋找到set1中用于精化活動圖節(jié)點的對應(yīng)順序圖,并且識別對應(yīng)順序圖中所有的消息,生成對應(yīng)的方法調(diào)用。第14—15 行是向代碼框架中添加Main類,并且向其中添加main()方法,最后是輸出生成的Java代碼框架。

      算法1執(zhí)行完成之后,活動圖對應(yīng)的代碼框架中已經(jīng)有了類定義的部分,但一個完整的代碼框架除了類定義及方法聲明,其主函數(shù)中還應(yīng)該有具體的執(zhí)行邏輯。為了準(zhǔn)確描述活動圖中順序、選擇、循環(huán)、并發(fā)這四種不同的情況,下面分別給出了算法2Sc(AD)和算法3Gel(AD,set2,lp,AD_code),用于生成main()方法內(nèi)具體的程序執(zhí)行邏輯。

      算法2Sc(AD)是為了找出活動圖中的環(huán),識別可能會循環(huán)執(zhí)行的活動節(jié)點,如圖3所示。該算法以活動圖AD為輸入,輸出AD所有環(huán)中的活動節(jié)點的集合lp。以圖1(a)中的活動圖AD為例,算法2的輸出為lp=Sc(AD)={b,q}。下面給出該算法的具體解釋。

      第1—2 行分別定義一個集合lp和s,并且令lp和s為空。第3—18 行給出了一個深度優(yōu)先的遞歸算法,判斷DFS函數(shù)中第一個輸入的后置節(jié)點是否與該輸入的前置節(jié)點,即第二個輸入之間存在連通關(guān)系,如果存在,則將存放路徑上的所有節(jié)點的集合s賦值給集合lp。第19—22 行是遍歷活動圖中的所有選擇節(jié)點,尋找活動圖中的所有環(huán),并且依次將環(huán)中的節(jié)點存放到集合lp中。第23—24 行是取集合lp中的所有活動節(jié)點,最后輸出生成的集合lp。

      基于算法1和算法2,算法3Gel(AD,set2,lp,AD_code)可以生成一個完整的代碼框架,如圖4所示。該算法以活動圖AD保存初始節(jié)點后件的集合set2,算法2輸出的集合lp和算法1生成的代碼框架為輸入,而輸出則是對應(yīng)的更新后的代碼框架。下面給出該算法的具體解釋。

      第1 行是定義一個集合al,用于存放已經(jīng)存放的選擇節(jié)點。第2—48 行是使用深度優(yōu)先的策略,從初始節(jié)點的后置節(jié)點開始,依次訪問活動圖中的每一個節(jié)點。其中,在第3—9 行里,當(dāng)前節(jié)點為活動節(jié)點時,判斷當(dāng)前執(zhí)行的是否為主線程,如果是主線程,則在main()方法內(nèi)調(diào)用該節(jié)點對應(yīng)的方法,否則在run()方法內(nèi)進(jìn)行相同的方法調(diào)用(run()方法屬于線程類);在第10—17 行中,當(dāng)前節(jié)點為選擇節(jié)點并且該節(jié)點的后置節(jié)點屬于集合lp時,生成對應(yīng)的while語句,并且將該選擇節(jié)點存放到集合al中;在第18—19 行中,當(dāng)前節(jié)點為選擇節(jié)點并且該節(jié)點屬于集合al時,跳轉(zhuǎn)至該選擇節(jié)點的后置節(jié)點;在第20—26 行中,當(dāng)前節(jié)點為選擇節(jié)點并且該節(jié)點的后置節(jié)點不屬于集合lp時,生成對應(yīng)的if語句;在第27—28 行里,當(dāng)前節(jié)點為合并節(jié)點時,跳轉(zhuǎn)至該合并節(jié)點的后置節(jié)點;在第29—35 行中,當(dāng)前節(jié)點為分叉節(jié)點時,根據(jù)當(dāng)前節(jié)點的后置節(jié)點數(shù)減一的數(shù)量創(chuàng)建子線程,并且將子線程和主線程亂序地放入棧中;在第36—44 行里,當(dāng)前節(jié)點為匯合節(jié)點時,令棧內(nèi)位于頂部的線程出棧,如果此時的執(zhí)行線程不為主線程,則在main()方法內(nèi)調(diào)用對應(yīng)線程的join()方法(主線程等待該線程執(zhí)行完成后,再繼續(xù)執(zhí)行),然后再繼續(xù)讓棧內(nèi)的下一個線程出棧,執(zhí)行上述操作,直至棧內(nèi)為空;在第45—48 行里,當(dāng)前節(jié)點為終止節(jié)點時,跳出所有循環(huán)。第49 行是輸出最后更新完的代碼框架。

      綜上,算法1主要是根據(jù)AO和set1中的元素,生成相應(yīng)的代碼語句,其時間復(fù)雜度為O(a×n),其中a表示AO中的節(jié)點個數(shù),n表示set1中與活動節(jié)點對應(yīng)的順序圖的個數(shù)。算法2是判斷活動圖中是否有環(huán),并且將環(huán)中的活動節(jié)點取出,其時間復(fù)雜度為O(d×r),其中d表示Dn中的節(jié)點個數(shù),r表示活動圖中邊的數(shù)量,即R中的元素個數(shù)。算法3是通過遍歷活動圖中的所有節(jié)點,根據(jù)不同的情況生成對應(yīng)的執(zhí)行邏輯,其時間復(fù)雜度為O(a×r),其中a表示AO中的節(jié)點個數(shù),r表示R中的元素個數(shù)。在軟件開發(fā)的設(shè)計階段,因為UML圖是根據(jù)需求進(jìn)行繪制的,所以節(jié)點數(shù)量及圖的數(shù)量都是有限的,開發(fā)人員有充分的時間通過這三個算法生成對應(yīng)的代碼框架。

      例4:圖5中的代碼框架就是通過算法1、算法2和算法3生成的,即AD_code=Gel(AD,set2,lp,Gcd(AD,set1)),其中AD為

      圖1(a)中的活動圖,set1={map(c),map(p)},即分別對應(yīng)圖1(b)、圖1(c)中的順序圖SD1和SD2,set2={a}則是對應(yīng)活動圖AD中初始節(jié)點的后置集合,lp=Sc(AD)={b,q}表示AD中可能會循環(huán)發(fā)生的活動節(jié)點的集合。

      4? ?原型工具(Prototype tool)

      基于開源庫GoJS(https://gojs.net/latest/index.html),我們開發(fā)了原型工具codeGeneration(下載鏈接:https://pan.baidu.com/s/1Z1PzWioR2hRcdmFuwxZPMQ,提取碼:wgoc)用于實現(xiàn)UML模型到Java代碼框架的自動轉(zhuǎn)換。圖6是一個從活動圖轉(zhuǎn)換成對應(yīng)代碼框架的實例。

      5? ?結(jié)論(Conclusion)

      基于模型的自動代碼生成與一致性驗證是實現(xiàn)自動化,以及提高軟件可靠性過程中必不可少的一個環(huán)節(jié)。本文基于UML模型中的活動圖和順序圖,給出了一套完整的Java代碼自動生

      成的方法。相比于傳統(tǒng)的單模型轉(zhuǎn)換方法,我們的方法通過兩種模型間的關(guān)聯(lián),可以讓生產(chǎn)的代碼框架具有更多的細(xì)節(jié)。

      我們未來的工作主要包括兩個方面:一是基于這套自動代碼生成理論,對開發(fā)過程進(jìn)行一致性驗證;二是提出一套系統(tǒng)理論,實現(xiàn)從代碼到模型的直接轉(zhuǎn)換,并且對代碼編碼過程進(jìn)行分析,希望在轉(zhuǎn)換過程中不丟失任何細(xì)節(jié),進(jìn)一步研究涉及的一致性問題。

      參考文獻(xiàn)(References)

      [1] THOMAS A H, JOSEPH S. The embedded systems design challenge[C]//Formal Methods Europe. International Symposium on Formal Methods. Berlin: Springer, 2006:1-15.

      [2] LEE E A. What's ahead for embedded software?[J]. Computer, 2000, 33(9):18-26.

      [3] BALZER R. A 15 year perspective on automatic programming[J]. IEEE Transactions on Software Engineering, 1985(11):1257-1268.

      [4] WANG Y, TALPIN J P, BENVENISTE A, et al. A semantics of UML state-machines using synchronous pre-order transition systems[C]//IEEE ISORC. Proceedings Third IEEE International Symposium on Object-Oriented Real-Time Distributed Computing. New York: IEEE, 2000:96-103.

      [5] VAN C P, ANSGAR R, G?IRARD S ?, et al. Complete code generation from UML state machine[C]//MODELSWARD. Proceedings of the 5th International Conference on Model-Driven Engineering and Software Development. New Jersey: Wiley, 2017:208-219.

      [6] 林添榮,蔣建民.UML活動圖的一種邏輯語義[J].福建師范大學(xué)學(xué)報(自然科學(xué)版),2010,26(03):26-30,39.

      [7] 陳慧峰,余曉菲,蔣建民.UML活動圖的正確性檢測[J].軟件工程,2018,21(03):5-9,4.

      [8] CHEN H, JIANG J, HONG Z, et al. Decomposition of UML activity diagrams[J]. Software: Practice and Experience, 2017, 48(1):105-122.

      作者簡介:

      文? ?浩(1996-),男,碩士生.研究領(lǐng)域:形式化方法.

      蔣建民(1972-),男,博士,教授.研究領(lǐng)域:形式化方法.

      張? ?仕(1977-),男,博士,副教授.研究領(lǐng)域:軟件工程.

      洪? ?中(1979-),男,博士,副教授.研究領(lǐng)域:軟件工程.

      云霄县| 宜川县| 铜川市| 盈江县| 同心县| 定南县| 兴海县| 韶山市| 松阳县| 米脂县| 扎兰屯市| 清水河县| 临汾市| 环江| 苍梧县| 南昌县| 淅川县| 淮安市| 平谷区| 旬邑县| 黔江区| 姜堰市| 台北县| 淮阳县| 门头沟区| 柳江县| 忻州市| 花垣县| 福海县| 辉县市| 泾阳县| 兴宁市| 九龙城区| 黄冈市| 广河县| 且末县| 临泉县| 石台县| 湾仔区| 磐石市| 巴东县|