任 武
上海立信會計金融學院,上海 201620
軟件架構(gòu)是系統(tǒng)設(shè)計、維護以及程序理解活動的一項重要制品。對于大型遺留軟件系統(tǒng)而言,由于不斷的功能變遷和版本演化,原有的架構(gòu)文檔經(jīng)常缺乏必要的更新而變得過時。通過源代碼分析獲取系統(tǒng)的功能結(jié)構(gòu)成為程序理解的一種可靠來源[1-3]。在這種情況下,維護人員通常采用聚類的方法將系統(tǒng)劃分為更小和更易于控制的子系統(tǒng),使得同一子系統(tǒng)中的對象比在不同子系統(tǒng)中的對象有更高的相似性,這種利用軟件聚類將程序元素作為組件結(jié)合在一起,是從底層源代碼中獲取高層結(jié)構(gòu)視圖的一項重要技術(shù)[4-6]。
傳統(tǒng)的聚類在軟件維護方面主要采用靜態(tài)分析技術(shù)。靜態(tài)技術(shù)使用的兩種主要信息類型是結(jié)構(gòu)(程序元素間依賴和繼承關(guān)系)和語義(代碼的注釋和標識符)。使用靜態(tài)源代碼進行軟件聚類的優(yōu)點是自動化程度高,但局限性之一是靜態(tài)方法通常只使用程序元素的相似類型估算待聚類的程序元素之間的距離[7]。例如,僅使用從代碼注釋和標識符提取的文本(詞法)的聚類方法[8-9]或者僅使用文件/類名稱[10-11],或基于控制和數(shù)據(jù)流圖的依賴特征[12-14],條件是需要足夠的輸入來處理,且系統(tǒng)遵循“高內(nèi)聚、低耦合”的基本原則進行良好設(shè)計[4],以及代碼標識符命名具有良好的質(zhì)量和規(guī)范等。另一方面,面向?qū)ο笙到y(tǒng)由于存在多態(tài)和動態(tài)綁定等因素,使得在功能架構(gòu)的恢復中,需要考慮系統(tǒng)的運行時特性。
為了理解行為系統(tǒng)屬性,動態(tài)信息更具有相關(guān)性[15]。一些信息恢復方法使用單獨的動態(tài)信息[16-17],動態(tài)分析通過執(zhí)行特征獲取系統(tǒng)的運行時事件。功能特征是構(gòu)成實現(xiàn)其組件實體的自然聚類,根據(jù)系統(tǒng)的不同的特征,將各個系統(tǒng)組件聚合在一起實現(xiàn)各自的特定功能,反映了軟件系統(tǒng)構(gòu)件化組裝的思想,因此基于特征的聚類恢復架構(gòu)方法是可行的。而實現(xiàn)基于特征的聚類,首先需要建立特征和代碼實體的對應關(guān)系,動態(tài)分析成為解決這個問題的一種可靠方式。但動態(tài)分析也有其局限性:第一,動態(tài)執(zhí)行跡通常所含事件數(shù)量巨大。第二,動態(tài)架構(gòu)恢復需要功能全面且平衡的測試用例或場景集來支持。因此,動態(tài)和靜態(tài)分析各有其優(yōu)缺點。作為解決這個問題的一種方法,Pollet等人[12]強調(diào)需要使用多個輸入源來實現(xiàn)架構(gòu)恢復。Scanniello等人[13]使用詞法和結(jié)構(gòu)如依賴和繼承信息來解決源代碼中的概念定位問題。Mancoridis等人[14]使用結(jié)構(gòu)和詞法文本特征來提取應用程序的分層體系結(jié)構(gòu)。Greevy等人[18]介紹了一個基于動態(tài)分析的特征驅(qū)動的方法,通過提取跟蹤來獲取特征和軟件實體的明確映射關(guān)系。Eisenbarth等人[19]表明確定代碼對應關(guān)系的可靠的方式是通過運行相關(guān)的特征和分析收集的事件執(zhí)行跡。由于動態(tài)分析的前提是設(shè)置與特征有關(guān)的用例并運行,因此動態(tài)分析收集的事件概念容易與特征建立起關(guān)聯(lián)。在動態(tài)分析方面,已經(jīng)有大量的研究工作[15,20-26],但多集中在特征定位和軟件模式[27-28]方面,將動態(tài)分析應用到聚類的架構(gòu)恢復方面的研究目前還比較欠缺。
在上述研究的基礎(chǔ)上,本文提出將靜態(tài)和動態(tài)分析結(jié)合起來的分階段聚類方法,以軟件特征作為聚類標準來構(gòu)建系統(tǒng)的框架劃分。為提高動態(tài)分析的效率,利用語義信息在數(shù)據(jù)處理方面的優(yōu)勢,將動態(tài)獲取的“實體-特征”矩陣作為“詞項-文檔”矩陣處理。通過TF-IDF(term frequency-inverse document frequency)方式設(shè)置關(guān)鍵詞項權(quán)重值,創(chuàng)建潛在語義索引(latent semantic indexing,LSI)空間,計算SVD(singular value decomposition)近似值以替換完整的“詞項-文檔”矩陣。結(jié)合動態(tài)跟蹤與靜態(tài)結(jié)構(gòu)分析,使用系統(tǒng)依賴信息進行軟件聚類。雖然現(xiàn)有多種聚類方法[4-5]是半自動的或自動化的,但仍需要與維護人員相互作用的改進反饋過程才能達到令人滿意的最終結(jié)果[15,22,29]。為此,利用代碼的靜態(tài)依賴圖,以及動態(tài)調(diào)用圖,構(gòu)建完整的類依賴關(guān)系,反饋到特征和場景設(shè)計步驟,補充完善已建立的框架,以達到結(jié)構(gòu)恢復的目的。
軟件聚類和系統(tǒng)結(jié)構(gòu)的恢復作為軟件領(lǐng)域的研究熱點,已經(jīng)有大量的研究工作:Mancoridis等人[4]提出一種優(yōu)化目標函數(shù)的圖聚類方法,其目標是找到高內(nèi)聚和低耦合模塊化聚類。Corazza等人[30]在源代碼中定義了類名稱、屬性名稱、方法名稱、參數(shù)名稱、注釋等不同區(qū)域,然后利用區(qū)域的權(quán)重計算源代碼類之間的相似關(guān)系并聚類。該方法主要是通過語義詞匯建立實體的關(guān)聯(lián)。Kuhn等人[8]描述了一種基于潛在語義索引的方法。該方法是獨立于語言的,并對具有相似術(shù)語的源代碼實體進行分組。但沒有考慮建立代碼實體之間的對應關(guān)系。Dugerdil[31]提出使用執(zhí)行跡作為抽樣數(shù)據(jù)的依據(jù)進行逆向架構(gòu)的恢復過程,這與本文動態(tài)分析方法相類似,但抽樣數(shù)量對實驗結(jié)果影響較大,且缺乏較高層的抽象概念如特征或模式等作為聚類標準。Tzerpos等人[32]提出一種增量聚類算法模擬工程構(gòu)建子系統(tǒng)的模式,與本文基于特征實現(xiàn)方法不同,該算法是基于模式的抽象概念來構(gòu)建框架,在實現(xiàn)上依賴于前期初始條件的輸入。
本文的結(jié)構(gòu)恢復方法的流程如圖1所示。主要分為兩個階段:第一階段,執(zhí)行特征場景獲取動態(tài)事件執(zhí)行跡,利用k-means聚類建立系統(tǒng)的核心架構(gòu);第二階段,根據(jù)收集到的執(zhí)行跡,分析特征執(zhí)行跡中的各個實體間的動態(tài)依賴關(guān)系。將與特征相關(guān)的未執(zhí)行的代碼實體(如類或方法等),比較語義相似度,確定是否需要歸類到對應的簇中。通過迭代補充場景和特征的方式,逐步恢復已建立的框架結(jié)構(gòu)。
Fig.1 Structure recovery approach圖1 結(jié)構(gòu)恢復方法
通過分析系統(tǒng)的源代碼結(jié)構(gòu)、系統(tǒng)的需求文檔和在線幫助,調(diào)查相關(guān)應用領(lǐng)域中的類似系統(tǒng)等方式,可以確定軟件系統(tǒng)的特征。選擇具有軟件特征的任務執(zhí)行方案的場景描述稱為特征的特定場景。通過執(zhí)行特定場景,可以快速地獲取特征和代碼的映射關(guān)系。例如,有一項任務,需要修改應用程序的“print”功能,但是對于許多軟件系統(tǒng)來說,依靠研究源代碼很難發(fā)現(xiàn)所有與“print”特征相關(guān)的代碼部分,因為實現(xiàn)一個特征可能涉及多個類或模塊。而通過設(shè)置程序的代碼插裝并執(zhí)行該特征,就可以分析執(zhí)行跡確定出代碼的哪些部分由該特征執(zhí)行,從而降低了定位任務的復雜性。在特征執(zhí)行時,會產(chǎn)生一系列運行事件稱為執(zhí)行跡,事件包括對象的建立和刪除、方法的調(diào)用等。執(zhí)行跡中的實體,可以選擇不同的粒度來表示(如方法或類)。本文選擇類實體作為分析的對象,因為類的粒度較大,通常一個類用一個源文件表示,類的行為特征通過類中各方法的調(diào)用和依賴等關(guān)系表現(xiàn)出來。
通過設(shè)置標記插裝代碼和收集調(diào)用實體來獲取特征執(zhí)行跡,會產(chǎn)生一系列方法調(diào)用的entry/exit列表,為了使生成的大量的跟蹤數(shù)據(jù)易于分析,在預處理步驟中,通常移除由程序循環(huán)引起的所有冗余調(diào)用。對于在執(zhí)行跡中大量的與特征無關(guān)的公共實體,使用類似TF/IDF的方法對收集的實體設(shè)置權(quán)重值加以區(qū)別[33]。其中,詞項(term)用于對應執(zhí)行跡中的調(diào)用實體,詞頻(frequency)是該實體調(diào)用的次數(shù),文檔(document)對應每條執(zhí)行跡,預處理用于獲取“詞項-文檔”矩陣和詞頻率-逆文檔頻率,每對(詞項,文檔)值設(shè)置如下的相關(guān)的權(quán)重:
通常使用聚類的非極端分布(non-extreme distribution,NED)值作為評價一個聚類算法質(zhì)量的指標。一般評價認為當聚類數(shù)小于5或大于20屬于極端值,都是不合理的。NED值越大,表示非極端的聚類分布越好。
式(2)中,c是劃分C中的一個簇,|c|表示c的基數(shù),N是所分析系統(tǒng)的軟件實體的數(shù)量,NED的值大小介于(0,1)之間,越接近于1表示聚類的實體分布越合理。根據(jù)NED的聚類分布要求,輸入是動態(tài)產(chǎn)生的特征-實體文檔集,輸出是按NED最大的實體集劃分。
算法1劃分算法(partitioning algorithm)
在算法1中,第1~3句是計算“詞項-文檔”矩陣,根據(jù)式(1)求出TF-IDF值,基于LSI計算“詞項-文檔”轉(zhuǎn)置矩陣的相異度。第5~10句執(zhí)行k-means算法,迭代移動各個簇的記錄的均值中心點,直到收斂,并比較NED值的大小,返回最大的NED函數(shù)值的劃分。
分析源代碼程序控制流程圖,可以建立代碼實體之間的調(diào)用依賴關(guān)系,而數(shù)據(jù)流程圖則反映出系統(tǒng)的業(yè)務關(guān)系。
定義1(調(diào)用依賴性) 設(shè)場景中包含的特征以及調(diào)用序列構(gòu)成二維矩陣,R2?S×(M×M),(si,p,q)∈R2,?p,q∈si&&p→q,表示在場景Si實體p一次或多次調(diào)用另一個實體q。
定義2(系統(tǒng)類之間依賴關(guān)系) 設(shè)C(s)是系統(tǒng)類的集合,R(C)表示類的依賴關(guān)系,結(jié)構(gòu)類的依賴性包括類的繼承、聚合和類的方法調(diào)用集合等,則實體p與實體q的結(jié)構(gòu)類的依賴性定義為:
根據(jù)定義1,在動態(tài)調(diào)用的實體間進行擴展,構(gòu)建類的動態(tài)依賴圖,靜態(tài)依賴圖則需要通過源代碼分析獲取。根據(jù)定義2,需要考慮在兩個類之間各種可能的關(guān)系,如方法調(diào)用、泛化關(guān)系、實現(xiàn)關(guān)系等。在具體分析中,不是考慮所有的實體類型,而是只考慮在執(zhí)行跡中出現(xiàn)的與特征相關(guān)的實體,查找其對應的依賴圖。依賴圖分析檢查與特征相關(guān)的實體未被調(diào)用的情況,同時,也用于反饋到場景設(shè)計過程[34-37]。通過迭代補充相關(guān)的場景和特征,完善已經(jīng)建立的框架結(jié)構(gòu)。系統(tǒng)類依賴圖用節(jié)點和邊表示,節(jié)點代表類,邊代表依賴關(guān)系,示例如圖2所示。
Fig.2 Dynamic and static class dependency graph圖2 動態(tài)和靜態(tài)的類依賴圖
在圖2中,左圖表示執(zhí)行跡特征feature1獲得的類的動態(tài)依賴圖,右圖為通過靜態(tài)分析得到的依賴關(guān)系圖。假設(shè)所有的動態(tài)依賴關(guān)系在靜態(tài)依賴圖中都有對應。如在特征feature1中,如果存在動態(tài)依賴,并且經(jīng)過靜態(tài)結(jié)構(gòu)分析,各相關(guān)的類均包含在特征中,那么表示對應特征和場景已經(jīng)設(shè)置,不再進一步分析。如果在特征feature1中,類之間存在靜態(tài)依賴關(guān)系,同時存在沒有被該特征動態(tài)調(diào)用的類,那么對應如下三種情況:(1)類C3依賴類C5,但類C5不在特征feature1范圍中,這表明在feature1的特征實現(xiàn)集中缺少類C5的可能性,建議準備一個額外的場景來包含類C5的調(diào)用S=S∪{Snew}。(2)類C6依賴類C1,但類C6不在特征feature1范圍中。這表明被調(diào)用者可能是feature1的入口點,如果類C6未被分類到任何特征中,則可能存在當前場景中缺失的新特征F=F∪{Fnew}。(3)類C2和類C4都在特征feature1中,但并沒有動態(tài)依賴,表明需要建立一個新的場景來觸發(fā)其依賴關(guān)系。
可見,通過類依賴圖的分析,可以獲取特征和場景補充的建議,如根據(jù)對應的實體,重新設(shè)計場景或添加新的特征,這對于動態(tài)分析獲取功能全面且平衡的測試用例或場景集有很大的幫助。需要說明的是,特征和場景的添加和執(zhí)行,修改了已建立的基本架構(gòu),按照本文的圖1流程,需要重新進行跡的收集和算法1的處理等工作。但如果依賴性分析只是根據(jù)依賴圖推薦沒有被動態(tài)執(zhí)行到的代碼實體,可以根據(jù)如下的算法2,進行相關(guān)實體與已形成簇的相似度比較,以確定候選實體與基本架構(gòu)是合并還是舍棄。
算法2歸類算法(merging algorithm)
算法2通過命名規(guī)格進行相似度匹配。其中,第5句首先排除名稱相同的已有的實體,不再進行比較。第5~10句目標是基于依賴性,將各實體與算法1中已經(jīng)聚類的各個簇進行循環(huán)比較,選擇相似度最高的簇,如果大于設(shè)定的閾值,則將實體合并到該簇,否則舍棄。其中,算法第6句通過計算特征向量的余弦相似度進行比較。該定義描述如下:設(shè)有程序元素m和p,分別對應n維向量,則m和p的余弦相似度值為:
以下說明提取包含在類名的概念詞的方法:比如有實體類A和簇B的名稱分別為{DrawingChange-Event}和{DrawingEditor,F(xiàn)igureChangeAdapter},經(jīng)轉(zhuǎn)換后形成概念詞集合分別為{Draw,Change,Event}和{Draw,Editor,F(xiàn)igure,Change,Adapter},共用詞項{Draw,Change,Event,Editor,Figure,Adapter},則類A和簇B詞頻向量分別為{1,1,1,0,0,0}和{1,1,0,1,1,1},由式(3)得到A與B的余弦相似度為51.6%。
本章通過對開源項目的案例研究,介紹研究的目標系統(tǒng),描述聚類方法的細節(jié),與目標系統(tǒng)的設(shè)計者提供的實際結(jié)果比較以評估聚類質(zhì)量。
以 JHotDraw(http://www.JHotDraw.org/)和 JEdit(http://www.jedit.org/)作為案例研究分析實驗步驟和結(jié)果。JHotDraw項目是描述二維圖形的開源系統(tǒng),主要用于支持編輯器開發(fā),具有良好的框架結(jié)構(gòu)和命名規(guī)范,并且有相應的功能需求文檔;JEdit是一個帶有可擴展插件體系結(jié)構(gòu)的程序文本編輯器,具有良好維護過程和可擴展性能。因此,包結(jié)構(gòu)可以作為實驗方法的權(quán)威參考。實驗的軟件系統(tǒng)如表1所示。
Table 1 Descriptive statistics of target systems表1 目標系統(tǒng)的描述性統(tǒng)計
通過對待分析系統(tǒng)的需求文檔查詢,確定了對應的特征和場景描述,用標記的執(zhí)行跡來精確記錄對應的特征場景。從而快速建立起特征和系統(tǒng)實體之間的對應關(guān)系。圖3是收集的JEdit系統(tǒng)的部分執(zhí)行跡片段。
表2顯示了研究所選擇的特征。在特征選擇上,本文盡可能選擇覆蓋各個方面,以取得特征集的平衡。由于只分析蹤跡中特定類的活動,只要保存每個蹤跡的不同類別的實體。執(zhí)行場景后,生成特征-實體的關(guān)聯(lián)矩陣,根據(jù)算法1后得到如表3所示的初步劃分。
Fig.3 Partial execution traces slice of JEdit system圖3 JEdit系統(tǒng)的部分執(zhí)行跡片段
Table 2 Partial features and scenarios used in this experiment表2 實驗的部分特征和場景
Table 3 Clusters results generated by k-means algorithm表3 通過k-means算法產(chǎn)生的聚類結(jié)果
從表3可以看出,在所劃分的簇中,包含了系統(tǒng)的基本框架,但各個簇中包含的類數(shù)量較少,與實際的包結(jié)構(gòu)有較大差別,因此結(jié)合本文第3.3節(jié)所提出的方法,對特征-實體矩陣中的實體進行依賴性分析,根據(jù)不同的特征,將系統(tǒng)類之間的依賴標識出來,然后按照補充特征,推薦特征沒有執(zhí)行過的實體,根據(jù)算法2的方法補充到相關(guān)的簇中,例如:standard.CreationTool→ application.DrawApplication;figures.RectangleFigure → figures.ImageFigure;application.DrawApplication → contrib.CommandMenu;figures.AttributeFigure → figures.FigureChangeEvent;Viewframework.ConnectionFigure → framework.Handle;standard.StandardDrawingView→framework.Drawing。
本文對JHotDraw和JEdit兩個開源系統(tǒng)采用了分階段聚類的算法,為評估該算法的質(zhì)量,分別采用Tzerpos等人提供的ACDC(algorithm for comprehension driven clustering)算法[32]和 Bunch 聚類算法[4]作為基準實驗對相同的實驗系統(tǒng)進行測試后進行初步比較。以下是兩種算法的描述:
(1)ACDC是一種基于程序理解模式的算法,是通過使用模式驅(qū)動的方法識別子系統(tǒng),根據(jù)所使用的模式創(chuàng)建最終分解的框架。
(2)Bunch提供如窮舉和爬山等算法的集成用戶界面,將節(jié)點視為程序單元或模塊(如文件或類),并將節(jié)點之間的邊界視為這些模塊之間的調(diào)用如函數(shù)調(diào)用或繼承等關(guān)系。可以使用預定義的聚類來評估或提高系統(tǒng)聚類的質(zhì)量。
在軟件體系結(jié)構(gòu)恢復和演化領(lǐng)域,聚類是一項基本的活動。對基于聚類的過程的整體質(zhì)量的評估通常是一個關(guān)鍵問題??紤]在這個領(lǐng)域廣泛采用的三個評估度量[24]:權(quán)威性、分布合理性和穩(wěn)定性。比較三種方法對軟件架構(gòu)恢復的影響。
為了評估聚類的質(zhì)量,本文以MoJo距離(measure based on move and join distance)作為度量指標,比較實驗聚類結(jié)果同實際系統(tǒng)結(jié)構(gòu)的差異。MoJo距離表示將源分區(qū)轉(zhuǎn)換為目標分區(qū)的最小“移動”和“合并”操作數(shù)?!耙苿印北硎緦嶓w從一個簇中移動到另一個現(xiàn)有簇或新創(chuàng)建的簇,“合并”操作將兩個簇類合并成一個簇類。
其中,N是待聚類的實體的總數(shù),MoJo(A,B)=min(mno(B,A),mno(A,B))。Mno(X,Y)是“移動”或“合并”操作所需的最小數(shù)量。MoJoSim值越高表明越接近實際劃分。輸入文件格式之一是RSF(rigi standard format)文件格式,相比較對象應當包含依賴關(guān)系及對象集合具有相同的數(shù)量等條件。轉(zhuǎn)換的工作流程設(shè)計如圖4所示。
Fig.4 RSF generation approach圖4 RSF處理方法
4.3.1 權(quán)威性比較
評估的一個重要指標是實驗所產(chǎn)生的劃分與權(quán)威劃分的相似程度。比較由實驗生成的劃分A與權(quán)威劃分B,采用公式MoJoSim(A,B)并使用實際項目中的Java包結(jié)構(gòu)作為權(quán)威劃分。權(quán)威性值比較結(jié)果如圖5所示。
Fig.5 Comparison results of authoritativeness scores圖5 權(quán)威性值比較結(jié)果
4.3.2 穩(wěn)定性比較
聚類方法不會因為聚類對象的細微變化而導致聚類結(jié)果的顯著差別。兩個連續(xù)版本的系統(tǒng)中由相同聚類生成的兩個劃分Pi和Pi+1之間的相似性來衡量算法的穩(wěn)定性。通過計算MoJoSim(Pi,Pi+1)值比較聚類算法的穩(wěn)定性。穩(wěn)定性值比較結(jié)果如圖6所示。
Fig.6 Comparison results of stability scores圖6 穩(wěn)定性值比較結(jié)果
4.3.3 分布合理性比較
分布合理性NED是指聚類結(jié)果應該盡可能少地出現(xiàn)星云與黑洞[38],NED計算參見式(2)。NED值比較結(jié)果如圖7所示。
Fig.7 Comparison results ofNEDscores圖7 NED值比較結(jié)果
4.3.4 分階段聚類的符合度比較
顯然MoJoSim度量指標只是反映聚類的質(zhì)量,還需要將實驗結(jié)果與實際設(shè)計的包結(jié)構(gòu)進行對比分析。為此將實驗的兩個階段的聚類結(jié)構(gòu)分別與開源系統(tǒng)的真實結(jié)構(gòu)進行比較,以區(qū)分實驗在第二階段的聚類效果,具體的方法是采用Jaccard相似度計算,以包結(jié)構(gòu)為單位,比較實驗聚合的簇與實際的包中所包含的各類,設(shè)有clusterA和packetB分別是實體類的集合,則clusterA和packetB的符合度定義如下:
例如在JHotDraw 5.2設(shè)計的包結(jié)構(gòu)中,除了測試用例和示例代碼外,共有7個包,比如,在framework包中,共含有18個類,集合為{Drawing,figure,painter,tool,locator,connector…},以JHotDraw和JEdit的各個版本的實驗初期和實驗后期形成的聚類分別考慮,選擇的原則是按照名稱最相似的簇中類分別與實際的各個包中類進行比較,獲得的部分數(shù)據(jù)如圖8所示。
Fig.8 Distribution of comparison conformance圖8 比較符合度分布
從圖8可以看出,最初的聚類與實際的包結(jié)構(gòu)的符合度在50%以下,經(jīng)過后一階段的聚類后,達到50%以上的較好的符合度。分析主要有以下幾點原因:首先,在靜態(tài)分析過程中通過算法2,利用類的依賴、繼承和調(diào)用等關(guān)系,在形成的框架中添加實體,擴充了核心簇類中的實體數(shù)量,總的簇數(shù)目根據(jù)需要調(diào)整,這與使用的方法有關(guān),如果把引入的實體與以往的核心簇重新聚類,可能會影響核心架構(gòu)的特征功能。而采用迭代的架構(gòu)恢復方法,當需要特征和場景的添加和執(zhí)行時,需要重新運行算法1,并構(gòu)建基本框架。因此,在方法的處理上具有靈活性。從代碼的架構(gòu)來看,設(shè)計者基本上是按照功能實現(xiàn)進行命名和結(jié)構(gòu)劃分的,如JHotDraw 5.2中的standard包有47個類,application包和applet包都只有1個包等。因為applet主要功能是針對網(wǎng)頁應用,application包同樣是針對Samples包的應用設(shè)計的,不是系統(tǒng)的核心功能,所以采用以NED最大值作為聚類算法的劃分是可行的。同時,恢復原始軟件包意味著可能識別出有重構(gòu)意義的程序元素,從低內(nèi)聚性軟件包開始,可以將軟件包分成更多具有更高內(nèi)聚性的模塊。
其次,本文以動態(tài)特征分析為起點,盡管采用依賴性分析擴充分析的范圍,但對結(jié)構(gòu)影響最大的是初期的特征和場景的選擇。在實驗的初期,如果只選擇功能相類似的特征,聚類后的系統(tǒng)結(jié)構(gòu)很可能包含大部分實體的小部分簇,形成極端分布的現(xiàn)象。因此通過迭代和比較分析,擴充特征和場景的方法取得結(jié)構(gòu)的平衡。本文首先建立起基本的功能框架,構(gòu)建特征層次的結(jié)構(gòu)恢復,這與靜態(tài)的聚類或面向模式的恢復方式相比,在恢復的結(jié)構(gòu)上可能存在著差異。
本文的中心是通過分階段的聚類算法,達到目標系統(tǒng)結(jié)構(gòu)恢復的目的。在方法的實現(xiàn)上,采用特征作為聚類標準創(chuàng)建基本結(jié)構(gòu),按照動態(tài)調(diào)用的賦值權(quán)重分配給提取的信息以提高聚類的準確性。根據(jù)合理性分布的聚類質(zhì)量要求,達到自動確定聚類數(shù)量的效果。結(jié)合靜態(tài)依賴圖補充特征和程序元素,循環(huán)迭代是獲取特征和場景的平衡集,以恢復比較全面的框架結(jié)構(gòu)。
在實驗效果的評估上,從權(quán)威性、穩(wěn)定性和分布合理性等方面,比較形成的結(jié)構(gòu)與設(shè)計的包結(jié)構(gòu)的差異以評估實驗方法的質(zhì)量,為進一步的程序理解和系統(tǒng)可能的重新模塊化提供幫助。此外,依賴關(guān)系作為恢復中的重要因素,如何提供更精確的權(quán)重度量以提高恢復的精確度是需要考慮的工作。從實驗結(jié)果看,方法還受到主觀因素的制約,如特征和場景的構(gòu)建,度量指標的選擇等,這些都需要更多的實驗總結(jié)和完善。