朱云娜
(遼寧廣播電視大學(xué) 110034)
在軟件工程與技術(shù)領(lǐng)域中,傳統(tǒng)的軟件度量技術(shù)與面向?qū)ο蟮能浖攘考夹g(shù)之間,最大的不同之處主要表現(xiàn)在面向?qū)ο蟮亩攘考夹g(shù)在實(shí)現(xiàn)定量測量的過程中,需要對于類之間的耦合程度以及類的復(fù)雜度、內(nèi)聚力、繼承層次復(fù)雜度等進(jìn)行研究。在面向?qū)ο蟮能浖攘矿w系中,雖然能夠應(yīng)用傳統(tǒng)方法進(jìn)行軟件體系中某一模塊復(fù)雜度的定量測量與度量實(shí)現(xiàn),但是對于軟件體系中的某些定義的還需要進(jìn)行補(bǔ)充。結(jié)合當(dāng)前軟件工程以及技術(shù)的發(fā)展應(yīng)用情況,國內(nèi)外已經(jīng)存在有一些進(jìn)行計(jì)算機(jī)程度復(fù)雜度計(jì)算應(yīng)用的軟件工具,像SafePro/Eval等軟件工具就能夠?qū)崿F(xiàn)對于C++以及ADA等語言程序中McCabe以及Halstead、MOOSE、MOOD等計(jì)算機(jī)程序復(fù)雜度的計(jì)算測量。此外,在軟件工具的設(shè)計(jì)開發(fā)中,通過應(yīng)用CK度量套件中的度量方法,并利用Delphi進(jìn)行設(shè)計(jì)開發(fā)出針對Java語言程序的度量工具,在我國也有實(shí)現(xiàn),同時,再加上我國這一時期設(shè)計(jì)開發(fā)出的通過VC++的應(yīng)用進(jìn)行McCabe、Halstead復(fù)雜度的軟件工具,這兩種軟件工具均在不具有跨平臺性的情況下,都涉及到對于計(jì)算機(jī)數(shù)據(jù)庫的相關(guān)操作。最后,在這一時期,國外的Shimba以及Jstyle則是針對Java語言程序的開發(fā)設(shè)計(jì)的兩個度量工具,在實(shí)際應(yīng)用中具有不能夠?qū)崿F(xiàn)Halstead復(fù)雜度計(jì)算的局限性。
在面向?qū)ο蟮能浖攘考夹g(shù)中,面向?qū)ο蟪绦虻幕締挝皇穷?,因此,在面向?qū)ο蟮亩攘坑?jì)算中,主要是進(jìn)行類的規(guī)模以及類的層次、類的協(xié)作、個體類的度量計(jì)算。通常情況下,在進(jìn)行程序規(guī)模的度量計(jì)算中多采用行數(shù)度量法;對于類之間的繼承層次復(fù)雜性度量計(jì)算,則多采用DIT以及NOC度量法進(jìn)行度量計(jì)算;對于類之間的通信復(fù)雜性則多是采用RFC度量法進(jìn)行度量計(jì)算;此外,對于類的邏輯復(fù)雜性的度量計(jì)算則采用的是WMC度量法;最后,應(yīng)用McCabe以及Halstead度量法進(jìn)行方法復(fù)雜性的度量計(jì)算。
首先,在進(jìn)行程序規(guī)模的度量中,主要是通過對于程序規(guī)模的度量,實(shí)現(xiàn)對于程序復(fù)雜性的度量評價,通常情況下,多采用的是行數(shù)度量法,也就是通過對于程序的源代碼行數(shù)情況進(jìn)行統(tǒng)計(jì),實(shí)現(xiàn)對于程序規(guī)模以及程序復(fù)雜性的度量。通常情況下,在相關(guān)研究中顯示,小于100條語句的小程序出錯率與可執(zhí)行代碼的行數(shù)之間具有一定的線性關(guān)聯(lián),往往隨著程序的增大,程序出錯率會呈現(xiàn)出非線性增長變化。因此,使用行數(shù)度量法能夠非常直觀的實(shí)現(xiàn)對于程序規(guī)模與復(fù)雜性的度量。
其次,在進(jìn)行類之間的繼承層次復(fù)雜性度量計(jì)算中,Java語言程序?qū)τ陬愔g的繼承層次要求使用單繼承機(jī)制實(shí)現(xiàn),也就是說Java語言程序中,類繼承樹都只存在有一個根結(jié)點(diǎn),不管是J2SE提供的類,還是程序員開發(fā)設(shè)計(jì)的類都繼承于這個根結(jié)點(diǎn)。由于在進(jìn)行類之間的繼承層次復(fù)雜性度量計(jì)算中,主要是進(jìn)行程序開發(fā)員所開發(fā)程序的復(fù)雜度度量計(jì)算,因此,多使用DIT以及NOC兩種度量方法進(jìn)行類之間繼承層次復(fù)雜度的計(jì)算,其中,DIT度量法主要是進(jìn)行繼承樹的深度度量計(jì)算,也就是進(jìn)行從結(jié)點(diǎn)到樹根之間最大距離的度量計(jì)算;而NOC度量法則是進(jìn)行直接從屬于某類的子類總數(shù)的度量計(jì)算。
再次,在進(jìn)行類之間的通信復(fù)雜性度量計(jì)算中,類的響應(yīng)集合RFC通常多包含類中被調(diào)用的其他類的方法,能夠?qū)崿F(xiàn)對于潛在類之間的通信度量,因此,對于類之間的通信復(fù)雜度多使用RFC度量法進(jìn)行計(jì)算。具體度量計(jì)算過程如下,假設(shè)某類的方法為M1、M2、M3……Mn,{Ri}表示某類中方法i調(diào)用的方法集合,{M}表示某類的所有方法的集合,則有RS={M}∪alli{Ri};RFC=|RS|。
在進(jìn)行類的邏輯復(fù)雜性的度量計(jì)算中,類的加權(quán)方法數(shù)WMC主要是對于類所包含的方法數(shù)的體現(xiàn)與反映,或者是對于類之間方法的邏輯復(fù)雜性進(jìn)行度量,因此,對于類之間的邏輯復(fù)雜性的度量計(jì)算多是采用WMC度量法進(jìn)行。
最后,在進(jìn)行方法的邏輯復(fù)雜性度量計(jì)算中,多是使用McCabe以及Halstead度量法進(jìn)行度量計(jì)算。首先,McCabe度量法在進(jìn)行方法的邏輯復(fù)雜性度量計(jì)算中,是通過模塊的控制流量圖,實(shí)現(xiàn)對于模塊結(jié)構(gòu)復(fù)雜性的度量確定,主要是通過下列計(jì)算公式(1)進(jìn)行度量計(jì)算實(shí)現(xiàn)。
在上述計(jì)算公式中,V(G)表示的是強(qiáng)連通有向圖G中的環(huán)數(shù)情況,m則表示G中的弧數(shù),n表示G中的結(jié)點(diǎn)數(shù),p則是G中強(qiáng)連通分量的個數(shù)。其次,應(yīng)用Halstead度量法進(jìn)行方法的邏輯復(fù)雜性度量計(jì)算時,Halstead軟件工具主要是進(jìn)行軟件規(guī)模的度量,也就是根據(jù)軟件的詞匯量的相關(guān)信息進(jìn)行軟件長度的預(yù)測,從而實(shí)現(xiàn)對于軟件級別等的度量實(shí)現(xiàn)。應(yīng)用Halstead度量法進(jìn)行度量計(jì)算中,主要是根據(jù)Halstead度量軟件工具中的一系列度量值,通過軟件程序代碼中出現(xiàn)的不同操作符個數(shù)以及不同操作數(shù)個數(shù)、操作符總數(shù)、操作數(shù)總數(shù)等參數(shù),根據(jù)計(jì)算公式進(jìn)行度量計(jì)算。
本文中所分析探討以及設(shè)計(jì)實(shí)現(xiàn)的Java程序度量工具是在對于SafePro/Eval所支持開發(fā)的度量工具以及測試工具QE-SAT的集成應(yīng)用上設(shè)計(jì)實(shí)現(xiàn)的,其中,QE-SAT工具能夠?qū)τ贘ava程序項(xiàng)目中的源代碼進(jìn)行分析,并實(shí)現(xiàn)動態(tài)以及靜態(tài)的測試。在QESAT工具對于Java程序項(xiàng)目源代碼的靜態(tài)以及動態(tài)測試中,靜態(tài)測試是進(jìn)行被測試程序的程序結(jié)構(gòu)以及復(fù)雜度信息的分析,而動態(tài)測試則是進(jìn)行程序項(xiàng)目源代碼中語句以及分支、方法、類的覆蓋等測試實(shí)現(xiàn),同時動態(tài)測試還能夠?qū)崿F(xiàn)對于程序執(zhí)行頻度的分析測試。Java程序度量工具在通過上述設(shè)計(jì)組成工具的度量計(jì)算后,將計(jì)算所得的復(fù)雜度信息顯示在QE-SAT工具中的圖形顯示界面中,以實(shí)現(xiàn)對于Java程序結(jié)構(gòu)與復(fù)雜度的度量測試。如下圖1所示,為Java程序度量工具中靜態(tài)分析器的結(jié)構(gòu)示意圖。
圖1 Java程序度量工具中靜態(tài)分析器的結(jié)構(gòu)示意圖
根據(jù)上示靜態(tài)分析器的總體結(jié)構(gòu)示意圖可以看出,Java程序度量工具中的靜態(tài)分析器主要由Java語法分析器以及符號表、復(fù)雜度信息分析器、語法樹四個結(jié)構(gòu)部分組成。Java程序度量工具在度量計(jì)算中,Java程序中的源文件在通過語法分析器進(jìn)行分析后,形成符號表以及語法樹,然后再通過復(fù)雜度信息分析器對于語法樹的各節(jié)點(diǎn)進(jìn)行分析,同時根據(jù)符號表中相關(guān)的標(biāo)識符的相關(guān)定義信息,將分支作為基本單元結(jié)構(gòu)對于其中的變量操作信息進(jìn)行提取,以實(shí)現(xiàn)對于程序結(jié)構(gòu)與復(fù)雜度的度量計(jì)算,計(jì)算結(jié)果將以XML格式存入到計(jì)算機(jī)的信息庫中,以輸出應(yīng)用。在Java程序度量工具中,靜態(tài)分析器中的語法分析器是基于Java語言并根據(jù)相關(guān)語法自動生成的一種語法分析器,在對于這種自動生成語法分析器修改的基礎(chǔ)上,最終形成靜態(tài)分析器中的語法分析器。
Java程序度量工具在進(jìn)行代碼分析時具有較為突出的輔助作用,下文將以Java程序度量工具對于QE-SAT測量工具中jstaticdata數(shù)據(jù)包源代碼的分析為例,進(jìn)行探討說明。為運(yùn)行QE-SAT工具情況下,對被測數(shù)據(jù)包中的源代碼靜態(tài)分析后,生成信息顯示界面。在上述QE-SAT靜態(tài)分析器分析顯示的結(jié)果中,用戶在項(xiàng)目視圖或者是類視圖中進(jìn)行類或者是方法的名稱選擇,就能夠通過信息視圖得知所選擇的類與方法的相對應(yīng)各種度量值。
總之,Java程序度量工具在進(jìn)行軟件程序開發(fā)設(shè)計(jì)中,具有幫助程序員分析代碼、及時發(fā)現(xiàn)軟件程序代碼中的問題,實(shí)現(xiàn)程序的優(yōu)化,因此,進(jìn)行Java程序度量工具的實(shí)現(xiàn)以及案例探討,具有積極的作用與價值意義。
[1]王樹森,顧慶,陳燾,陳道蓄.基于復(fù)雜網(wǎng)絡(luò)的大型軟件系統(tǒng)度量[J].計(jì)算機(jī)科學(xué).2009(2).
[2]姜元鵬,張永平,姜淑娟.測試Java異常處理機(jī)制的方法[J].計(jì)算機(jī)工程與設(shè)計(jì).2010(20).
[3]黃沛杰,楊銘銓.代碼質(zhì)量靜態(tài)度量的研究與應(yīng)用[J].計(jì)算機(jī)工程與應(yīng)用.2011(23).
[4]徐軍,張嬡,葉澄清.Java多線程動態(tài)測試中的插裝[J].計(jì)算機(jī)工程與應(yīng)用.2011(19).
[5]李必信,楊朝暉,譚毅,朱平,李宣東,鄭國梁.一種基于切片技術(shù)度量Java耦合性的框架[J].計(jì)算機(jī)學(xué)報(bào).2011(3).