專利名稱:程序邏輯結(jié)構(gòu)圖示方法及程序路徑統(tǒng)計(jì)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件開發(fā)領(lǐng)域,具體地說,涉及軟件開發(fā)領(lǐng)域的詳細(xì)設(shè)計(jì)和程序測(cè)試領(lǐng)域,更具體地,涉及詳細(xì)設(shè)計(jì)和程序測(cè)試領(lǐng)域的程序邏輯結(jié)構(gòu)圖示方法,以及程序測(cè)試領(lǐng)域的程序路徑統(tǒng)計(jì)方法。
背景技術(shù):
詳細(xì)設(shè)計(jì)和程序測(cè)試是軟件開發(fā)過程的兩個(gè)重要階段。詳細(xì)設(shè)計(jì)針對(duì)目標(biāo)系統(tǒng)進(jìn)行比較詳細(xì)的說明;程序測(cè)試一般分為黑盒測(cè)試和白盒測(cè)試,其中白盒測(cè)試依據(jù)程序的內(nèi)部邏輯結(jié)構(gòu)設(shè)計(jì)測(cè)試用例進(jìn)行測(cè)試。雖然目前很多軟件從總體上來說是面向?qū)ο蟮?,但其局部代碼還是結(jié)構(gòu)化的,詳細(xì)設(shè)計(jì)和白盒測(cè)試常常需要畫出局部程序的邏輯結(jié)構(gòu)的圖示。
目前常用的程序邏輯結(jié)構(gòu)圖示方法是利用繪圖工具軟件,使用邏輯結(jié)構(gòu)圖的圖形符號(hào),畫出程序邏輯結(jié)構(gòu)圖。常用的邏輯結(jié)構(gòu)圖有三種,程序流程圖、盒圖(N-S圖)、PAD圖,它們常用的部分圖形符號(hào)如圖2所示,其中圖2A是程序流程圖的部分圖形符號(hào),201為選擇(分支),202為處理,203為開始或停止,204為預(yù)先定義的處理,205為輸入輸出,206為控制流;圖2B是盒圖的部分圖形符號(hào),211為順序,212為條件,213為循環(huán),214為調(diào)用子程序A;圖2C是PAD圖的部分圖形符號(hào),221為順序,222為循環(huán)(WHILE C DO P),223為選擇(IFC THEN P1 ELSE P2),224為定義。
圖3是對(duì)應(yīng)于圖1A所示的示例代碼的程序流程圖。程序流程圖是歷史最悠久、使用最廣泛的描述程序過程的工具,具有不利于逐步求精、不利于遵循結(jié)構(gòu)程序設(shè)計(jì)的精神、不易表示數(shù)據(jù)結(jié)構(gòu)等缺點(diǎn)。
圖4是對(duì)應(yīng)于圖1A所示的示例代碼的盒圖。盒圖具有功能域明確、不可能任意轉(zhuǎn)移控制、容易確定局部和全部數(shù)據(jù)的作用域、容易表現(xiàn)嵌套關(guān)系和模塊的層次結(jié)構(gòu)等特點(diǎn),但當(dāng)程序結(jié)構(gòu)較復(fù)雜時(shí),盒圖的繪制比較困難。
圖5是對(duì)應(yīng)于圖1A所示的示例代碼的PAD圖。PAD是問題分析圖(problem analysis diagram)的英文縮寫,它用二維樹形結(jié)構(gòu)的圖來表示程序的控制結(jié)構(gòu),將這種圖翻譯成程序代碼比較容易,并且結(jié)構(gòu)清晰、易讀易懂易記,支持自頂向下、逐步求精的設(shè)計(jì)方法。
上述的程序邏輯結(jié)構(gòu)圖示方法使用圖形符號(hào)畫出程序邏輯結(jié)構(gòu)圖,效率較低,尤其是程序邏輯較復(fù)雜時(shí),需要花費(fèi)較長(zhǎng)的繪圖時(shí)間,修改邏輯結(jié)構(gòu)圖也比較麻煩。另一方面,所獲得的邏輯結(jié)構(gòu)圖在用于程序測(cè)試時(shí)有較大缺陷,都難于描述程序路徑,也難于自動(dòng)統(tǒng)計(jì)程序路徑。目前的測(cè)試工作中,當(dāng)要分析程序路徑時(shí),一般要另外畫出控制流圖,增加了工作量。另外,控制流圖在描述程序路徑時(shí)也不夠直觀,并且不便于自動(dòng)統(tǒng)計(jì)路徑。
白盒測(cè)試方法針對(duì)代碼的內(nèi)部邏輯結(jié)構(gòu)設(shè)計(jì)測(cè)試用例,使用邏輯覆蓋作為測(cè)試度量,邏輯覆蓋有語(yǔ)句覆蓋、判定覆蓋、條件覆蓋、判定條件覆蓋、路徑覆蓋等。不同的邏輯覆蓋具有不同的測(cè)試完整性,其中路徑覆蓋是白盒測(cè)試最為經(jīng)典的問題,具有很好的測(cè)試完整性。由于程序中含有循環(huán)結(jié)構(gòu)時(shí),一個(gè)很簡(jiǎn)單的程序都可能產(chǎn)生大量的路徑,完全的路徑覆蓋在實(shí)際的測(cè)試工作中不具實(shí)用性,因此,統(tǒng)計(jì)路徑時(shí)一般不考慮循環(huán)的實(shí)際次數(shù),只考慮執(zhí)行循環(huán)體和不執(zhí)行循環(huán)體兩種情況,這種簡(jiǎn)化的路徑覆蓋又叫Z路徑覆蓋,由于完全的路徑覆蓋不具實(shí)用性,我們所說的路徑覆蓋是指Z路徑覆蓋。
路徑覆蓋具有很好的測(cè)試完整性,但在實(shí)際測(cè)試中卻很少使用,主要原因是測(cè)試成本太高,造成測(cè)試成本高的原因主要有兩點(diǎn)缺少自動(dòng)統(tǒng)計(jì)路徑的方法和工具;由于任何分支都可能使路徑數(shù)量倍增,當(dāng)程序較復(fù)雜時(shí)路徑的數(shù)量巨大。
關(guān)于路徑統(tǒng)計(jì),《軟件測(cè)試技術(shù)概論》(39-40頁(yè),上海艾微軟件技術(shù)有限公司主編,清華大學(xué)出版社出版,2004年4月第一版)一書中提到一種統(tǒng)計(jì)方法用路徑樹來表示程序的所有路徑,然后從根結(jié)點(diǎn)開始,一次遍歷,再回到根結(jié)點(diǎn)后,把所經(jīng)歷的葉結(jié)點(diǎn)名排列起來,就得到一個(gè)路徑,如果設(shè)法遍歷了所有的葉結(jié)點(diǎn),就得到了所有的路徑。該書未詳細(xì)說明具體的實(shí)施步驟。路徑樹常用于在網(wǎng)絡(luò)技術(shù)中計(jì)算路由,例如描述數(shù)據(jù)包在網(wǎng)絡(luò)中的樹形轉(zhuǎn)發(fā)路徑。依據(jù)該書所述的方法,人工畫出路徑樹,并設(shè)法用人工計(jì)算路徑,可能是可行的,但工作量較大。我們未檢索到依據(jù)程序代碼自動(dòng)生成路徑樹的方法,目前軟件市場(chǎng)上也未發(fā)現(xiàn)依據(jù)程序代碼自動(dòng)生成路徑樹的工具,也沒有檢索到進(jìn)一步自動(dòng)統(tǒng)計(jì)程序路徑的方法,也未在軟件市場(chǎng)上發(fā)現(xiàn)自動(dòng)統(tǒng)計(jì)程序路徑的工具。
關(guān)于程序較復(fù)雜時(shí)路徑數(shù)量巨大,導(dǎo)致路徑覆蓋難于實(shí)施的問題,現(xiàn)有技術(shù)中沒有較好的解決辦法。
如上所述,目前的程序邏輯結(jié)構(gòu)圖示方法效率較低,所得到的邏輯結(jié)構(gòu)圖在用于程序測(cè)試時(shí)具有較大缺陷。目前路徑覆蓋測(cè)試缺少自動(dòng)統(tǒng)計(jì)路徑的方法,也存在當(dāng)程序較復(fù)雜時(shí)路徑數(shù)量過大的問題。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是針對(duì)上述的程序邏輯結(jié)構(gòu)圖示方法的不足之處,提出一種新的程序邏輯結(jié)構(gòu)圖示方法。
本發(fā)明要解決的另一個(gè)技術(shù)問題是提出一種程序路徑自動(dòng)統(tǒng)計(jì)方法。
為了解決上述第一個(gè)技術(shù)問題,本發(fā)明提出了如下技術(shù)方案一種程序邏輯結(jié)構(gòu)圖示方法,其特征在于,包括步驟A.生成一個(gè)頂層分支對(duì)象;B.在任意層次的分支對(duì)象中嵌套分支樹對(duì)象和/或語(yǔ)句塊對(duì)象;C.計(jì)算上述各對(duì)象的尺寸及位置并畫出其圖示。
還可以進(jìn)一步包括用于在分支樹對(duì)象中添加分支的步驟;用于在分支樹對(duì)象中刪除選定分支的步驟;用于修改分支判定的步驟;用于編輯語(yǔ)句塊對(duì)象的代碼的步驟;用于隱藏對(duì)象和/或顯示對(duì)象的步驟;用于由邏輯結(jié)構(gòu)圖生成程序代碼的步驟。
為了解決上述另一個(gè)技術(shù)問題,本發(fā)明提出了如下技術(shù)方案一種統(tǒng)計(jì)程序路徑的方法,其特征在于,用統(tǒng)計(jì)程序路徑的步驟代替上述技術(shù)方案中的步驟C。
本發(fā)明提出的程序結(jié)構(gòu)圖示方法,使用結(jié)構(gòu)對(duì)象作為繪圖單位,通過添加結(jié)構(gòu)對(duì)象即可以堆砌出邏輯結(jié)構(gòu)圖,對(duì)象的尺寸和位置自動(dòng)計(jì)算,可以快速設(shè)計(jì)出程序邏輯結(jié)構(gòu)圖,邏輯結(jié)構(gòu)圖便于修改,并與代碼可以雙向生成。該邏輯結(jié)構(gòu)圖可以直觀表現(xiàn)程序的執(zhí)行路徑,還可直接用于統(tǒng)計(jì)程序路徑,程序測(cè)試時(shí)無須另畫其他圖示,減少了工作量。
本發(fā)明提出的程序路徑統(tǒng)計(jì)方法,自動(dòng)統(tǒng)計(jì)程序路徑,依據(jù)統(tǒng)計(jì)結(jié)果即可設(shè)計(jì)路徑覆蓋測(cè)試用例。當(dāng)程序較復(fù)雜時(shí),可以隱藏部分對(duì)象,統(tǒng)計(jì)路徑時(shí)忽略已隱藏的對(duì)象,以壓縮路徑數(shù)量,提高路徑覆蓋測(cè)試的實(shí)用性。
下面結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式
作進(jìn)一步詳細(xì)的說明圖1是示例代碼及示例代碼的結(jié)構(gòu)劃分示意圖和代碼片劃分示意圖,其中圖1A是示例代碼,圖1B是示例代碼的結(jié)構(gòu)劃分示意圖,圖1C是示例代碼的代碼片劃分示意圖。
圖2是背景技術(shù)中所述三種邏輯結(jié)構(gòu)圖的部分圖形符號(hào)。其中圖2A是程序流程圖的部分圖形符號(hào);圖2B是盒圖的部分圖形符號(hào);圖2C是PAD圖的部分圖形符號(hào)。
圖3是對(duì)應(yīng)于圖1A所示的示例代碼的程序流程圖。
圖4是對(duì)應(yīng)于圖1A所示的示例代碼的盒圖。
圖5是對(duì)應(yīng)于圖1A所示的示例代碼的PAD圖。
圖6是本發(fā)明的一個(gè)實(shí)施例的總體流程圖。
圖7是在本發(fā)明的一個(gè)實(shí)施例,各結(jié)構(gòu)對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖及結(jié)構(gòu)對(duì)象樹示意圖,其中圖7A是語(yǔ)句塊對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖,圖7B是分支樹對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖,圖7C是分支對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖,圖7D是結(jié)構(gòu)對(duì)象樹示意圖。
圖8是在本發(fā)明的一個(gè)實(shí)施例,各結(jié)構(gòu)對(duì)象的圖示的示意圖,其中圖8A是分支對(duì)象的圖示的示意圖,圖8B是另一種分支對(duì)象的圖示的示意圖,圖8C、圖8D、圖8E、圖8F、圖8G、圖8H是分支樹對(duì)象的圖示的示意圖,圖8I是語(yǔ)句塊對(duì)象的圖示的示意圖。
圖9是在本發(fā)明的一個(gè)實(shí)施例,畫出程序邏輯結(jié)構(gòu)圖的過程的示意圖,圖9A至圖9D示出了畫出對(duì)應(yīng)于圖1B所示代碼的邏輯結(jié)構(gòu)圖的各步驟。
圖10是在本發(fā)明的一個(gè)實(shí)施例,各對(duì)象的尺寸、位置和基本尺寸的示意圖。
圖11是在本發(fā)明的一個(gè)實(shí)施例,計(jì)算各對(duì)象的寬度和高度的流程示意圖,其中圖11A是計(jì)算語(yǔ)句塊對(duì)象的寬度和高度的流程示意圖,圖11B是計(jì)算分支對(duì)象的寬度和高度的流程示意圖,圖11C是計(jì)算分支樹對(duì)象的寬度和高度的流程示意圖。
圖12是在本發(fā)明的一個(gè)實(shí)施例,計(jì)算各對(duì)象底座高度及分支樹對(duì)象入口線高度的流程示意圖,其中圖12A是計(jì)算語(yǔ)句塊對(duì)象底座高度的流程示意圖,圖12B是計(jì)算分支對(duì)象底座高度的流程示意圖,圖12C是計(jì)算分支樹對(duì)象底座高度的流程示意圖,圖12D是計(jì)算分支樹對(duì)象的入口線高度的流程示意圖。
圖13是在本發(fā)明的一個(gè)實(shí)施例,畫出各對(duì)象圖示的示意圖,其中圖13A是畫出分支對(duì)象圖示的示意圖,圖13B是畫出另一種分支對(duì)象圖示的示意圖,增加了分支標(biāo)注,圖13C是畫出分支樹對(duì)象圖示的示意圖,圖13D是畫出語(yǔ)句塊對(duì)象圖示的示意圖。
圖14是在本發(fā)明的一個(gè)實(shí)施例,對(duì)部分圖示的改進(jìn)及畫出隱藏對(duì)象的圖示的示意圖。
圖15是在本發(fā)明的另一個(gè)實(shí)施例,將代碼片映射為結(jié)構(gòu)對(duì)象的流程示意圖。
圖16是在本發(fā)明的再一個(gè)實(shí)施例,統(tǒng)計(jì)程序路徑的流程示意圖,其中,圖16A是當(dāng)對(duì)象為語(yǔ)句塊時(shí)統(tǒng)計(jì)路徑的流程示意圖,圖16B是當(dāng)對(duì)象為分支時(shí)統(tǒng)計(jì)路徑的流程示意圖,圖16C是當(dāng)對(duì)象為分支樹時(shí)統(tǒng)計(jì)路徑的流程示意圖。
圖17是邏輯結(jié)構(gòu)圖示出程序路徑的示意圖。
具體實(shí)施例方式
圖6是本發(fā)明的一個(gè)實(shí)施例的總體流程圖,如圖6所示,步驟A生成一個(gè)頂層分支對(duì)象,步驟B在任意層次的分支對(duì)象中嵌套分支樹對(duì)象和/或語(yǔ)句塊對(duì)象;步驟C計(jì)算上述各對(duì)象的尺寸及位置并畫出其圖示。下面詳細(xì)描述圖6所示的各步驟所涉及的一些名詞和用語(yǔ)的具體含義,然后再對(duì)各步驟的具體實(shí)施過程作詳細(xì)描述。
本實(shí)施例把程序邏輯結(jié)構(gòu)分為兩種順序結(jié)構(gòu)和分支結(jié)構(gòu)。順序結(jié)構(gòu)對(duì)應(yīng)于一個(gè)語(yǔ)句序列,在這個(gè)語(yǔ)句序列中,如果第一條語(yǔ)句執(zhí)行了,那么在沒有發(fā)生異常,也未因返回語(yǔ)句提前返回的情況下,其他所有語(yǔ)句也會(huì)執(zhí)行,符合這一條件的所有連續(xù)的語(yǔ)句應(yīng)視為屬于同一個(gè)順序結(jié)構(gòu)而不能分拆,即不能把其中的一部分視為屬于一個(gè)順序結(jié)構(gòu),把另一部分視為屬于另一個(gè)順序結(jié)構(gòu)。順序結(jié)構(gòu)具有一個(gè)入口點(diǎn)和一個(gè)出口點(diǎn),其入口點(diǎn)為結(jié)構(gòu)中的第一條語(yǔ)句,出口點(diǎn)為結(jié)構(gòu)中的最后一條語(yǔ)句,但如果順序結(jié)構(gòu)中的某條語(yǔ)句是返回語(yǔ)句(如C++的return語(yǔ)句),執(zhí)行到該語(yǔ)句時(shí)函數(shù)即返回,后面的語(yǔ)句不會(huì)執(zhí)行,實(shí)際上,后面的語(yǔ)句是無效的,因此,該語(yǔ)句是該順序結(jié)構(gòu)的實(shí)際出口點(diǎn)。由于GOTO語(yǔ)句(如C++的goto語(yǔ)句)破壞了結(jié)構(gòu)化設(shè)計(jì)并且在當(dāng)今的開發(fā)中使用越來越少,因此,本實(shí)施例不考慮GOTO語(yǔ)句。
分支結(jié)構(gòu)對(duì)應(yīng)于一個(gè)語(yǔ)句序列,在這個(gè)語(yǔ)句序列中,含有判斷和/或跳轉(zhuǎn)語(yǔ)句或類似功能的語(yǔ)句,在不同的條件下,可能會(huì)執(zhí)行或不執(zhí)行或重復(fù)執(zhí)行其中的某些語(yǔ)句。最典型的分支結(jié)構(gòu)是選擇結(jié)構(gòu),循環(huán)結(jié)構(gòu)也屬于分支結(jié)構(gòu)。由于分支結(jié)構(gòu)在不同的條件下會(huì)執(zhí)行或不執(zhí)行或重復(fù)執(zhí)行某些語(yǔ)句,所以,分支結(jié)構(gòu)至少包含兩種可能的執(zhí)行路線,這些執(zhí)行路線叫做分支,也就是說,一個(gè)分支結(jié)構(gòu)至少包含兩個(gè)分支。為了簡(jiǎn)化問題,循環(huán)結(jié)構(gòu)視為具有進(jìn)入循環(huán)體和不進(jìn)入循環(huán)體兩個(gè)分支,不考慮循環(huán)的次數(shù)。
比較常用的選擇結(jié)構(gòu)有IF結(jié)構(gòu),如C/C++/Java的if(…)…/else…;Pascal的if…then…else…;Basic的IF…THEN…END IF;該結(jié)構(gòu)可含或不含ELSE分支,ELSE分支之前可增加不限數(shù)量的ELSE IF分支。
SWITCH結(jié)構(gòu),如C/C++/Java的switch(…)…,Pascal的case…of…,Basic的SELECT CASE…,該結(jié)構(gòu)可含多個(gè)CASE分支,可含也可不含DEFAULT分支。
比較常用的循環(huán)結(jié)構(gòu)有FOR結(jié)構(gòu)如C/C++/Java的for(…)…,Pascal的for…do…,Basic的FOR…NEXT和FOR EACH…NEXT。
WHILE結(jié)構(gòu)如C/C++/Java的while(…)…,Pascal的while…do…,Basic的DO WHILE…LOOP,DO UNTIL…LOOP。
Do…WHILE結(jié)構(gòu)如C/C++/Java的do…while(…),Basic的DO…LOOPWHILE…,DO…LOOP UNTIL…,該結(jié)構(gòu)至少執(zhí)行循環(huán)體一次。
上述分支結(jié)構(gòu)和編程語(yǔ)言的示例并非窮舉,凡具有兩個(gè)或兩個(gè)以上執(zhí)行路線的代碼結(jié)構(gòu),都視為分支結(jié)構(gòu)。
如上所述,循環(huán)結(jié)構(gòu)視為具有進(jìn)入循環(huán)體和不進(jìn)入循環(huán)體兩個(gè)分支,不考慮循環(huán)的次數(shù),而Do…WHILE循環(huán)結(jié)構(gòu)至少執(zhí)行循環(huán)體一次,因此,它的不進(jìn)入循環(huán)體的分支是不可達(dá)的。
分支結(jié)構(gòu)也具有一個(gè)入口點(diǎn)和一個(gè)出口點(diǎn),不論其內(nèi)部的執(zhí)行路線如何,在不發(fā)生異常的前提下,總是由入口點(diǎn)進(jìn)入該結(jié)構(gòu),并由出口點(diǎn)離開該結(jié)構(gòu),這里有一個(gè)特例,如果結(jié)構(gòu)內(nèi)含有返回語(yǔ)句,執(zhí)行到該語(yǔ)句時(shí)函數(shù)即返回,而不會(huì)從出口點(diǎn)離開該分支結(jié)構(gòu)。
有些分支結(jié)構(gòu)的某些分支是隱含的,如IF結(jié)構(gòu),如果最后沒有ELSE分支,則包含一個(gè)隱含的分支,即使含有ELSE IF分支也是如此,此隱含的分支的執(zhí)行條件和路線是當(dāng)IF和所有ELSE IF判定均為假時(shí),直接跳轉(zhuǎn)到結(jié)構(gòu)的出口點(diǎn)。含有隱含分支的情況還有循環(huán)結(jié)構(gòu)的不進(jìn)入循環(huán)體分支,該分支的執(zhí)行條件和線路是第一次進(jìn)行循環(huán)條件判斷時(shí),該條件即為假,直接跳轉(zhuǎn)到結(jié)構(gòu)的出口點(diǎn);SWITCH結(jié)構(gòu),當(dāng)不含DEFAULT分支時(shí),也含有一個(gè)隱含的分支,其執(zhí)行條件和路線是所有CASE分支的條件均不滿足,不執(zhí)行任一CASE分支,直接跳轉(zhuǎn)到結(jié)構(gòu)的出口點(diǎn)。
由于每一分支結(jié)構(gòu)至少包含兩條分支,可以說,分支結(jié)構(gòu)是由分支構(gòu)成的。分支包含兩方面內(nèi)容分支判定和分支體,分支判定的計(jì)算結(jié)果一般只有真和假兩個(gè)值。判定為真時(shí),執(zhí)行分支體,否則不執(zhí)行分支體。隱含分支的分支判定和分支體都是空的。對(duì)于某一分支來說,其分支體具有一定的范圍,稱為作用域,一般使用特定的符號(hào)來定義作用域的開始和結(jié)束,例如C/C++用花括號(hào)({}),PASCAL用begin和end來指定作用域的開始和結(jié)束。作用域內(nèi)的所有語(yǔ)句,不論其結(jié)構(gòu)如何,數(shù)量多少,均屬于該分支體,因此,一個(gè)分支的分支體可以包含一個(gè)或多個(gè)順序結(jié)構(gòu),也可以包含一個(gè)或多個(gè)分支結(jié)構(gòu),我們稱為子結(jié)構(gòu),子結(jié)構(gòu)又可以包含自己的子結(jié)構(gòu)。
綜上所述,本實(shí)施例把程序邏輯結(jié)構(gòu)分為分支結(jié)構(gòu)和順序結(jié)構(gòu),一個(gè)分支結(jié)構(gòu)至少包含兩個(gè)分支,每一分支又可以進(jìn)一步包含順序結(jié)構(gòu)和/或分支結(jié)構(gòu),我們把這種包含稱為嵌套,嵌套的層次和數(shù)量沒有限制。分支結(jié)構(gòu)和順序結(jié)構(gòu)均有一個(gè)入口點(diǎn)和一個(gè)出口點(diǎn),程序執(zhí)行到任一結(jié)構(gòu)時(shí),在未發(fā)生異常的情況下,總是從入口點(diǎn)進(jìn)入該結(jié)構(gòu),從出口點(diǎn)離開該結(jié)構(gòu),除非因執(zhí)行到返回語(yǔ)句而提前返回。
本實(shí)施例用結(jié)構(gòu)對(duì)象來對(duì)應(yīng)描述上述程序邏輯結(jié)構(gòu)用分支樹對(duì)象描述分支結(jié)構(gòu),用分支對(duì)象描述分支結(jié)構(gòu)中的一個(gè)分支,用語(yǔ)句塊對(duì)象描述順序結(jié)構(gòu)。其中,分支樹對(duì)象嵌套至少兩個(gè)分支對(duì)象,分支對(duì)象可以嵌套任意數(shù)量的分支樹對(duì)象和/或語(yǔ)句塊對(duì)象,嵌套的層次和數(shù)量沒有限制,語(yǔ)句塊對(duì)象不嵌套其他對(duì)象。另外,本實(shí)施例把待示出邏輯結(jié)構(gòu)的目標(biāo)程序的整體視為一個(gè)分支,稱為頂層分支,用一個(gè)頂層分支對(duì)象來描述,該頂層分支對(duì)象與其他分支對(duì)象不同的是,它不嵌套于其他對(duì)象。后文所述“分支對(duì)象”,包括頂層分支對(duì)象和其他層次的分支對(duì)象。我們把分支樹對(duì)象、分支對(duì)象、語(yǔ)句塊對(duì)象統(tǒng)稱為結(jié)構(gòu)對(duì)象。
如果對(duì)象A嵌套了對(duì)象B,我們把對(duì)象A稱為對(duì)象B的父對(duì)象,對(duì)象B稱為對(duì)象A的子對(duì)象。頂層分支對(duì)象沒有父對(duì)象,語(yǔ)句塊對(duì)象沒有子對(duì)象,另外,分支對(duì)象也可能沒有子對(duì)象。從對(duì)象的內(nèi)部數(shù)據(jù)的關(guān)系來說,對(duì)象A(父對(duì)象)嵌套對(duì)象B(子對(duì)象),是指對(duì)象A保存了對(duì)象B本身或?qū)ο驛保存了對(duì)象B的指針或引用,或?qū)ο驛保存了可以引用到對(duì)象B的其他數(shù)據(jù),通過對(duì)象A可以引用對(duì)象B;從對(duì)象的圖示來說,對(duì)象A(父對(duì)象)嵌套對(duì)象B(子對(duì)象),是指對(duì)象B至少在一個(gè)方向上位于對(duì)象A的范圍之內(nèi)。
圖7是在本實(shí)施例,各結(jié)構(gòu)對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖及結(jié)構(gòu)對(duì)象樹示意圖,其中圖7A是語(yǔ)句塊對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖,圖7B是分支樹對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖,圖7C是分支對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖,圖7A到圖7C中,實(shí)線示出的是固定的組成部分,點(diǎn)劃線示出的是可有可無并且不限數(shù)量的組成部分,圖7D是結(jié)構(gòu)對(duì)象樹示意圖,所對(duì)應(yīng)的程序代碼如圖1A所示。
圖7A是語(yǔ)句塊對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖,如圖7A所示,語(yǔ)句塊對(duì)象有一個(gè)代碼字段,用于儲(chǔ)存它所對(duì)應(yīng)的程序代碼,并有一個(gè)名稱字段,用于識(shí)別不同的語(yǔ)句塊對(duì)象,名稱可以使用字母表示,如‘a(chǎn)’、‘b’、‘c’。
圖7B是分支樹對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖,如圖7B所示,分支樹對(duì)象至少嵌套了兩個(gè)分支對(duì)象,還可以嵌套更多的分支對(duì)象。分支結(jié)構(gòu)中的每一分支實(shí)際上是該分支結(jié)構(gòu)的不可分割的組成部分,沒有這些分支,分支結(jié)構(gòu)也就不存在,將分支獨(dú)立出來作為一個(gè)對(duì)象來處理,僅是為了描述和實(shí)施上的簡(jiǎn)便,同時(shí)也更符合面向?qū)ο蟮乃枷搿?br>
圖7C是分支對(duì)象的內(nèi)部數(shù)據(jù)構(gòu)成示意圖,如圖7C所示,分支對(duì)象有一個(gè)分支判定字段用于保存它對(duì)應(yīng)的分支判定,頂層分支沒有對(duì)應(yīng)的分支判定,因此該字段為空。分支對(duì)象可以嵌套任意數(shù)量的分支樹對(duì)象和/或語(yǔ)句塊對(duì)象,如果沒有嵌套分支樹對(duì)象和語(yǔ)句塊對(duì)象,則該分支對(duì)象稱為空分支對(duì)象,與語(yǔ)句塊對(duì)象一樣,分支對(duì)象還具有一個(gè)名稱字段,用于識(shí)別不同的分支對(duì)象,名稱可以使用字母表示,如‘a(chǎn)’、‘b’、‘c’。
圖7D是結(jié)構(gòu)對(duì)象樹示意圖,對(duì)應(yīng)于圖1所示的代碼。如圖7D所示,描述一個(gè)程序的邏輯結(jié)構(gòu)的所有結(jié)構(gòu)對(duì)象構(gòu)成了樹狀關(guān)系,我們稱為結(jié)構(gòu)對(duì)象樹。
為了遍歷上述每一結(jié)構(gòu)對(duì)象,可對(duì)上述結(jié)構(gòu)對(duì)象樹進(jìn)行后序掃描或前序掃描,后序掃描是指從頂層分支對(duì)象開始計(jì)算,針對(duì)每一對(duì)象,先遞歸計(jì)算它的每一個(gè)子對(duì)象,子對(duì)象計(jì)算完成后,再計(jì)算該對(duì)象自身,由于語(yǔ)句塊對(duì)象和空分支對(duì)象沒有子對(duì)象,計(jì)算它們時(shí)直接計(jì)算自身,因此它們是遞歸終止條件。前序掃描與后序掃描相比,唯一區(qū)別在于,針對(duì)每一對(duì)象,前序掃描先計(jì)算該對(duì)象自身,再遞歸計(jì)算子對(duì)象。
結(jié)構(gòu)對(duì)象除具有內(nèi)部數(shù)據(jù)構(gòu)成外,還具有相應(yīng)的外部表示,即顯示在計(jì)算機(jī)屏幕或其他可視媒體上的圖示,這些圖示的組合就構(gòu)成了程序的邏輯結(jié)構(gòu)圖。
圖8是在本實(shí)施例,上述結(jié)構(gòu)對(duì)象的圖示的示意圖。這些圖示僅是為了便于描述和理解本發(fā)明,其形狀、文字、顏色或其他組成部分并不表示對(duì)本發(fā)明權(quán)利要求或?qū)嵤┓绞降南薅ǎ瑢?shí)施本發(fā)明時(shí)可以視需要修改這些圖示的形狀、文字、顏色或其他組成部分。
圖8A是分支對(duì)象的圖示的示意圖,如圖8A所示,811是分支的執(zhí)行路線,可以在這條線上添加分支樹對(duì)象和/或語(yǔ)句塊對(duì)象,分支對(duì)象的入口點(diǎn)812和出口點(diǎn)813位于執(zhí)行路線的兩端。頂層分支對(duì)象的入口點(diǎn)就是程序的入口點(diǎn),頂層分支對(duì)象的出口點(diǎn)就是程序的出口點(diǎn)。
圖8B是分支對(duì)象的另一種圖示的示意圖,在圖8A的基礎(chǔ)上增加了分支標(biāo)注。如圖8B所示,822是分支標(biāo)注,823是分支標(biāo)注的文字。分支標(biāo)注用于顯示分支判定或其他說明文字,分支標(biāo)注的寬度與分支的寬度相同或稍短,從分支標(biāo)注可以看出分支的范圍,因此分支標(biāo)注的另一個(gè)作用是示出分支的范圍。本實(shí)施例將分支判定作為分支標(biāo)注的文字,其語(yǔ)法是C或C++的語(yǔ)法,不同編程語(yǔ)言可使用相應(yīng)的語(yǔ)法。分支對(duì)象一般不單獨(dú)存在,而是作為某一分支樹對(duì)象的組成部分,如圖8C。
圖8C是分支樹對(duì)象的圖示的示意圖,如圖8C所示,831是入口線,832是出口線。每個(gè)分支樹對(duì)象至少包含兩個(gè)分支對(duì)象,這些分支對(duì)象是分支樹對(duì)象的組成部分,虛線框833和虛線框834所標(biāo)示的就是該分支樹對(duì)象嵌套的兩個(gè)分支對(duì)象。程序的執(zhí)行線路是由入口線進(jìn)入,執(zhí)行某一分支,到達(dá)出口線并離開該分支樹對(duì)象。圖8D示出了分支樹對(duì)象的入口點(diǎn)和出口點(diǎn),入口點(diǎn)835和出口點(diǎn)836分別位于入口線的中點(diǎn)和出口線的中點(diǎn)。
圖8E、圖8F、圖8G、圖8H均是分支樹對(duì)象的圖示的示意圖,由于分支結(jié)構(gòu)有多種,不同種類的分支結(jié)構(gòu)具有不同數(shù)量的分支,分支判定也不同,本實(shí)施例將分支樹對(duì)象進(jìn)一步細(xì)化,根據(jù)編程所用的語(yǔ)言,為各語(yǔ)言的每種常用的分支結(jié)構(gòu)提供一個(gè)相應(yīng)的分支樹對(duì)象,例如,可為C++提供for、while、if、if/else、if/else if/else、switch等分支樹對(duì)象(分別稱為“for分支樹”,“while分支樹”、“if分支樹”、“if/else分支樹”、“if/else if/else分支樹”、“switch分支樹”等)。各種細(xì)化的分支樹對(duì)象僅在分支數(shù)量和各分支的分支判定上有所區(qū)別,但對(duì)應(yīng)于SWITCH結(jié)構(gòu)的分支樹還有外圍代碼,如C++的SWITCH結(jié)構(gòu)的外圍代碼是switch(…){…}。本實(shí)施例為對(duì)應(yīng)于SWITCH結(jié)構(gòu)的分支樹增加一個(gè)保存外圍代碼的字段,稱為外圍代碼字段,用于保存類似于switch(…)的外圍代碼,但不保存作用域開始符和結(jié)束符,我們把對(duì)應(yīng)于SWITCH結(jié)構(gòu)的分支樹稱為特殊分支樹。
圖8I是語(yǔ)句塊對(duì)象的圖示的示意圖,如圖8I所示,843是語(yǔ)句塊對(duì)象的范圍矩形,語(yǔ)句塊對(duì)象的入口點(diǎn)841和出口點(diǎn)842位于左右方向的中線與范圍矩形的左右兩端豎線的交點(diǎn)。
下面對(duì)圖6所示的各步驟作進(jìn)一步詳細(xì)描述。
如圖6所示,步驟A生成一個(gè)頂層分支對(duì)象,這是最頂層的對(duì)象,其他步驟所產(chǎn)生的對(duì)象均直接或間接嵌套于頂層分支對(duì)象中。
如圖6所示,步驟B在任意層次的分支對(duì)象中嵌套分支樹對(duì)象和/或語(yǔ)句塊對(duì)象。首先,可以視需要在頂層分支對(duì)象中嵌套分支樹對(duì)象和/或語(yǔ)句塊對(duì)象,由于每一分支樹對(duì)象至少含有兩個(gè)分支對(duì)象,因此,就產(chǎn)生了其他層次的分支對(duì)象,這些分支對(duì)象可以進(jìn)一步嵌套分支樹對(duì)象和/或分支對(duì)象。
本發(fā)明可用于設(shè)計(jì)程序邏輯結(jié)構(gòu)圖(例如用于詳細(xì)設(shè)計(jì)),也可用于根據(jù)已有的程序生成邏輯結(jié)構(gòu)圖(例如用于測(cè)試階段)。本實(shí)施例用于設(shè)計(jì)程序邏輯結(jié)構(gòu)圖,步驟B所述的分支樹對(duì)象和語(yǔ)句塊對(duì)象由用戶指定,嵌套分支樹對(duì)象和/或語(yǔ)句塊對(duì)象的分支對(duì)象也由用戶指定,也就是說,用戶選擇分支樹對(duì)象或語(yǔ)句塊對(duì)象,并嵌套到合適的分支對(duì)象上,即可“堆砌”出程序邏輯結(jié)構(gòu)圖,所選對(duì)象的數(shù)量和嵌套的層次沒有限制。下面用進(jìn)行詳細(xì)設(shè)計(jì)時(shí),畫出程序邏輯結(jié)構(gòu)圖的過程的示例來詳細(xì)說明本實(shí)施例的步驟B圖9是進(jìn)行詳細(xì)設(shè)計(jì)時(shí),畫出程序邏輯結(jié)構(gòu)圖的過程的示意圖,圖9A至圖9D示出了畫出對(duì)應(yīng)于圖1B所示代碼的邏輯結(jié)構(gòu)圖的各步驟,均由兩部分組成左邊或上邊是邏輯結(jié)構(gòu)圖的外部表示,右邊或下邊是相關(guān)對(duì)象的內(nèi)部數(shù)據(jù)及其嵌套關(guān)系,所述的“重畫”是指執(zhí)行步驟C,后文將對(duì)步驟C作進(jìn)一步詳細(xì)描述。
為了便于用戶選擇對(duì)象,本實(shí)施例還提供一個(gè)對(duì)象選擇界面,該界面可以切換編程語(yǔ)言,每種語(yǔ)言顯示對(duì)應(yīng)于各種分支結(jié)構(gòu)的圖標(biāo)(即細(xì)化的分支樹對(duì)象)以及對(duì)應(yīng)于順序結(jié)構(gòu)的圖標(biāo)(即語(yǔ)句塊對(duì)象)供用戶選擇。為了描述方便,當(dāng)用戶選擇一個(gè)對(duì)應(yīng)于某一分支結(jié)構(gòu)的圖標(biāo)時(shí),我們稱為選擇一個(gè)某種分支樹,例如while分支樹、if/else分支樹,當(dāng)用戶選擇一個(gè)對(duì)應(yīng)于順序結(jié)構(gòu)的圖標(biāo)時(shí),我們稱為選擇一個(gè)語(yǔ)句塊,將這些選擇統(tǒng)稱為選擇一個(gè)對(duì)象。
如圖9A所示,用戶選擇while分支樹并在頂層分支對(duì)象的圖示上單擊,該while分支樹對(duì)應(yīng)于圖1B中虛線框101所示的代碼。901是頂層對(duì)象的內(nèi)部數(shù)據(jù)示意圖,在頂層分支對(duì)象的內(nèi)部數(shù)據(jù)901中嵌套while分支樹對(duì)象902并重畫,就得到圖9B左邊所示的邏輯結(jié)構(gòu)圖。
如圖9B所示,用戶選擇語(yǔ)句塊對(duì)象,并在頂層分支對(duì)象執(zhí)行路線位于while分支樹的右邊單擊,該語(yǔ)句塊對(duì)應(yīng)于圖1B中虛線框105所示的代碼。在頂層分支對(duì)象的內(nèi)部數(shù)據(jù)中while對(duì)象之后嵌套一個(gè)語(yǔ)句塊對(duì)象903并重畫,得到圖9C左邊所示的邏輯結(jié)構(gòu)圖。
如圖9C所示,用戶選擇if/else分支樹,并在while分支樹的第一分支單擊,該if/else分支樹對(duì)應(yīng)于圖1B中虛線框102所示的代碼。在while分支樹的第一分支對(duì)象的內(nèi)部數(shù)據(jù)中嵌套一個(gè)if/else分支樹對(duì)象904并重畫,得到圖9D上邊所示的邏輯結(jié)構(gòu)圖。
如圖9D所示,用戶選擇語(yǔ)句塊對(duì)象,并分別在if/else分支樹的第一分支和第二分支單擊。在if/else分支樹的第一分支對(duì)象和第二分支對(duì)象的內(nèi)部數(shù)據(jù)中分別嵌套一個(gè)語(yǔ)句塊對(duì)象905、906并重畫,得到最終的邏輯結(jié)構(gòu)圖。語(yǔ)句塊對(duì)象905對(duì)應(yīng)于圖1B中虛線框103所示的代碼,語(yǔ)句塊對(duì)象906對(duì)應(yīng)于圖1B中虛線框104所示的代碼。
本實(shí)施例分別使用一個(gè)自動(dòng)遞增的字母變量來作為語(yǔ)句塊對(duì)象和分支對(duì)象的名稱,如‘a(chǎn)’、‘b’、‘c’。添加語(yǔ)句塊對(duì)象時(shí)為該語(yǔ)句塊對(duì)象命名,添加分支樹對(duì)象時(shí)為其所屬分支對(duì)象命名。
如圖6所示,步驟C計(jì)算各對(duì)象的尺寸及位置并畫出其圖示,后文所述“重畫”或“重畫邏輯結(jié)構(gòu)圖”均是指重復(fù)執(zhí)行步驟C。步驟C包括三個(gè)方面計(jì)算各對(duì)象的尺寸,本實(shí)施例使用寬度和高度來表示各對(duì)象的尺寸,由于分支樹入口線高度的計(jì)算較復(fù)雜,因此,本實(shí)施例還把入口線高度也作為分支樹對(duì)象的尺寸;計(jì)算各對(duì)象的位置,本實(shí)施例用入口點(diǎn)坐標(biāo)來表示各對(duì)象的位置;畫出各對(duì)象的圖示。
由于子對(duì)象嵌套于父對(duì)象內(nèi),其范圍位于父對(duì)象的范圍之內(nèi),因此,增加或刪除一個(gè)對(duì)象時(shí),其直接或間接父對(duì)象的尺寸會(huì)發(fā)生變化,一些對(duì)象的位置也會(huì)發(fā)生變化,所以,增加或刪除一個(gè)對(duì)象時(shí),一般都需要重新計(jì)算各對(duì)象的相關(guān)尺寸和位置。為了計(jì)算各對(duì)象的相關(guān)尺寸和位置,還需預(yù)先定義一些基本尺寸。
圖10是在本實(shí)施例,各對(duì)象的尺寸、位置和基本尺寸的示意圖。
對(duì)象的寬度和高度就是對(duì)象(包括該對(duì)象的子對(duì)象)最上、最左、最右、最下位置連成的矩形(稱為范圍矩形)的寬度和高度。如圖10所示,虛線畫出的矩形1001是頂層分支對(duì)象的范圍矩形,虛線畫出的矩形1002是if/else分支樹的范圍矩形,虛線畫出的矩形1003是while分支樹的第一分支的范圍矩形,虛線畫出的矩形1004是if/else分支樹的第一分支的范圍矩形,實(shí)線畫出的矩形1005是一個(gè)語(yǔ)句塊對(duì)象的范圍矩形。
如圖10所示,E1是while分支樹對(duì)象的入口線高度,E2是if/else分支樹對(duì)象的入口線高度。
如圖10所示,1011是頂層分支對(duì)象的入口點(diǎn)、1012是while分支樹對(duì)象的入口點(diǎn)、1013是while分支樹對(duì)象的第一分支的入口點(diǎn)、1014是語(yǔ)句塊對(duì)象的入口點(diǎn),它們的坐標(biāo)就是相應(yīng)對(duì)象的入口點(diǎn)坐標(biāo)。
如圖10所示,圖10中由字母S開頭的標(biāo)注均表示基本尺寸,包括語(yǔ)句塊對(duì)象的寬度S1、語(yǔ)句塊對(duì)象的高度S2;分支標(biāo)注的高度S3、分支標(biāo)注與分支的距離S4、兩條分支之間的距離S5;其中,分支標(biāo)注并非必需的,如果省略分支標(biāo)注,可以把S3和S4均設(shè)為0,不須改變后文所述的計(jì)算公式;左右方向連接的兩個(gè)對(duì)象之間的距離S6。
基本尺寸不隨對(duì)象的增刪而變化,但可以通過調(diào)整基本尺寸來縮放邏輯結(jié)構(gòu)圖。
下面進(jìn)一步詳細(xì)描述步驟C。
C1.計(jì)算各對(duì)象的尺寸。如前所述,各對(duì)象的尺寸包括各對(duì)象的寬度和高度,計(jì)算各對(duì)象的寬度和高度的步驟是從頂層分支對(duì)象開始,針對(duì)每一對(duì)象,先遞歸計(jì)算各子對(duì)象的寬度和高度,再根據(jù)子對(duì)象的寬度和高度計(jì)算該對(duì)象的寬度和高度。
圖11是本實(shí)施例計(jì)算各對(duì)象的寬度和高度的流程示意圖,其中圖11A是計(jì)算語(yǔ)句塊對(duì)象的寬度和高度的流程示意圖,圖11B是計(jì)算分支對(duì)象的寬度和高度的流程示意圖,圖11C是計(jì)算分支樹對(duì)象的寬度和高度的流程示意圖。
如圖11A所示,針對(duì)語(yǔ)句塊對(duì)象,依下述公式計(jì)算其寬度和高度寬度=S1;高度=S2;其中,S1為語(yǔ)句塊對(duì)象的寬度,S2為語(yǔ)句塊對(duì)象的高度。
針對(duì)分支對(duì)象,依下述公式計(jì)算其寬度和高度寬度=S1+2*S6 (N=0);寬度=∑W+(N+1)*S6(N>0);高度=S3+S4 (N=0);高度=Hm+S3+S4(N>0);其中,N為該分支對(duì)象的子對(duì)象數(shù)量,S1為語(yǔ)句塊對(duì)象的寬度,S6為左右方向連接的兩個(gè)對(duì)象之間的距離,∑W為所有子對(duì)象的寬度之和,S3為分支標(biāo)注的高度,S4為分支標(biāo)注與分支的距離,Hm為高度最大的子對(duì)象的高度。
具體計(jì)算過程如圖11B所示,如果子對(duì)象數(shù)量N為0,則用公式寬度=S1+2*S6,高度=S3+S4計(jì)算自身的寬度和高度,否則掃描子對(duì)象,如果子對(duì)象是語(yǔ)句塊對(duì)象,則遞歸執(zhí)行圖11A所示的計(jì)算,否則遞歸執(zhí)行圖11C所示的計(jì)算;所有子對(duì)象計(jì)算完成后,查找高度最大的子對(duì)象,然后按公式寬度=∑W+(N+1)*S6,高度=Hm+S3+S4計(jì)算自身的寬度和高度。
針對(duì)分支樹對(duì)象,依下述公式計(jì)算其寬度和高度寬度=Wm;高度=∑H+(N-1)*S5;其中,Wm為寬度最大的子對(duì)象的寬度,∑H為所有子對(duì)象的高度之和,N為子對(duì)象數(shù)量,S5為兩條分支之間的距離。
具體計(jì)算過程如圖11C所示,掃描子對(duì)象,針對(duì)每一子對(duì)象(子對(duì)象都是分支對(duì)象),遞歸執(zhí)行圖11B所示的計(jì)算,完成后查找寬度最大的分支,然后按上述的公式計(jì)算自身的寬度和高度。
計(jì)算完分支樹的寬度和高度后,還要對(duì)齊分支,使分支樹的所有分支的寬度相等,方法是修改除寬度最大的分支以外的各分支的寬度,令其等于寬度最大的分支的寬度。
如前所述,各對(duì)象的尺寸還可以進(jìn)一步包括分支樹對(duì)象的入口線高度,下面描述計(jì)算分支樹對(duì)象的入口線高度的步驟。
為了計(jì)算分支樹對(duì)象的入口線高度,需要先計(jì)算各對(duì)象的底座高度。所述底座高度就是對(duì)象的從入口點(diǎn)到范圍矩形底邊的距離,各對(duì)象均有自己的底座高度,底座高度也是計(jì)算入口點(diǎn)坐標(biāo)的基礎(chǔ)。用后序掃描方法計(jì)算各對(duì)象的底座高度,即從頂層分支對(duì)象開始,針對(duì)每一對(duì)象,先遞歸計(jì)算各子對(duì)象的底座高度,再根據(jù)各子對(duì)象的底座高度計(jì)算該對(duì)象的底座高度。
圖12是本實(shí)施例計(jì)算各對(duì)象底座高度及分支樹對(duì)象入口線高度的流程示意圖,其中圖12A是計(jì)算語(yǔ)句塊對(duì)象底座高度的流程示意圖,圖12B是計(jì)算分支對(duì)象底座高度的流程示意圖,圖12C是計(jì)算分支樹對(duì)象底座高度的流程示意圖,圖12D是計(jì)算分支樹對(duì)象的入口線高度的流程示意圖。
如圖12A所示,針對(duì)語(yǔ)句塊對(duì)象,依下列公式計(jì)算其底座高度底座高度=S2/2;其中S2為語(yǔ)句塊對(duì)象的高度。
針對(duì)分支對(duì)象,依下述公式計(jì)算其底座高度底座高度=0 (N=0);底座高度=Bm(N>0);其中,N為子對(duì)象數(shù)量,Bm為底座高度最大的子對(duì)象的底座高度。
具體計(jì)算過程如圖12B所示,如果子對(duì)象數(shù)量N為0,則按上述第一個(gè)公式計(jì)算底座高度,否則掃描子對(duì)象,如果子對(duì)象是語(yǔ)句塊,則遞歸執(zhí)行圖12A所示的計(jì)算,否則遞歸執(zhí)行圖12C所示的計(jì)算,全部子對(duì)象計(jì)算完成后,查找底座高度最大的子對(duì)象,并按上述第二個(gè)公式計(jì)算底座高度。
針對(duì)分支樹對(duì)象,依下述公式計(jì)算其底座高度底座高度=[B1+(Hn-Bn)+∑(H2…Hn-1)+(N-1)*S5]/2+Bn;其中,B1為第一子對(duì)象底座高度,Hn為最末子對(duì)象高度,Bn為最末子對(duì)象底座高度,∑(H2…Hn-1)為除第一子對(duì)象和最末子對(duì)象以外的其他子對(duì)象的高度之和,N為子對(duì)象數(shù)量,S5為兩條分支之間的距離。
具體計(jì)算過程如圖12C所示,掃描子對(duì)象,針對(duì)每一子對(duì)象,遞歸執(zhí)行圖12B所示的計(jì)算,所有子對(duì)象計(jì)算完成后,使用上述公式計(jì)算自身的底座高度。
如圖12D所示,依下述公式計(jì)算分支樹對(duì)象入口線高度入口線高度=B1+(Hn-Bn)+∑(H2…Hn-1)+(N-1)*S5;其中,B1為第一子對(duì)象底座高度,Hn為最末子對(duì)象高度,Bn為最末子對(duì)象底座高度,∑(H2…Hn-1)為除第一子對(duì)象和最末子對(duì)象以外的其他子對(duì)象的高度之和,N為子對(duì)象數(shù)量,S5為兩條分支之間的距離。
C2.計(jì)算各對(duì)象的位置。如前所述,各對(duì)象的位置包括各對(duì)象入口點(diǎn)坐標(biāo)。計(jì)算各對(duì)象入口點(diǎn)坐標(biāo)的步驟如下從頂層分支對(duì)象開始,針對(duì)每一對(duì)象,先計(jì)算該對(duì)象的入口點(diǎn)坐標(biāo),再根據(jù)該對(duì)象的位置遞歸計(jì)算各子對(duì)象的入口點(diǎn)坐標(biāo)。
為了便于描述和實(shí)施,本實(shí)施例采用如下坐標(biāo)系橫坐標(biāo)向右為正,縱坐標(biāo)向下為正,原點(diǎn)為頂層分支對(duì)象范圍矩形的左上角。
針對(duì)頂層分支對(duì)象,依下述公式計(jì)算其入口點(diǎn)坐標(biāo)X=0;Y=H-B;其中,X為入口點(diǎn)橫坐標(biāo),向右為正,Y為入口點(diǎn)縱坐標(biāo),向下為正,H為對(duì)象高度,B為對(duì)象底座高度。
針對(duì)分支對(duì)象的第N個(gè)子對(duì)象,依下述公式計(jì)算其入口點(diǎn)坐標(biāo)Xn=∑(W1…Wn-1)+N*S6;Yn=Y(jié)i;其中,N為從1開始的子對(duì)象順序號(hào),Xn為該第N個(gè)子對(duì)象的入口點(diǎn)的橫坐標(biāo),向右為正,∑(W1…Wn-1)為該第N個(gè)子對(duì)象之前的子對(duì)象的寬度之和,S6為左右方向連接的兩個(gè)對(duì)象之間的距離,Yn為所述第N個(gè)子對(duì)象的入口點(diǎn)的縱坐標(biāo),向下為正,Yi為分支對(duì)象入口點(diǎn)縱坐標(biāo)。
針對(duì)分支樹對(duì)象的第N個(gè)子對(duì)象,依下述公式計(jì)算其入口點(diǎn)坐標(biāo)Xn=Xi;Yn=Y(jié)i-E/2(N=1);
Yn=Y(jié)n-1+Bn-1+Hn-Bn+S5(N>1);其中,N為從1開始的子對(duì)象順序號(hào),Xn為該第N個(gè)子對(duì)象的入口點(diǎn)的橫坐標(biāo),向右為正,Xi為該分支樹對(duì)象入口點(diǎn)橫坐標(biāo),Yn為該第N個(gè)子對(duì)象的入口點(diǎn)的縱坐標(biāo),向下為正,Yn-1為前一子對(duì)象入口點(diǎn)縱坐標(biāo),Bn-1為前一子對(duì)象的底座高度,Hn為該第N個(gè)子對(duì)象的高度,Bn為該第N個(gè)子對(duì)象的底座高度,S5為兩條分支之間的距離。
C3.畫出各對(duì)象的圖示。畫出各對(duì)象圖示的步驟如下從頂層分支對(duì)象開始,針對(duì)每一對(duì)象,先畫出該對(duì)象的圖示,再遞歸畫出各子對(duì)象的圖示。
畫頂層分支對(duì)象前擦除舊的整幅圖,畫其他某一對(duì)象前擦除該對(duì)象范圍矩形內(nèi)的圖形。
各對(duì)象均有出口點(diǎn),其坐標(biāo)(Xo,Yo)的為Xo=Xi+W;Yo=Y(jié)i;其中,Xi為入口點(diǎn)橫坐標(biāo),W為對(duì)象的寬度,Yi為入口點(diǎn)縱坐標(biāo)。
圖13是本實(shí)施例畫出各對(duì)象圖示的示意圖,其中圖13A是畫出分支對(duì)象圖示的示意圖,圖13B是畫出另一種分支對(duì)象圖示的示意圖,增加了分支標(biāo)注,圖13C是畫出分支樹對(duì)象圖示的示意圖,圖13D是畫出語(yǔ)句塊對(duì)象圖示的示意圖。
如圖13A所示,分支對(duì)象的圖示包括執(zhí)行線811。畫出執(zhí)行線811的方法是在入口點(diǎn)1311和出口點(diǎn)1312之間畫一條線段。
如圖13B所示,另一種分支對(duì)象的圖示還包括分支標(biāo)注822和分支標(biāo)注的文字823。
除畫出執(zhí)行線外,還要畫出分支標(biāo)注,本實(shí)施例用矩形作為分支標(biāo)注,畫出分支標(biāo)注的步驟如下計(jì)算分支標(biāo)注矩形823,其左上角1321坐標(biāo)(X,Y)為X=Xi+S6;Y=Y(jié)i+H-B+S3+S4;其中,Xi為該分支的入口點(diǎn)橫坐標(biāo),S6為左右方向連接的兩個(gè)對(duì)象之間的距離,Yi為該分支的入口點(diǎn)縱坐標(biāo),H為該分支高度,B為該分支底座高度,S3為分支標(biāo)注的高度,S4為分支標(biāo)注與分支的距離。
分支標(biāo)注矩形的寬度和高度為
寬度=W-S6*2;高度=S3;其中,W為分支寬度,S6為左右方向連接的兩個(gè)對(duì)象之間的距離,S3為分支標(biāo)注的高度。
在本實(shí)施例,分支標(biāo)注不畫邊框,只畫出灰色背景。
最后在分支標(biāo)注矩形中輸出分支標(biāo)注的文字。
如圖13C所示,分支樹對(duì)象的圖示包括入口線831和出口線832,畫法是計(jì)算入口線831的兩個(gè)端點(diǎn)的坐標(biāo)值(X1,Y1),(X2,Y2)X1=X2=Xi;其中Xi為入口點(diǎn)橫坐標(biāo)Y1=Y(jié)i-E/2;其中Yi為入口點(diǎn)縱坐標(biāo),E為入口線高度;Y2=Y(jié)1+E;其中Y1為入口線的上端點(diǎn)縱坐標(biāo),E為入口線高度。
將入口線向右偏移該分支樹對(duì)象的寬度,即可得到出口線832,其坐標(biāo)為(X1+W,Y1),(X2+W,Y2);其中W為分支樹對(duì)象的寬度。
在(X1,Y1),(X2,Y2)之間畫一條線段,即為入口線831。
在(X1+W,Y1),(X2+W,Y2)之間畫一條線段,即為出口線832。
如圖13D所示,本實(shí)施例用范圍矩作為語(yǔ)句塊的圖示。畫出語(yǔ)句塊對(duì)象的圖示的方法是用直線畫出范圍矩形843,矩形的左上角1341坐標(biāo)為X=Xi;Y=Y(jié)i-S2/2;其中,Xi為該語(yǔ)句塊入口點(diǎn)橫坐標(biāo),Yi為該語(yǔ)句塊入口點(diǎn)縱坐標(biāo),S2為語(yǔ)句塊對(duì)象的高度。
各對(duì)象畫出后,所獲得的圖形就是程序邏輯結(jié)構(gòu)圖,為了編輯和操作邏輯結(jié)構(gòu)圖,本實(shí)施例還可以增加下述步驟用于在分支樹對(duì)象中添加分支的步驟,該步驟具體包括1)使用命中測(cè)試方法判斷用戶選擇了哪個(gè)分支樹對(duì)象;2)在該分支樹對(duì)象中添加一個(gè)分支對(duì)象;3)重畫邏輯結(jié)構(gòu)圖。
命中測(cè)試是指根據(jù)鼠標(biāo)或光標(biāo)的位置判斷用戶是否選中某一對(duì)象或鼠標(biāo)在某一對(duì)象上停留的方法。本實(shí)施例采用后序掃描方法進(jìn)行命中測(cè)試從頂層分支對(duì)象開始,針對(duì)每一對(duì)象,先遞歸測(cè)試各子對(duì)象,再測(cè)試該對(duì)象,命中某一對(duì)象時(shí)結(jié)束測(cè)試,判斷命中的方法是如果鼠標(biāo)或光標(biāo)位置位于該對(duì)象的范圍矩形內(nèi)則命中,否則未命中。
用于在分支樹對(duì)象中刪除選定分支的步驟,該步驟具體包括1)使用前述的命中測(cè)試方法判斷用戶選擇了哪個(gè)分支對(duì)象;2)在父對(duì)象中刪除相應(yīng)的分支對(duì)象;3)重畫邏輯結(jié)構(gòu)圖。
添加和刪除分支時(shí),要保證分支樹對(duì)象的完整,一般來說,可以添加和刪除的,只能是IF結(jié)構(gòu)的ELSE IF分支或ELSE分支、SWITCH結(jié)構(gòu)的CASE分支和DEFAULT分支,IF結(jié)構(gòu)中,ELSE分支或空分支必有其一,SWITCH結(jié)構(gòu)中,DEFAULT分支與空分支也必有其一。循環(huán)結(jié)構(gòu)對(duì)應(yīng)的分支樹對(duì)象不能添加或刪除分支。
用于修改分支判定的步驟,該步驟具體包括1)使用前述的命中測(cè)試方法判斷用戶選擇了哪個(gè)分支對(duì)象;2)顯示一個(gè)編輯框,其中顯示現(xiàn)有的分支判定;3)用戶在編輯框中修改分支判定;4)將新的分支判定保存到分支對(duì)象中。
用于編輯語(yǔ)句塊對(duì)象的代碼的步驟,該步驟具體包括1)使用前述的命中測(cè)試方法判斷用戶選擇了哪個(gè)語(yǔ)句塊對(duì)象;2)顯示一個(gè)編輯框,如果語(yǔ)句塊對(duì)象已有代碼,在編輯框中顯示現(xiàn)有的代碼;3)用戶在編輯框中填寫代碼或修改代碼;4)將編輯過的代碼保存到該語(yǔ)句塊對(duì)象中。
用于隱藏對(duì)象和/或顯示對(duì)象的步驟。對(duì)于內(nèi)部邏輯較復(fù)雜的程序,它的邏輯結(jié)構(gòu)圖也將較復(fù)雜,為了突出重點(diǎn),便于分析程序邏輯結(jié)構(gòu),或者為了壓縮程序路徑,可將邏輯結(jié)構(gòu)圖的部分內(nèi)容隱藏。本實(shí)施例可以將任意對(duì)象隱藏,畫出隱藏的對(duì)象時(shí),可以忽略它,也可以畫出一個(gè)替代圖示。圖14是對(duì)部分圖示的改進(jìn)及畫出隱藏對(duì)象的圖示的示意圖,如圖14所示,如果隱藏的對(duì)象是分支樹或語(yǔ)句塊,則畫出一個(gè)小矩形1405(稱為替代矩形),通過這個(gè)小矩形可以選中該對(duì)象,并恢復(fù)正常顯示,如果隱藏的對(duì)象是分支,則畫成一條虛線1406。隱藏某一對(duì)象時(shí),其直接或間接子對(duì)象同時(shí)隱藏。該步驟具體包括各對(duì)象增加一個(gè)記錄狀態(tài)的字段,該字段的取值有“正?!焙汀半[藏”,缺省值為“正?!保灰[藏某一對(duì)象,將它的狀態(tài)設(shè)為“隱藏”,并重畫邏輯結(jié)構(gòu)圖。當(dāng)計(jì)算分支樹和語(yǔ)句塊對(duì)象的寬度和高度時(shí),檢查它的狀態(tài),如果狀態(tài)為“隱藏”,則其寬度和高度為替代矩形的寬度S10和高度S11,并且忽略子對(duì)象。計(jì)算分支對(duì)象的寬度和高度時(shí),檢查它的狀態(tài),如果狀態(tài)為“隱藏”,忽略子對(duì)象,視為空分支對(duì)象來計(jì)算寬度和高度。畫出對(duì)象時(shí),對(duì)于分支樹對(duì)象和語(yǔ)句塊對(duì)象,如果狀態(tài)為“隱藏”,則只畫一個(gè)替代矩形,忽略子對(duì)象,對(duì)于分支對(duì)象,如果狀態(tài)為“隱藏”,則只在入口點(diǎn)和出口點(diǎn)之間畫一條虛線,但分支標(biāo)注仍然畫出,忽略子對(duì)象。
用于由邏輯結(jié)構(gòu)圖生成程序代碼的步驟,該步驟具體包括從頂層分支對(duì)象開始,遞歸掃描各對(duì)象,針對(duì)語(yǔ)句塊對(duì)象,直接輸出它對(duì)應(yīng)的代碼,針對(duì)分支對(duì)象,如果是空分支則忽略,否則先輸出分支判定和分支作用域開始符(如C++的“{”或PASCAL的“begin”),然后掃描每一子對(duì)象,最后輸出分支作用域結(jié)束符(如C++的“}”或PASCAL的“end”)。針對(duì)分支樹對(duì)象,如果該對(duì)象是第一實(shí)施例所述的特殊分支樹,如C++的switch分支樹,則先輸出外圍代碼如switch(…)和作用域開始符如“{”,再掃描各子對(duì)象(各分支),最后輸出作用域結(jié)束符如“}”;如果不是特殊分支樹對(duì)象,直接掃描各子對(duì)象(各分支)。生成代碼時(shí)可視需要添加換行符,另外,各對(duì)象均有嵌套層次,如頂層分支對(duì)象的層次為0,頂層分支對(duì)象的直接子對(duì)象的層次為1,如此類推,可以根據(jù)嵌套層次計(jì)算代碼縮進(jìn)并加入空格,以生成符合習(xí)慣排版格式的代碼。
另外,部分圖示還可以作一些改進(jìn)。如圖14所示,可在頂層分支對(duì)象的左端加上程序入口圖示1401,其寬度和高度為S7,右端加上出口圖示1402,其直徑為S8。設(shè)定坐標(biāo)系時(shí)將原點(diǎn)向右偏移S7,留出入口圖示的位置。
如圖14所示,還可將分支樹對(duì)象的入口線改為矩形1403,稱為入口矩形,增加入口矩形使邏輯結(jié)構(gòu)圖的構(gòu)成更清晰,計(jì)算分支樹對(duì)象的寬度時(shí),加上入口矩形的寬度S9,在計(jì)算各分支的入口點(diǎn)坐標(biāo)時(shí)也加上該矩形造成的橫坐標(biāo)的偏移,畫出分支樹對(duì)象時(shí),將入口線畫成入口矩形。
如圖14所示,當(dāng)一個(gè)語(yǔ)句塊對(duì)象對(duì)應(yīng)的代碼含有返回語(yǔ)句,還可將該語(yǔ)句塊對(duì)象的圖示畫成如1404所示,即在右端加一個(gè)直徑為S10的圓形,表示這也是程序的一個(gè)出口。
如前一實(shí)施例所述,本發(fā)明可用于設(shè)計(jì)程序邏輯結(jié)構(gòu)圖(例如用于詳細(xì)設(shè)計(jì)),也可用于根據(jù)已有的程序生成邏輯結(jié)構(gòu)圖(例如用于測(cè)試階段)。本實(shí)施例根據(jù)已有的程序生成邏輯結(jié)構(gòu)圖,圖6所示的步驟B所述分支樹對(duì)象和/或語(yǔ)句塊對(duì)象依據(jù)程序代碼生成。在本實(shí)施例,步驟B具體包括解析程序代碼的邏輯結(jié)構(gòu),依據(jù)程序代碼的分支結(jié)構(gòu)生成對(duì)應(yīng)的分支樹對(duì)象及對(duì)應(yīng)的分支對(duì)象,依據(jù)程序代碼的順序結(jié)構(gòu)生成對(duì)應(yīng)的語(yǔ)句塊對(duì)象,并將所述分支樹對(duì)象和所述語(yǔ)句塊對(duì)象嵌套于對(duì)應(yīng)層次的分支對(duì)象中,進(jìn)一步詳細(xì)描述如下首先,將程序代碼分解為代碼片。所述代碼片是指以結(jié)構(gòu)特征來確定類別的代碼單位,代碼片類別有判定、域符號(hào)、語(yǔ)句塊,域符號(hào)又分為域開始和域結(jié)束。判定是指含有判斷或跳轉(zhuǎn)或類似關(guān)鍵字、用于控制其作用域內(nèi)的語(yǔ)句執(zhí)行或不執(zhí)行的代碼片,例如C++的if(…)、else if(…)、else、while(…)、switch(…)、caseN;Basic的lF…、ELSE IF…、ELSE、DO WHILE…。判定必須完整,例如,C++的if(…)是一個(gè)完整的判定,不論括號(hào)內(nèi)的條件有多長(zhǎng),都屬于該判定的組成部分,不能分拆。域符號(hào)是定義判定的作用域的代碼,域開始緊接著判定,用于指定判定的作用域的開始,域結(jié)束用于指定判定的作用域的結(jié)束,典型的域符號(hào)如C++的“{”與“}”,PASCAL的“begin”與“end”;語(yǔ)句塊是指對(duì)應(yīng)于前文所述的順序結(jié)構(gòu)的代碼序列,其中不能含有判定。位于某一代碼片內(nèi)的注釋可忽略也可作為該代碼片的一部分,位于代碼片外的注釋可忽略也可歸于其后的代碼片。圖1C是代碼片分類示例,如圖1C所示,代碼111、113、115對(duì)應(yīng)的代碼片為判定;代碼112和117對(duì)應(yīng)的代碼片為域符號(hào),其中代碼112對(duì)應(yīng)的代碼片為域開始,代碼117對(duì)應(yīng)的代碼片為域結(jié)束;代碼114、116、118對(duì)應(yīng)的代碼片為語(yǔ)句塊。
本實(shí)施例使用包含代碼內(nèi)容、類別、附加類別三個(gè)字段的數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)代碼片,代碼片保存在如鏈表或數(shù)組之類的數(shù)據(jù)容器中。分解代碼時(shí),針對(duì)判定類代碼片,應(yīng)判斷是不是屬于特殊分支樹,及判斷是不是屬于一個(gè)分支樹的后續(xù)分支,可根據(jù)判定的關(guān)鍵字分辨是否屬于特殊分支樹,如C++代碼的switch關(guān)鍵字;后續(xù)分支也可根據(jù)判定的關(guān)鍵字來辨識(shí),如針對(duì)C++代碼,如果是else關(guān)鍵字引出的判定或else if關(guān)鍵字引出的判定,則屬于后續(xù)分支,如果一個(gè)判定類代碼片屬于特殊分支樹或后續(xù)分支(兩者不可能并列),則記錄在附加類別中。
有時(shí),域符號(hào)是省略的,如C++代碼,當(dāng)作用域只有一條語(yǔ)句時(shí),域符號(hào)是可省略的,再如,Basic的IF…THEN…結(jié)構(gòu)中,THEN后不換行,其作用域?yàn)橥恍械腡HEN后的語(yǔ)句,THEN是域開始,域結(jié)束省略;IF…THEN…END IF結(jié)構(gòu)中,THEN和END IF是域開始和域結(jié)束,而IF…THEN…ELSE IF…THEN…ELSE…END IF結(jié)構(gòu)中,ELSE IF之前省略了域結(jié)束,ELSE之前也省略了域結(jié)束。代碼分解時(shí),每個(gè)判定之后應(yīng)保證具有匹配的域開始和域結(jié)束,凡域符號(hào)省略的,應(yīng)補(bǔ)上相應(yīng)的域符號(hào),其代碼為空。
分解代碼時(shí)還要考慮隱含分支,當(dāng)IF結(jié)構(gòu)缺少ELSE分支,SWITCH結(jié)構(gòu)缺少DEFAULT分支時(shí),以及視為分支結(jié)構(gòu)的循環(huán)結(jié)構(gòu),均含有隱含分支。應(yīng)為隱含分支加上三個(gè)代碼片一個(gè)判定,一個(gè)域開始,一個(gè)域結(jié)束,它們的代碼均為空。
不同的編程語(yǔ)言,代碼分解依據(jù)的語(yǔ)法及關(guān)鍵字略有不同,具體分解過程可用編譯技術(shù)中的詞法分析和語(yǔ)法分析技術(shù)來實(shí)現(xiàn),實(shí)現(xiàn)過程屬于現(xiàn)有技術(shù),在此不作詳述。
完成代碼分解后,進(jìn)一步將代碼片映射為結(jié)構(gòu)對(duì)象。圖15是本實(shí)施例將代碼片映射為結(jié)構(gòu)對(duì)象的流程示意圖,如圖15所示,1501是輸入的父對(duì)象,流程中所生成的分支樹對(duì)象和語(yǔ)句塊對(duì)象均嵌套于父對(duì)象中,父對(duì)象只能是分支對(duì)象。1502是代碼片隊(duì)列,將代碼片按代碼的本來順序,用先進(jìn)先出的隊(duì)列儲(chǔ)存,稱為代碼片隊(duì)列。后文所述的“彈出代碼片”,是指從代碼片隊(duì)列中取出最前的一個(gè)代碼片,并將該代碼片從代碼片隊(duì)列中刪除;后文所述“代碼片”,當(dāng)未作限定時(shí),是指最新彈出的代碼片;后文所述“壓入臨時(shí)隊(duì)列”,是指將代碼片保存到臨時(shí)代碼片隊(duì)列的尾部。本實(shí)施例將圖15所示的流程編寫為一個(gè)遞歸調(diào)用的函數(shù),用參數(shù)方式傳遞父對(duì)象和代碼片隊(duì)列,初始調(diào)用時(shí),將步驟A生成的頂層分支對(duì)象作為父對(duì)象,代碼片隊(duì)列包含程序的所有代碼片,當(dāng)處理一個(gè)分支時(shí),為了進(jìn)一步處理分支體所對(duì)應(yīng)的代碼片,將該分支作為父對(duì)象,該分支的分支體對(duì)應(yīng)的代碼片保存在一個(gè)臨時(shí)代碼片隊(duì)列中作為輸入的代碼片隊(duì)列,進(jìn)行遞歸調(diào)用。
步驟1503判斷代碼片隊(duì)列是否為空,如果為空則結(jié)束,否則執(zhí)行步驟1504,步驟1504彈出代碼片,在步驟1505判斷該代碼片的類別,如類別為語(yǔ)句塊,執(zhí)行步驟1511,如類別為判定,執(zhí)行步驟1521,如類別為域符號(hào),由于此時(shí)不應(yīng)該出現(xiàn)域符號(hào),執(zhí)行步驟1590,步驟1590報(bào)告錯(cuò)誤并退出。
步驟1511生成一個(gè)語(yǔ)句塊對(duì)象,并嵌套在父對(duì)象中,本實(shí)施例在生成語(yǔ)句塊對(duì)象時(shí)使用一個(gè)自動(dòng)遞增的字符變量作為每一個(gè)語(yǔ)句塊對(duì)象的名稱,如‘a(chǎn)’、‘b’、‘c’。步驟1512保存代碼,將代碼片的代碼內(nèi)容拷貝到語(yǔ)句塊對(duì)象的代碼字段中,然后返回到步驟1503處理下一代碼片。
步驟1521生成分支樹對(duì)象,并嵌套到父對(duì)象中,在步驟1522中根據(jù)代碼片的附加類別判斷該分支樹是否屬于特殊分支樹,如果是特殊分支樹,執(zhí)行步驟1531,否則執(zhí)行步驟1541。步驟1531保存外圍代碼,將代碼片的代碼內(nèi)容拷貝到特殊分支樹對(duì)象的外圍代碼字段。步驟1532判斷代碼片隊(duì)列是否為空,如果為空則執(zhí)行步驟1590報(bào)錯(cuò)并退出,否則執(zhí)行步驟1533彈出代碼片,并在步驟1534判斷該代碼片的類別,如果類別為域開始,則返回執(zhí)行步驟1532(忽略外圍代碼的域開始,步驟1572忽略外圍代碼的域結(jié)束),如果類別為判定則執(zhí)行步驟1541,如果類別不是域開始也不是判定,則執(zhí)行步驟1590報(bào)錯(cuò)并退出。
步驟1541生成一個(gè)分支對(duì)象,嵌套于步驟1521生成的分支樹對(duì)象中,本實(shí)施例在生成分支對(duì)象時(shí)使用一個(gè)自動(dòng)遞增的字符變量作為每一個(gè)分支對(duì)象的名稱,如‘a(chǎn)’、‘b’、‘c’。步驟1542保存分支判定,將代碼片的代碼內(nèi)容拷貝到該分支對(duì)象的分支判定字段。步驟1543判斷代碼片隊(duì)列是否為空,如果為空則執(zhí)行步驟1590報(bào)錯(cuò)并退出,否則執(zhí)行步驟1545彈出代碼片,并在步驟1546判斷該代碼片的類別,如果類別是域開始,則執(zhí)行步驟1547,否則執(zhí)行步驟1590報(bào)錯(cuò)并退出。步驟1547生成一個(gè)用于判斷域符號(hào)是否匹配的變量N并賦值為1,表示讀到了一個(gè)域開始,步驟1551判斷代碼片隊(duì)列是否為空,如果為空則執(zhí)行步驟1590報(bào)錯(cuò)并退出,否則執(zhí)行步驟1552彈出代碼片,并在步驟1553中判斷該代碼片的類別,如果類別是域開始,則N加1,如果是域結(jié)束,則N減1,然后判斷N的值是否為0,如果為0,表示對(duì)應(yīng)的域結(jié)束已彈出,實(shí)現(xiàn)了域匹配,執(zhí)行步驟1562,否則在步驟1554將代碼片壓入臨時(shí)隊(duì)列,并返回步驟1551循環(huán)處理下一代碼片。步驟1562處理分支體代碼,將步驟1541生成的分支對(duì)象作為父對(duì)象,臨時(shí)隊(duì)列作為代碼片隊(duì)列,進(jìn)行遞歸調(diào)用,然后清空臨時(shí)隊(duì)列。
步驟1563判斷隊(duì)列是否為空,如果為空則結(jié)束,否則在步驟1571彈出代碼片,并在步驟1572判斷該代碼片的類別,如果類別是域結(jié)束,則返回執(zhí)行步驟1571,如果類別是判定,則執(zhí)行步驟1573,否則返回執(zhí)行步驟1505處理后續(xù)的代碼片直到結(jié)束。步驟1573根據(jù)代碼片的附屬類別判斷該代碼片是否屬于上一分支的后續(xù)分支,如是則執(zhí)行步驟1541,否則表示當(dāng)前的分支樹已處理完畢,返回執(zhí)行步驟1505處理后續(xù)的代碼片直到結(jié)束。
上面詳細(xì)描述了圖6所示的步驟B的另一種實(shí)施過程。本實(shí)施例從程序代碼生成邏輯結(jié)構(gòu)圖,可用于在編寫代碼時(shí)保持邏輯結(jié)構(gòu)圖與代碼的同步,也可用于在測(cè)試時(shí)生成程序代碼邏輯結(jié)構(gòu)圖。
下面詳細(xì)描述用于統(tǒng)計(jì)程序路徑的實(shí)施例,本實(shí)施在前述實(shí)施例的基礎(chǔ)上,包括一個(gè)用于統(tǒng)計(jì)程序路徑的步驟。統(tǒng)計(jì)路徑時(shí)也可以不畫出程序的邏輯結(jié)構(gòu)圖,即可以省略計(jì)算各結(jié)構(gòu)對(duì)象的尺寸及位置并畫出其圖示的步驟。
路徑是指程序的執(zhí)行路線,本實(shí)施例所述的路徑包括語(yǔ)句組合和/或分支組合,也就是說,用語(yǔ)句組合和/或分支組合來描述路徑,一般情況下,用語(yǔ)句組合來識(shí)別路徑,分支組合可用于統(tǒng)計(jì)路徑所覆蓋的分支。語(yǔ)句組合是指路徑所執(zhí)行的語(yǔ)句塊的序列,由語(yǔ)句塊名按路徑的執(zhí)行順序組成;分支組合是指路徑所經(jīng)歷的分支的序列,由分支名按路徑的經(jīng)歷順序組成;也就是說,語(yǔ)句組合記錄路徑執(zhí)行的語(yǔ)句,分支組合記錄路徑經(jīng)歷的分支。我們把路徑的語(yǔ)句組合中的語(yǔ)句稱為路徑的執(zhí)行語(yǔ)句,把路徑的分支組合中的分支稱為路徑的經(jīng)歷分支。另外,由于統(tǒng)計(jì)路徑的需要,路徑還分為兩類正常和返回,類別為返回的路徑經(jīng)過了一個(gè)含有返回語(yǔ)句的語(yǔ)句塊,因此提前結(jié)束;類別為正常的路徑在程序結(jié)束時(shí)結(jié)束。統(tǒng)計(jì)路徑時(shí),路徑的缺省類別為正常,當(dāng)一條路徑經(jīng)過一個(gè)含有返回語(yǔ)句的語(yǔ)句塊時(shí),將該路徑的類別設(shè)為返回,該路徑即結(jié)束。
統(tǒng)計(jì)程序路徑的步驟具體包括后序掃描前述結(jié)構(gòu)對(duì)象,針對(duì)每一對(duì)象,將一個(gè)輸入路徑集作為初始數(shù)據(jù)進(jìn)行路徑統(tǒng)計(jì),頂層分支對(duì)象的輸入路徑集只含一條空路徑;針對(duì)語(yǔ)句塊對(duì)象,在輸入路徑集的每條路徑中記錄該語(yǔ)句塊名;針對(duì)分支對(duì)象,在輸入路徑集的每條路徑中記錄該分支名,前一子對(duì)象的輸出路徑集作為下一子對(duì)象的輸入路徑集;針對(duì)分支樹對(duì)象,將輸入路徑集的拷貝作為每一子對(duì)象的輸入路徑集。下面描述上述步驟中遞歸計(jì)算各結(jié)構(gòu)對(duì)象時(shí)統(tǒng)計(jì)路徑的詳細(xì)步驟圖16是本實(shí)施例統(tǒng)計(jì)程序路徑的流程示意圖,其中,圖16A是當(dāng)對(duì)象為語(yǔ)句塊時(shí)統(tǒng)計(jì)路徑的流程示意圖,圖16B是當(dāng)對(duì)象為分支時(shí)統(tǒng)計(jì)路徑的流程示意圖,圖16C是當(dāng)對(duì)象為分支樹時(shí)統(tǒng)計(jì)路徑的流程示意圖。
圖16A是當(dāng)對(duì)象為語(yǔ)句塊時(shí)統(tǒng)計(jì)路徑的流程示意圖。如圖16A所示,步驟1603掃描路徑集,即掃描輸入路徑集1601,針對(duì)每一條路徑,在步驟1604判斷它的類別,如果類別為返回,則返回到步驟1603處理下一條路徑,否則在步驟1605判斷該語(yǔ)句塊對(duì)象的代碼是否含有返回語(yǔ)句,如果是,則執(zhí)行步驟1606將路徑的類別設(shè)為返回再執(zhí)行步驟1607,否則直接執(zhí)行步驟1607,步驟1607記錄語(yǔ)句名,即在路徑的語(yǔ)句組合的最后添加該語(yǔ)句塊名。所有路徑處理完成后即得到輸出路徑集1602,輸出路徑集中的路徑的數(shù)量與輸入路徑集一致。
圖16B是當(dāng)對(duì)象為分支時(shí)統(tǒng)計(jì)路徑的流程示意圖。當(dāng)對(duì)象為分支時(shí),依次計(jì)算該對(duì)象的子對(duì)象,前一子對(duì)象計(jì)算后的輸出路徑集,作為下一子對(duì)象的輸入路徑集,直到所有子對(duì)象計(jì)算完畢,最末子對(duì)象的輸出路徑集就是該分支對(duì)象的輸出路徑集。如圖16B所示,步驟1611記錄分支,即在輸入路徑集的每條路徑的分支組合的最后添加該分支名。步驟1612掃描每一子對(duì)象,如果完畢或沒有子對(duì)象則結(jié)束,否則執(zhí)行步驟1613。步驟1613判斷該子對(duì)象是不是語(yǔ)句塊,如果是則執(zhí)行步驟1614,否則執(zhí)行步驟1615,步驟1614遞歸執(zhí)行圖16A所示的計(jì)算,并將計(jì)算后的路徑集作為下一子對(duì)象的輸入路徑集;步驟1615遞歸執(zhí)行圖16C所示的計(jì)算,并將輸出的路徑集作為下一子對(duì)象的輸入路徑集。步驟1614和步驟1615執(zhí)行后均返回到步驟1612處理下一子對(duì)象直到結(jié)束。
圖16C是當(dāng)對(duì)象為分支樹時(shí)統(tǒng)計(jì)路徑的流程示意圖。如圖16C所示,步驟1623剔除返回路徑將輸入路徑集1621中類別為返回的路徑拷貝到輸出路徑集1622中,并從輸入路徑集1621刪除。步驟1624掃描子對(duì)象(分支),讀取一個(gè)分支后,步驟1625將輸入路徑集拷貝一份作為該分支的輸入路徑集。步驟1626針對(duì)該分支遞歸執(zhí)行圖16B所示的計(jì)算,然后返回到步驟1624處理下一分支。所有分支計(jì)算完成后,步驟1627將各分支的輸出路徑集匯總到整個(gè)分支樹對(duì)象的輸出路徑集1622中,計(jì)算結(jié)束。
頂層分支對(duì)象的輸入路徑集只含一個(gè)空路徑,所述空路徑是指語(yǔ)句組合和分支組合均為空的路徑;頂層分支對(duì)象的輸出路徑集就是程序的路徑集。路徑集中的每條路徑,均記錄了該路徑所執(zhí)行的語(yǔ)句塊對(duì)象序列和該路徑所經(jīng)歷的分支對(duì)象序列。
圖17是邏輯結(jié)構(gòu)圖示出程序路徑的示意圖。如圖17A所示的邏輯結(jié)構(gòu)圖,有3條路徑,其語(yǔ)句組合分別是ac、bc、c;如圖17B所示的邏輯結(jié)構(gòu)圖,有6條路徑,其語(yǔ)句組合分別是adc、bdc、dc、aec、bec、ec;如圖17C所示的邏輯結(jié)構(gòu)圖,有8條路徑,其語(yǔ)句組合分別是adc、bdc、fdc、gdc、aec、bec、fec、gec。
當(dāng)程序較復(fù)雜時(shí),路徑的數(shù)量會(huì)很龐大,要設(shè)計(jì)測(cè)試用例覆蓋所有路徑是不現(xiàn)實(shí)的??梢詫⒁恍┨囟ǖ拇a所對(duì)應(yīng)的對(duì)象隱藏,統(tǒng)計(jì)路徑時(shí),忽略隱藏的對(duì)象及其直接或間接子對(duì)象,以便壓縮路徑的數(shù)量。如果畫出了邏輯結(jié)構(gòu)圖,可以由用戶選擇要隱藏的對(duì)象,否則可以隱藏嵌套層次太深的對(duì)象。
本實(shí)例還包括畫出程序路徑圖示的步驟,一次畫出一條程序路徑的圖示,該步驟具體包括畫出路徑經(jīng)過各分支樹對(duì)象時(shí)的圖示。掃描路徑所經(jīng)歷的的分支,針對(duì)每一分支,如果該分支有父對(duì)象,則父對(duì)象是分支樹對(duì)象,本實(shí)施例用加粗的線段連接父對(duì)象的入口點(diǎn)和該分支的入口點(diǎn),及父對(duì)象的出口點(diǎn)與該分支的出口點(diǎn)。
畫出路徑經(jīng)過各分支對(duì)象時(shí)的圖示。掃描路徑所經(jīng)歷的的分支,針對(duì)每一分支,本實(shí)施例用加粗的線段連接該分支對(duì)象的入口點(diǎn)、各子對(duì)象、出口點(diǎn),即連接入口點(diǎn)與第一子對(duì)象的入口點(diǎn),第一子對(duì)象的出口點(diǎn)與第二子對(duì)象的入口點(diǎn),……,最末子對(duì)象的出口點(diǎn)與該分支的出口點(diǎn)。
畫出路徑經(jīng)過各語(yǔ)句塊對(duì)象時(shí)的圖示。掃描路徑所經(jīng)歷的的語(yǔ)句,針對(duì)每一語(yǔ)句塊,本實(shí)施例用斜線填充語(yǔ)句塊對(duì)象的范圍矩形表示路徑經(jīng)過了該語(yǔ)句塊。
圖17A和圖17B示出了本實(shí)施例畫出一條程序路徑的效果,其中,圖17A示出了路徑bc,圖17B示出了路徑ec。
從上述各實(shí)施例可看出,本發(fā)明提出的程序邏輯結(jié)構(gòu)圖示方法,可快速進(jìn)行詳細(xì)設(shè)計(jì),可在程序代碼與邏輯結(jié)構(gòu)圖之間雙向轉(zhuǎn)換,可用以統(tǒng)計(jì)和示出程序路徑。本發(fā)明提出的程序路徑統(tǒng)計(jì)方法,可自動(dòng)統(tǒng)計(jì)程序路徑并畫出路徑的圖示。
上述各實(shí)施例僅是本發(fā)明的較佳實(shí)施方式,僅用以說明發(fā)本明而非限制,對(duì)本發(fā)明進(jìn)行修改、變形或者等同替換而不脫離本發(fā)明的精神和范圍,均應(yīng)涵蓋于本發(fā)明的范圍之內(nèi)。
權(quán)利要求
1.一種程序邏輯結(jié)構(gòu)圖示方法,其特征在于,包括步驟A.生成一個(gè)頂層分支對(duì)象;B.在任意層次的分支對(duì)象中嵌套分支樹對(duì)象和/或語(yǔ)句塊對(duì)象;C.計(jì)算上述各對(duì)象的尺寸及位置并畫出其圖示。
2.根據(jù)權(quán)利要求1所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,將程序邏輯結(jié)構(gòu)分為順序結(jié)構(gòu)和分支結(jié)構(gòu);所述語(yǔ)句塊對(duì)象用于描述順序結(jié)構(gòu),所述分支樹對(duì)象用于描述分支結(jié)構(gòu),所述分支對(duì)象用于描述頂層分支或分支結(jié)構(gòu)的一個(gè)分支;每一所述分支樹對(duì)象至少嵌套了兩個(gè)分支對(duì)象。
3.根據(jù)權(quán)利要求1所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述嵌套包括被嵌套的對(duì)象的范圍至少在一個(gè)方向上落在嵌套它的對(duì)象的范圍之內(nèi)。
4.根據(jù)權(quán)利要求1所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,用細(xì)化的分支樹對(duì)象描述不同的分支結(jié)構(gòu)。
5.根據(jù)權(quán)利要求1所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述步驟B所述分支樹對(duì)象和/或語(yǔ)句塊對(duì)象由用戶指定。
6.根據(jù)權(quán)利要求5所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,嵌套所述分支樹對(duì)象和/或語(yǔ)句塊對(duì)象的分支對(duì)象由用戶指定。
7.根據(jù)權(quán)利要求1所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述步驟B所述分支樹對(duì)象和/或語(yǔ)句塊對(duì)象依據(jù)程序代碼生成。
8.根據(jù)權(quán)利要求7所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述步驟B具體包括解析程序代碼的邏輯結(jié)構(gòu),依據(jù)程序代碼的分支結(jié)構(gòu)生成對(duì)應(yīng)的分支樹對(duì)象及對(duì)應(yīng)的分支對(duì)象,依據(jù)程序代碼的順序結(jié)構(gòu)生成對(duì)應(yīng)的語(yǔ)句塊對(duì)象,并將所述分支樹對(duì)象和所述語(yǔ)句塊對(duì)象嵌套于對(duì)應(yīng)層次的分支對(duì)象中。
9.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述各對(duì)象的尺寸包括各對(duì)象的寬度和高度。
10.根據(jù)權(quán)利要求9所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述步驟C包括步驟C1.從頂層分支對(duì)象開始,針對(duì)每一對(duì)象,先遞歸計(jì)算各子對(duì)象的寬度和高度,再根據(jù)子對(duì)象的寬度和高度計(jì)算該對(duì)象的寬度和高度,進(jìn)一步包括依下述公式計(jì)算語(yǔ)句塊對(duì)象的寬度和高度寬度=S1;高度=S2;其中,S1為語(yǔ)句塊對(duì)象的寬度,S2為語(yǔ)句塊對(duì)象的高度;依下述公式計(jì)算分支對(duì)象的寬度和高度寬度=S1+2*S6 (N=0);寬度=∑W+(N+1)*S6 (N>0);高度=S3+S4(N=0);高度=Hm+S3+S4 (N>0);其中,N為該分支對(duì)象的子對(duì)象數(shù)量,S1為語(yǔ)句塊對(duì)象的寬度,S6為左右方向連接的兩個(gè)對(duì)象之間的距離,∑W為所有子對(duì)象的寬度之和,S3為分支標(biāo)注的高度,S4為分支標(biāo)注與分支的距離,Hm為高度最大的子對(duì)象的高度;依下述公式計(jì)算分支樹對(duì)象的寬度和高度寬度=Wm;高度=∑H+(N-1)*S5;其中,Wm為最寬子對(duì)象的寬度,∑H為所有子對(duì)象的高度之和,N為子對(duì)象數(shù)量,S5為兩條分支之間的距離。
11.根據(jù)權(quán)利要求10所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述各對(duì)象的尺寸進(jìn)一步包括各分支樹對(duì)象的入口線高度。
12.根據(jù)權(quán)利要求11所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述步驟C1進(jìn)一步包括計(jì)算各對(duì)象的底座高度;依下述公式計(jì)算分支樹對(duì)象入口線高度入口線高度=B1+(Hn-Bn)+∑(H2...Hn-1)+(N-1)*S5;其中,B1為第一子對(duì)象底座高度,Hn為最末子對(duì)象高度,Bn為最末子對(duì)象底座高度,∑(H2...Hn-1)為除第一子對(duì)象和最末子對(duì)象以外的其他子對(duì)象的高度之和,N為子對(duì)象數(shù)量,S5為兩條分支之間的距離。
13.根據(jù)權(quán)利要求12所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述計(jì)算各對(duì)象的底座高度具體包括從頂層分支對(duì)象開始,針對(duì)每一對(duì)象,先遞歸計(jì)算各子對(duì)象的底座高度,再根據(jù)各子對(duì)象的底座高度計(jì)算該對(duì)象的底座高度,進(jìn)一步包括依下述公式計(jì)算語(yǔ)句塊對(duì)象的底座高度底座高度=S2/2;其中S2為語(yǔ)句塊對(duì)象的高度;依下述公式計(jì)算分支對(duì)象的底座高度底座高度=0(N=0);底座高度=Bm (N>0);其中,N為子對(duì)象數(shù)量,Bm為底座高度最大的子對(duì)象的底座高度;依下述公式計(jì)算分支樹對(duì)象的底座高度底座高度=[B1+(Hn-Bn)+∑(H2...Hn-1)+(N-1)*S5]/2+Bn;其中,B1為第一子對(duì)象底座高度,Hn為最末子對(duì)象高度,Bn為最末子對(duì)象底座高度,∑(H2...Hn-1)為除第一子對(duì)象和最末子對(duì)象以外的其他子對(duì)象的高度之和,N為子對(duì)象數(shù)量,S5為兩條分支之間的距離。
14.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述各對(duì)象的位置包括各對(duì)象的入口點(diǎn)坐標(biāo)。
15.根據(jù)權(quán)利要求14所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述步驟C包括步驟C2.從頂層分支對(duì)象開始,針對(duì)每一對(duì)象,先計(jì)算該對(duì)象的入口點(diǎn)坐標(biāo),再根據(jù)該對(duì)象的位置遞歸計(jì)算各子對(duì)象的入口點(diǎn)坐標(biāo),進(jìn)一步包括依下述公式計(jì)算頂層分支對(duì)象的入口點(diǎn)坐標(biāo)X=0;Y=H-B;其中,X為入口點(diǎn)橫坐標(biāo),向右為正,Y為入口點(diǎn)縱坐標(biāo),向下為正,H為對(duì)象高度,B為對(duì)象底座高度;依下述公式計(jì)算分支對(duì)象的第N個(gè)子對(duì)象的入口點(diǎn)坐標(biāo)Xn=∑(W1...Wn-1)+N*S6;Yn=Y(jié)i;其中,N為從1開始的子對(duì)象順序號(hào),Xn為該第N個(gè)子對(duì)象的入口點(diǎn)的橫坐標(biāo),向右為正,∑(W1...Wn-1)為該第N個(gè)子對(duì)象之前的子對(duì)象的寬度之和,S6為左右方向連接的兩個(gè)對(duì)象之間的距離,Yn為所述第N個(gè)子對(duì)象的入口點(diǎn)的縱坐標(biāo),向下為正,Yi為分支對(duì)象入口點(diǎn)縱坐標(biāo);依下述公式計(jì)算分支樹對(duì)象的第N個(gè)子對(duì)象的入口點(diǎn)坐標(biāo)Xn=Xi;Yn=Y(jié)i-E/2 (N=1);Yn=Y(jié)n-1+Bn-1+Hn-Bn+S5 (N>1);其中,N為從1開始的子對(duì)象順序號(hào),Xn為該第N個(gè)子對(duì)象的入口點(diǎn)的橫坐標(biāo),向右為正,Xi為該分支樹對(duì)象入口點(diǎn)橫坐標(biāo),Yn為該第N個(gè)子對(duì)象的入口點(diǎn)的縱坐標(biāo),向下為正,Yn-1為前一子對(duì)象入口點(diǎn)縱坐標(biāo),Bn-1為前一子對(duì)象的底座高度,Hn為該第N個(gè)子對(duì)象的高度,Bn為該第N個(gè)子對(duì)象的底座高度,S5為兩條分支之間的距離。
16.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述分支樹對(duì)象的圖示包括入口線和出口線。
17.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述分支對(duì)象的圖示包括執(zhí)行線。
18.根據(jù)權(quán)利要求17所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述分支對(duì)象的圖示進(jìn)一步包括分支標(biāo)注。
19.根據(jù)權(quán)利要求18所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述分支對(duì)象的圖示進(jìn)一步包括分支標(biāo)注的文字。
20.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述語(yǔ)句塊對(duì)象的圖示包括范圍矩形。
21.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述步驟C包括步驟C3.從頂層分支對(duì)象開始,針對(duì)每一對(duì)象,先畫出該對(duì)象的圖示,再遞歸畫出各子對(duì)象的圖示。
22.根據(jù)權(quán)利要求21所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,所述步驟C3進(jìn)一步包括忽略隱藏的對(duì)象或針對(duì)隱藏的對(duì)象,只畫出替代圖示。
23根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,進(jìn)一步包括用于在分支樹對(duì)象中添加分支的步驟。
24.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,進(jìn)一步包括用于在分支樹對(duì)象中刪除選定分支的步驟。
25.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,進(jìn)一步包括用于修改分支判定的步驟。
26.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,進(jìn)一步包括用于編輯語(yǔ)句塊對(duì)象的代碼的步驟。
27.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,進(jìn)一步包括用于隱藏對(duì)象和/或顯示對(duì)象的步驟。
28.根據(jù)權(quán)利要求1至8任一權(quán)利要求所述的程序邏輯結(jié)構(gòu)圖示方法,其特征在于,進(jìn)一步包括用于由邏輯結(jié)構(gòu)圖生成程序代碼的步驟。
29.一種根據(jù)權(quán)利要求1所述的程序邏輯結(jié)構(gòu)圖示方法統(tǒng)計(jì)程序路徑的方法,其特征在于,用統(tǒng)計(jì)程序路徑的步驟代替所述步驟C。
30.根據(jù)權(quán)利要求29所述的統(tǒng)計(jì)程序路徑的方法,其特征在于,所述程序路徑包括語(yǔ)句組合和/或分支組合。
31.根據(jù)權(quán)利要求29所述的統(tǒng)計(jì)程序路徑的方法,其特征在于,所述統(tǒng)計(jì)程序路徑的步驟包括后序掃描所述各對(duì)象,針對(duì)每一對(duì)象,將一個(gè)輸入路徑集作為初始數(shù)據(jù)進(jìn)行路徑統(tǒng)計(jì),頂層分支對(duì)象的輸入路徑集只含一條空路徑。
32.根據(jù)權(quán)利要求31所述的統(tǒng)計(jì)程序路徑的方法,其特征在于,所述統(tǒng)計(jì)程序路徑的步驟進(jìn)一步包括針對(duì)語(yǔ)句塊對(duì)象,在輸入路徑集的每條路徑中記錄該語(yǔ)句塊名;針對(duì)分支對(duì)象,前一子對(duì)象的輸出路徑集作為下一子對(duì)象的輸入路徑集;針對(duì)分支樹對(duì)象,將輸入路徑集的拷貝作為每一子對(duì)象的輸入路徑集。
33.根據(jù)權(quán)利要求32所述的統(tǒng)計(jì)程序路徑的方法,其特征在于,所述統(tǒng)計(jì)程序路徑的步驟進(jìn)一步包括針對(duì)分支對(duì)象,在輸入路徑集的每條路徑中記錄該分支名。
34.根據(jù)權(quán)利要求31至33任一權(quán)利要求所述的統(tǒng)計(jì)程序路徑的方法,其特征在于,所述統(tǒng)計(jì)程序路徑的步驟進(jìn)一步包括當(dāng)路徑經(jīng)過含有返回語(yǔ)句的語(yǔ)句塊對(duì)象時(shí),該路徑即結(jié)束。
35.根據(jù)權(quán)利要求31至33任一權(quán)利要求所述的統(tǒng)計(jì)程序路徑的方法,其特征在于,所述統(tǒng)計(jì)程序路徑的步驟進(jìn)一步包括忽略隱藏的對(duì)象及隱藏的對(duì)象的直接或間接子對(duì)象。
36.根據(jù)權(quán)利要求29所述的統(tǒng)計(jì)程序路徑的方法,其特征在于,進(jìn)一步包括權(quán)利要求1所述的步驟C。
37.根據(jù)權(quán)利要求36所述的統(tǒng)計(jì)程序路徑的方法,其特征在于,進(jìn)一步包括畫出程序路徑的步驟。
38.根據(jù)權(quán)利要求37所述的統(tǒng)計(jì)程序路徑的方法,其特征在于,所述畫出程序路徑的步驟具體包括畫出路徑經(jīng)過各分支樹對(duì)象時(shí)的圖示;畫出路徑經(jīng)過各分支對(duì)象時(shí)的圖示;畫出路徑經(jīng)過各語(yǔ)句塊對(duì)象時(shí)的圖示。
全文摘要
本發(fā)明公開了一種程序邏輯結(jié)構(gòu)圖示方法,其技術(shù)方案包括步驟A.生成一個(gè)頂層分支對(duì)象;B.在任意層次的分支對(duì)象中嵌套分支樹對(duì)象和/或語(yǔ)句塊對(duì)象;C.計(jì)算上述各對(duì)象的尺寸及位置并畫出其圖示。本發(fā)明還公開了一種程序路徑統(tǒng)計(jì)方法,其技術(shù)方案是用統(tǒng)計(jì)程序路徑的步驟代替上述技術(shù)方案中的步驟C。本發(fā)明使用結(jié)構(gòu)對(duì)象作為繪圖單位,對(duì)象的尺寸和位置自動(dòng)計(jì)算,可以快速畫出程序邏輯結(jié)構(gòu)圖,該邏輯結(jié)構(gòu)圖可以直觀表現(xiàn)程序的執(zhí)行路徑。本發(fā)明提出的程序路徑統(tǒng)計(jì)方法,自動(dòng)統(tǒng)計(jì)程序路徑,依據(jù)統(tǒng)計(jì)結(jié)果即可設(shè)計(jì)路徑覆蓋測(cè)試用例。
文檔編號(hào)G06F11/36GK1908893SQ200510036190
公開日2007年2月7日 申請(qǐng)日期2005年8月1日 優(yōu)先權(quán)日2005年8月1日
發(fā)明者王彤 申請(qǐng)人:王彤