冼偉成 劉 偉,2 劉宏韜 胡志剛
1(中南大學(xué)軟件學(xué)院 湖南 長沙 410075) 2(湖南中醫(yī)藥大學(xué)管理與信息工程學(xué)院 湖南 長沙 410208)
冪律分布相關(guān)理論研究在自然語言處理和各種自然數(shù)據(jù)分析中已經(jīng)取得較豐碩的成果。眾所周知的8020法則就是冪律分布的一種典型表現(xiàn)形式。在一次軟件工程會議上,人們通過研究發(fā)現(xiàn)“軟件工程研究中,80%的貢獻(xiàn)來自于20%的科研人員”[1],這就是冪律分布存在于軟件工程領(lǐng)域中的一種宏觀表現(xiàn)。如今,在軟件質(zhì)量領(lǐng)域的經(jīng)驗研究中,研究度量結(jié)果中出現(xiàn)的冪律分布特征是其中的一個重要方向。
研究軟件中冪律分布的存在形式,并分析其產(chǎn)生原因,可以從經(jīng)驗研究的角度為軟件質(zhì)量研究提供依據(jù),有助于軟件工程研究人員深入理解影響代碼質(zhì)量的原因。在軟件開發(fā)過程中結(jié)合冪律分布規(guī)律指導(dǎo)開發(fā),有利于提高軟件的可靠性、可維護性,在提升代碼質(zhì)量的同時提高開發(fā)效率。
本文主要對4個大型Java開源項目進行研究,分別對影響軟件質(zhì)量的3個主要度量因子進行度量。利用冪律分布的研究方法對3個度量因子的分布規(guī)律進行研究。本文采用極大似然估計法MLE(Maximum Likelihood Estimate)分別求得各個項目度量因子統(tǒng)計結(jié)果的擬合形狀參數(shù),并使用假設(shè)檢驗對冪律分布的擬合效果進行評價。利用度量因子統(tǒng)計結(jié)果擬合的冪律分布函數(shù),在4個大型Java開源項目中發(fā)現(xiàn)潛在軟件質(zhì)量問題。
在大多數(shù)關(guān)于冪律分布的研究中,將冪律分布分為兩類進行單獨研究:離散型和連續(xù)型。
連續(xù)型冪律分布的概率密度函數(shù)PDF(Probability Density Function):
(1)
當(dāng)α>1和xmin>0時,離散型冪律分布的概率質(zhì)量函數(shù)PMF(Probability Mass Function):
(2)
(3)
式(3)是推廣的zeta函數(shù)。且當(dāng)xmin=1時,ζ(α,1)是標(biāo)準(zhǔn)的zeta函數(shù)。
冪律分布的累積分布函數(shù)有非常簡單的形式,對于連續(xù)型冪律分布的累積分布函數(shù)為:
(4)
(5)
在已有關(guān)于面向?qū)ο筌浖攘恐袃缏煞植佳芯康奈墨I(xiàn)中,絕大部分使用在雙對數(shù)坐標(biāo)系中采用線性擬合來獲得冪律分布的形狀參數(shù)。這種方法是擬合冪律分布函數(shù)最常用的方法,但這種方法存在較大的主觀性且容易出錯。Clauset在文獻(xiàn)[2]中對比了三種冪律分布函數(shù)的擬合方式,文中發(fā)現(xiàn)擬合效果最差的方法是采用雙對數(shù)坐標(biāo)系中線性擬合的方式,而采用極大似然估計法獲得冪律分布函數(shù)的形狀參數(shù)是最可靠的方法。
形狀參數(shù)可以通過極大似然估計法直接求得,對于連續(xù)型冪律分布:
(7)
(8)
離散型冪律分布函數(shù)形狀參數(shù)α值的極大似然估計與連續(xù)型冪律函數(shù)形狀參數(shù)α值近似。
在使用極大似然估計法計算形狀參數(shù)α的時候,需要以一個特定的xmin值作為參數(shù)。因此需要事先求出xmin值才能確定形狀參數(shù)α。文獻(xiàn)研究表明,大部分實際數(shù)據(jù)中只有數(shù)據(jù)的尾部才符合冪律分布情況,隨著xmin值的增長,實驗中被拋棄的數(shù)據(jù)也越來越多。為了使擬合函數(shù)能覆蓋大部分?jǐn)?shù)據(jù),選擇xmin值時需要慎重考慮。
為了精確找到xmin值,本文沒有采用操作方式簡單但容易出現(xiàn)誤差的雙對數(shù)坐標(biāo)圖法。而采用了Clauset提出的一種基于柯爾莫哥洛夫-斯米爾諾夫檢驗(Kolmogorov-Smirnov test,K-S檢驗)的xmin值預(yù)測方法[2]。這種方式將所有x的取值進行遍歷,將每次所取的x值作為xmin,然后找到大于或等于xmin值時實際數(shù)據(jù)和擬合分布函數(shù)的累計分布函數(shù)CDF(Cumulative Distribution Function)值間差的絕對值最大的情況,并將最大值作為此次遍歷的D值。遍歷結(jié)束后找到使D值最小的x作為xmin值。
(9)
S(x)和P(x)分別為實際數(shù)據(jù)和擬合函數(shù)的CDF值(x≥xmin)。這種方法同時適用于對數(shù)正態(tài)分布和冪律分布的xmin值預(yù)測。
在目前的冪律分布相關(guān)研究中,有關(guān)形狀參數(shù)估計的研究沒有考慮檢驗假設(shè)與實際數(shù)據(jù)的擬合程度。因此,其估計結(jié)果并不嚴(yán)格。為了驗證通過極大似然估計方式獲取的形狀參數(shù)是否適用于實際數(shù)據(jù),需要采用假設(shè)檢驗來對分布函數(shù)進行檢驗。有兩種常用的分布函數(shù)擬合優(yōu)度檢驗,一種是Pearson卡方檢驗,另一種是K-S檢驗。雖然Pearson卡方檢驗比較容易實現(xiàn),但是檢驗的可靠性比較差。最終選擇K-S檢驗來對實驗結(jié)果是否滿足冪率分布的情況進行檢驗。
K-S檢驗是建立在以下公式:
K=supx|F*(x)-S(x)|
(10)
式中:F*(x)代表預(yù)先假設(shè)的理論分布函數(shù),S(x)代表樣本的累計概率分布函數(shù)。K-S檢驗統(tǒng)計量的大小反映了假設(shè)分布與經(jīng)驗分布的擬合程度。
本文對冪律分布和對數(shù)正態(tài)分布的擬合優(yōu)度檢驗,引入K-S檢驗統(tǒng)計量,結(jié)合Clauset等提出了一種基于拔靴法的適用于冪律分布函數(shù)和其他擬合函數(shù)的擬合優(yōu)度檢驗方法[2],來驗證上文擬合方法獲得的形狀參數(shù)的估計效果。該方法使用P值來量化假設(shè)的合理性,從而在一定程度上提供對估計結(jié)果可信度的判斷。如果P值大于0.1,則實際數(shù)據(jù)與理論模型產(chǎn)生數(shù)據(jù)之間的差值可以被解釋為統(tǒng)計波動。如果P值接近0,則說明理論模型不能較好地擬合實際數(shù)據(jù),需要使用其他模型來描述實際數(shù)據(jù)。當(dāng)對冪律分布函數(shù)進行假設(shè)檢驗時的假設(shè)為:
H0:實際數(shù)據(jù)產(chǎn)生于冪律分布函數(shù)
H1:實際數(shù)據(jù)并非產(chǎn)生于冪律分布函數(shù)
基于拔靴法的冪律分布假設(shè)檢驗算法如下所示:
冪律分布假設(shè)檢驗算法
1 Calculate point estimates forxminand the scaling parameterα
2 Calculate the Kolmogorov-Smirnov statistic,KSd, for the original data set.
3 Setn1equal to the number of values belowxmin.
4 Setn2=n-n1andP=0.
5 for i in 1:B:
6 Simulaten1values from a uniform distribution: U(1,xmin) andn2values from a power law distribution (with parameterα).
7 Calculate the associated Kolmogorov-Smirnov statistic,KSsim.
8 IfKSd>KSsim,thenP+P+1.
9 end for
10P=P/B.
軟件工程領(lǐng)域的研究者也將冪律分布運用于面向?qū)ο筌浖嚓P(guān)復(fù)雜網(wǎng)絡(luò)的研究中。隨著面向?qū)ο筌浖笮〉脑黾?,研究人員發(fā)現(xiàn),在某些層次中實體間的關(guān)系可以用無標(biāo)度網(wǎng)絡(luò)來進行研究,例如代碼行數(shù)、方法調(diào)用數(shù)和圈復(fù)雜度等。已經(jīng)有研究者在軟件系統(tǒng)中發(fā)現(xiàn)了冪律分布的存在。
馬皖王瑩等將復(fù)雜網(wǎng)絡(luò)的特征度量用于缺陷的預(yù)測研究中,發(fā)現(xiàn)JEdit軟件的源代碼網(wǎng)絡(luò)特征度量符合冪律分布[3]。韓明暢等將復(fù)雜網(wǎng)絡(luò)理論引入人工設(shè)計和實現(xiàn)的軟件中, 把其中的實體和關(guān)系轉(zhuǎn)換成為網(wǎng)絡(luò)拓?fù)涞男问?發(fā)現(xiàn)Java類庫中存在的無尺度特征、小世界現(xiàn)象和脆弱性魯棒性并存的特點[4]。Valverde的研究,使用無標(biāo)度網(wǎng)絡(luò)圖和冪律分布來研究Java和C/C++開源項目中軟件的架構(gòu)情況[5-6],將類作為節(jié)點,類間關(guān)系作為連線,發(fā)現(xiàn)節(jié)點的入度和出度分布情況符合冪律分布。Louridas等[7]將之前的工作進行總結(jié),發(fā)現(xiàn)長尾分布廣泛存在于面向?qū)ο筌浖母鱾€層次結(jié)構(gòu)中,并指出了冪律分布和其他長尾分布在軟件工程中的研究方向。需要指出的是,以上的研究主要使用在雙對數(shù)坐標(biāo)系中采用線性擬合來獲得冪律分布的形狀參數(shù),有可能會造成較大誤差。
將冪律分布在自然語言處理和各種復(fù)雜網(wǎng)絡(luò)分析中的研究方法適當(dāng)改進,運用于在不同層次軟件結(jié)構(gòu)中的面向?qū)ο筌浖攘?。驗證冪律分布在面向?qū)ο筌浖攘恐械拇嬖?,并解釋冪律分布出現(xiàn)的原因,利用擬合的冪律函數(shù)對軟件質(zhì)量改進提供指導(dǎo)。為了減小擬合誤差,本文采用極大似然估計方法獲得冪律分布形狀參數(shù)α,并使用基于K-S檢驗的擬合優(yōu)度檢驗法檢驗擬合效果。
本實驗采用的數(shù)據(jù)集來自Qualitas Corpus項目[8],它是由奧克蘭大學(xué)的Ewan Tempero教授收集整理的軟件系統(tǒng)代碼集。項目的目的是為軟件工程經(jīng)驗研究提供一個可重復(fù)研究的資源。截至到2013年9月,Qualitas Corpus已經(jīng)收集了112個具有代表性的Java軟件系統(tǒng),其中包括著名的Eclipse和NetBeans等。我們選取了其中最具有代表性的4個大型開源項目進行研究,包括Java集成開發(fā)環(huán)境Eclipse、NetBeans,Java運行時環(huán)境JRE(Java Runtime Environment),還有分布式系統(tǒng)基礎(chǔ)架構(gòu)Hadoop。項目說明如表1所示。
表1 實驗項目簡要說明
本文使用研究小組開發(fā)的開源代碼度量工具Perfume[9]對已收集的4個Java開源項目進行度量。Perfume是一款基于抽象語法樹AST(Abstract Syntax Tree)的代碼度量工具。利用AST將源代碼對應(yīng)結(jié)構(gòu)處理成樹狀結(jié)構(gòu),極大提高代碼度量效率。在AST的處理中,將每個Java文件定義為一個編譯單元(Compilation Unit),一個編譯單元中可以存在多個類定義。為了精確獲得每個類的度量值,使用AST中定義的類聲明節(jié)點(TypeDeclaration)作為類的區(qū)分標(biāo)準(zhǔn)。所有針對類的度量值都是針對類申明節(jié)點的度量。Perfume工具支持對28種常見的代碼度量項目進行度量,其中包括經(jīng)典CK度量集等。實驗選取了3個經(jīng)典度量因子,如表2所示。
表2 度量因子簡要說明
本文中度量結(jié)果的統(tǒng)計分析和冪律函數(shù)的擬合與假設(shè)檢驗,使用Gillespie等編寫的 R語言函數(shù)包——PoweRlaw包[10]進行相關(guān)處理。
本文在面向?qū)ο筌浖攘恐械膬缏煞植佳芯窟^程如下,流程圖如圖1所示。
圖1 冪律分布在面向?qū)ο筌浖攘恐械膶嶒灹鞒虉D
第一步在Qualitas Corpus官方網(wǎng)站上下載需要研究的Java開源項目的源代碼。并對源代碼文件進行預(yù)處理,將測試用例文件中會對度量產(chǎn)生影響的源代碼文件刪除。
第二步確定需要研究的面向?qū)ο蠖攘恳蜃?,使用軟件度量工具Perfume對4個開源項目進行度量。將獲得的度量值進行預(yù)處理。對于LOC、NOA和NOM3個度量因子,將度量結(jié)果值為0的類剔除,僅保留度量值大于0的類。
第三步使用基于K-S檢驗的xmin值預(yù)測方法獲得xmin值,利用極大似然估計法求得在xmin值下的冪律函數(shù)形狀參數(shù)α。使用Clauset等提出的擬合優(yōu)度檢驗方法對獲得的冪律函數(shù)的擬合效果進行檢驗。
第四步對于擬合效果較好的度量值進行研究,研究冪律分布在相應(yīng)度量因子中產(chǎn)生的原因。并利用擬合后的冪律函數(shù)找到不符合分布規(guī)律的類,研究其對軟件質(zhì)量的影響。
本節(jié)中,主要對4個具有代表性的大型Java開源項目的面向?qū)ο筌浖攘恐颠M行統(tǒng)計與分析。我們對以上開源項目的3個經(jīng)典度量因子進行度量統(tǒng)計,從統(tǒng)計值中找到一些統(tǒng)計學(xué)規(guī)律。表3展示了一些對于以上開源項目的描述統(tǒng)計結(jié)果。
表3 實驗項目描述統(tǒng)計
代碼行數(shù)是評價軟件質(zhì)量的基礎(chǔ)性度量因子,用于度量軟件的大小。本文中度量的代碼行數(shù)為類代碼行數(shù),但不包括注釋語句和空白行。從描述統(tǒng)計結(jié)果表3中可以發(fā)現(xiàn),4個項目的LOC平均值比較接近,均在130左右。而JRE項目的中位數(shù)為36,其他3個項目均在50以上。而且JRE項目中LOC的最大值6 787也遠(yuǎn)小于其他項目。這可能與項目的類型有關(guān)。從偏度值看出,均存在長尾情況。為了更加清晰地觀察4個項目LOC統(tǒng)計結(jié)果的分布情況,使用互補累計分布函數(shù)CCDF(Complementary Cumulative Distribution Function)圖來描述實際數(shù)據(jù)和擬合情況,如圖2所示。由于冪律分布主要出現(xiàn)在數(shù)據(jù)的尾部,可以發(fā)現(xiàn)擬合的冪律分布的xmin值都比較大,這意味著有大量的數(shù)據(jù)被拋棄,會在一定程度上影響擬合結(jié)果的可靠性,故使用K-S檢驗來驗證。詳細(xì)擬合結(jié)果和假設(shè)檢驗結(jié)果如表4所示??梢詮谋碇锌闯觯薐RE項目以外,其余項目可以較好地擬合對數(shù)正態(tài)分布情況。這與Concas等的研究一致[11]。在數(shù)據(jù)尾部的擬合中,發(fā)現(xiàn)其中3個項目均有冪律分布情況存在。Eclipse和Hadoop項目尾部擬合冪律分布函數(shù)的形狀參數(shù)α值在3.0左右。而在JRE項目中,尾部擬合冪律分布函數(shù)的形狀參數(shù)α為4.5,遠(yuǎn)高于其他項目。在Netbeans項目中沒有在尾部發(fā)現(xiàn)明顯的冪律分布情況。但可以從圖中發(fā)現(xiàn),其尾部數(shù)據(jù)呈現(xiàn)明顯不規(guī)則情況,意味著存在較多代碼行數(shù)偏高的類。
圖2 LOC度量值互補累計分布函數(shù)圖
圖2中,虛線代表使用對數(shù)正態(tài)分布函數(shù)擬合的結(jié)果,實線代表冪律分布函數(shù)擬合的結(jié)果,Xmin_in代表擬合對數(shù)正態(tài)分布的xmin值,Xmin_pl代表擬合冪律分布的xmin值。
表4 LOC度量值擬合結(jié)果
將偏離擬合函數(shù)較多的類單獨進行分析,發(fā)現(xiàn)這些類均在擬合函數(shù)右側(cè),意味著代碼行數(shù)過多。對于NetBeans項目來說,偏離擬合函數(shù)最多的類的全限定名為org.netbeans.modules.css.lib.Css3Parser,總共代碼行數(shù)為36 731行。該類的主要功能是解析Css3文件內(nèi)容,包含有大量的條件語句,類圈復(fù)雜度更是達(dá)到了7 712。這個類職責(zé)過重,將導(dǎo)致系統(tǒng)后期可維護性降低。
從累計分布中可以發(fā)現(xiàn),在Eclipse、JRE和Hadoop項目中80%的類代碼均小于160行,而NetBeans項目明顯高于其他3個項目,達(dá)到了200行。在一個優(yōu)秀的面向?qū)ο筌浖O(shè)計中,設(shè)計人員會使用大量的繼承和關(guān)聯(lián)特性,從而達(dá)到復(fù)用的目的。合理的復(fù)用代碼可以降低系統(tǒng)復(fù)雜程度,并減少代碼行數(shù)。
類方法屬性個數(shù),代表每個類中屬性值的個數(shù)。從表3中可以發(fā)現(xiàn),4個項目方法屬性個數(shù)中位數(shù)均為3,且存在較明顯的長尾分布情況。在最大值方面,Eclipse和NetBeans兩個編譯器的最大值均在2 000以上,遠(yuǎn)高于JRE和Hadoop項目的最大值。在Eclipse項目中,最高值2 042存在于一個核心功能類中,全限定名為org.eclipse.swt.internal.win32.OS,用于兼容各種版本W(wǎng)indows操作系統(tǒng)外觀。而在NetBeans項目中,最高值2 021在全限定名為org.netbeans.modules.css.lib. Css3Parser的類中,這個類在LOC的度量中也是最高的。從表5中可以發(fā)現(xiàn),4個項目均比較好地擬合冪律分布函數(shù)。在對數(shù)正態(tài)分布函數(shù)的擬合中,除了Eclipse項目外其他3個項目均得到很好的效果。在Eclipse和JRE兩個項目中,尾部擬合的冪律分布函數(shù)形狀參數(shù)α在2.25到2.46之間,而在NetBeans和Hadoop項目中,尾部擬合冪律分部函數(shù)的形狀參數(shù)α在3.37到3.40之間。觀察圖3可以發(fā)現(xiàn),在4個項目中均有偏離擬合函數(shù)較大的點存在,這些點的值往往大大高于平均值。在Hadoop項目中,偏離擬合函數(shù)最多的3個類為DFSConfigKeys、YarnConfiguration、CommonConfigurationKeysPublic,3個類中類屬性個數(shù)為586、423和116。這些類均是用于保存Hadoop中的配置常量的??梢院苊黠@地發(fā)現(xiàn),這些用于存儲配置常量的類均不是我們面向?qū)ο笾袀鹘y(tǒng)意義的類,可以使用其他方式將屬性值單獨存儲。
圖3 NOA度量值互補累計分布函數(shù)圖
項目名稱擬合分布參數(shù)參數(shù)值xmin覆蓋類數(shù)P值Eclispepowerlawlog-normalαμσ2.4554320.6054261.4011551122150119650.170.00Hadooppowerlawlog-normalαμσ3.3944230.4824171.2730203135621210.810.61JREpowerlawlog-normalαμσ2.2576331.3484051.47515520143645330.260.47NetBeanspowerlawlog-normalαμσ3.3774600.9520821.075416281631309130.690.13
類方法個數(shù)是指一個類中所包含的全部方法的個數(shù),但不包含內(nèi)部類和匿名類中的方法。這是一種CK度量集中的因子,可用于對大型軟件的質(zhì)量和缺陷進行預(yù)測。在表3中可以發(fā)現(xiàn),被統(tǒng)計項目的偏度值明顯偏高,說明存在長尾分布的特點。為了研究類方法個數(shù)的分布情況,使用對數(shù)正態(tài)分布和冪律分布對數(shù)據(jù)進行了函數(shù)擬合。擬合結(jié)果如表6所示,這4個Java大型開源項目的類方法個數(shù)統(tǒng)計值在尾部均呈現(xiàn)冪律分布,其中Hadoop項目符合冪律分布的數(shù)據(jù)量最多,共有占全部統(tǒng)計值的42.7%。而其余3個項目只有4%左右的數(shù)據(jù)符合。在尾部冪律分布中,形狀參數(shù)α在3.28到3.48之間。
表6 NOM度量值擬合結(jié)果
圖4展示了實際數(shù)據(jù)的累積分布函數(shù)。在累計分布函數(shù)圖上,4個大型Java開源項目在圖像上可獲得看似較好的擬合結(jié)果。為了驗證兩種擬合函數(shù)的擬合效果,使用K-S檢驗分別對擬合函數(shù)進行檢驗。從K-S檢驗結(jié)果可以看出,這4個Java開源項目的類方法個數(shù)統(tǒng)計結(jié)果均在尾部均發(fā)現(xiàn)了冪律分布。雖然在圖形上看起來對數(shù)正態(tài)分布的擬合曲線擬合的情況較好,但通過K-S檢驗我們可以發(fā)現(xiàn),只有在Hadoop項目中發(fā)現(xiàn)了較明顯的對數(shù)正態(tài)分布情況,其他3個項目均未通過檢驗。
圖4 NOM度量值互補累計分布函數(shù)圖
對于一個面向?qū)ο蟪绦騺碚f,類方法數(shù)量越多代表類的職責(zé)越重,會導(dǎo)致該類與其他類間過高的耦合度,從而影響代碼質(zhì)量。可以從累計分布圖中發(fā)現(xiàn),4個項目中80%的類中均少于12個方法。Eclipse、Hadoop和NetBeans項目中99%的類方法個數(shù)小于60,
而JRE項目中這個值達(dá)到了74。這可能和軟件類型有關(guān)系,JRE比起一般應(yīng)用程序來說,它作為Java語言的API需要向外部提供了更多的入口,也就是公共方法。通過觀察圖4可以發(fā)現(xiàn),JRE項目中存在較多方法數(shù)量過高的類。查看具體類發(fā)現(xiàn),JRE中方法數(shù)排名前5的類中,有3個是用于封裝異常處理方法的類,且都來自包com.sun.corba.se.impl.logging。值最高的類ORBUtilSystemException中方法數(shù)達(dá)到1 259個。而在NetBeans項目中,值最高的類含有406個方法,類全限定名為org.netbeans.lib.ddl.adaptors.DefaultAdaptor,類的功能是數(shù)據(jù)庫適配器。過多的方法會導(dǎo)致代碼味道的產(chǎn)生,也會影響軟件的復(fù)用和可維護性。
以上研究中發(fā)現(xiàn),在4個大型Java開源項目的面向?qū)ο筌浖攘恐?,絕大多數(shù)類度量因子的值處在一個較低的水平,而只有極少數(shù)類的度量因子的值相當(dāng)大,屬于典型的長尾分布特征。經(jīng)過相關(guān)擬合與假設(shè)檢驗,發(fā)現(xiàn)在4個項目中,冪律分布是產(chǎn)生長尾現(xiàn)象的原因之一。軟件開發(fā)作為一種智慧密集型工作,存在大量人為因素從而影響軟件開發(fā)過程,所以不能用一個統(tǒng)一的模型來描述不同軟件的度量因子統(tǒng)計結(jié)果。甚至有些項目無法找到一個合理的模型來描述。但是在同一個軟件開發(fā)過程中,開發(fā)人員總是按照相同的設(shè)計框架進行開發(fā),這在一定程度上確定了各種代碼度量因子的增長模型。在對度量統(tǒng)計結(jié)果擬合冪律分布函數(shù)后,如發(fā)現(xiàn)有偏離擬合函數(shù)較大的度量結(jié)果出現(xiàn),基本可以判斷是存在不符合本項目設(shè)計框架的代碼出現(xiàn)。例如在NetBeans項目中的Css3Parser類,LOC和NOA的度量值都極大偏離擬合的冪律函數(shù),這說明Css3Parser類的設(shè)計不符合面向?qū)ο筌浖O(shè)計要求。
長尾現(xiàn)象不管是由冪律分布產(chǎn)生,還是由對數(shù)正態(tài)分布產(chǎn)生,或是其他的分布函數(shù)產(chǎn)生。長尾現(xiàn)象對軟件工程來說,都是一個值得進行研究的課題。因為長尾現(xiàn)象的存在說明少數(shù)的類在軟件開發(fā)中起到重要作用,而這些類的代碼質(zhì)量直接決定了軟件的可靠性和可維護性。在開發(fā)中提高這些類質(zhì)量,有利于軟件整體質(zhì)量的提高。
[1] Boehm B.Industrial Software Metrics Top 10 List[J].IEEE Software,1987,4:84-85.
[2] Clauset A,Shalizi C R,Newman M E J.Power-Law Distributions in Empirical Data[J].Siam Review,2014,51(4):661-703.
[3] 馬皖王瑩,陳林,陳芝菲,等.基于復(fù)雜網(wǎng)絡(luò)分析的軟件高危缺陷評估方法[J].計算機科學(xué)與探索,2014,8(8):956-965.
[4] 韓明暢,李德毅,劉常昱,等.軟件中的網(wǎng)絡(luò)化特征及其對軟件質(zhì)量的貢獻(xiàn)[J].計算機工程與應(yīng)用,2006,42(20):29-31.
[5] Valverde S,Sole R V.Hierarchical Small Worlds in Software Architecture[J].Dynamics of Continuous Discrete & Impulsive Systems,2007,14.
[6] Valverde S,Cancho R F I,Sole R V.Scale-free Networks from Optimal Design[J].Epl,2002,60(4):512-517.
[7] Louridas P,Spinellis D,Vlachos V.Power Laws in Software[J].ACM Transactions on Software Engineering & Methodology,2008,18(1):617-632.
[8] Tempero E,Anslow C,Dietrich J,et al.The Qualitas Corpus:A Curated Collection of Java Code for Empirical Studies[C]//Asia Pacific Software Engineering Conference.IEEE Computer Society,2010:336-345.
[9] Liu Hongtao.Perfume:A code quality assessment platform based on machine learning[EB/OL].https://github.com/LiuHongtao/Perfume.
[10] Gillespie C S.Fitting Heavy Tailed Distributions:The poweRlaw Package[J].Journal of Statistical Software,2015,64(2).
[11] Concas G,Marchesi M,Pinna S,et al.Power-Laws in a Large Object-Oriented Software System[J].IEEE Transactions on Software Engineering,2007,33(10):687-708.