巴元秀,趙逢禹,劉 亞
(上海理工大學(xué) 光電信息與計(jì)算機(jī)工程學(xué)院,上海 200093)
軟件項(xiàng)目復(fù)用對(duì)減少開(kāi)發(fā)工作量和成本、提高軟件項(xiàng)目質(zhì)量具有重要影響。在軟件開(kāi)發(fā)中,通過(guò)復(fù)用技術(shù)可以充分利用已有的開(kāi)發(fā)成果,從而提高軟件開(kāi)發(fā)的效率、降低開(kāi)發(fā)成本。同時(shí),通過(guò)復(fù)用高質(zhì)量的已有的開(kāi)發(fā)產(chǎn)品,避免了重新開(kāi)發(fā)過(guò)程中可能引入的錯(cuò)誤,從而提高軟件的質(zhì)量。
Gharehyazie等人利用代碼克隆檢測(cè)工具Deckard研究項(xiàng)目?jī)?nèi)部以及跨項(xiàng)目的克隆,研究發(fā)現(xiàn)代碼克隆非常普遍,從同一項(xiàng)目的幾行代碼到跨項(xiàng)目的代碼片段之間都檢測(cè)到不同程度的相似。Zhang Yun等人研究GitHub上的項(xiàng)目復(fù)用,發(fā)現(xiàn)含有相似的README文件的軟件項(xiàng)目存在相似性。由此可以看出不論是代碼級(jí)別還是項(xiàng)目級(jí)別,都存在著大量的復(fù)用。
目前最常用的軟件復(fù)用技術(shù)主要是代碼的復(fù)用。軟件開(kāi)發(fā)人員在進(jìn)行項(xiàng)目開(kāi)發(fā)的過(guò)程中發(fā)現(xiàn),開(kāi)發(fā)同類(lèi)型的軟件應(yīng)用時(shí)會(huì)實(shí)現(xiàn)相似或相同的功能,相應(yīng)的代碼實(shí)現(xiàn)也是相似的。代碼克隆技術(shù)便是代碼復(fù)用方法中最原始且最常用的技術(shù),一般表示為開(kāi)發(fā)人員通過(guò)代碼搜索技術(shù)從開(kāi)源項(xiàng)目中找到自己所需要的源代碼并復(fù)制到自己的項(xiàng)目中。文獻(xiàn)[5]提出一種代碼級(jí)別的復(fù)用技術(shù),該技術(shù)利用提取工具將源代碼的內(nèi)容生成代碼摘要,將用戶(hù)輸入的文本與代碼摘要進(jìn)行搜索查詢(xún),最后獲取相似的代碼進(jìn)行復(fù)用。
近年來(lái),隨著開(kāi)源生態(tài)的完善,人們更多地關(guān)注項(xiàng)目級(jí)別的復(fù)用研究。Xu等人研究跨項(xiàng)目復(fù)用,利用歷史開(kāi)源軟件項(xiàng)目的描述文檔和源代碼,將其與待開(kāi)發(fā)項(xiàng)目的功能進(jìn)行相似性度量并推薦相似的軟件項(xiàng)目。Thung等人利用相似的項(xiàng)目會(huì)共享相似的第三方庫(kù)這一原理,提取開(kāi)源項(xiàng)目使用的庫(kù),利用對(duì)庫(kù)的相似性匹配相似的項(xiàng)目實(shí)現(xiàn)項(xiàng)目級(jí)別的復(fù)用。Nguyen等人提出生態(tài)系統(tǒng)概念,由歷史開(kāi)源項(xiàng)目、庫(kù)以及項(xiàng)目之間的相互依賴(lài)關(guān)系組成,將開(kāi)發(fā)人員對(duì)待開(kāi)發(fā)項(xiàng)目的創(chuàng)建、修改等行為與生態(tài)系統(tǒng)分別構(gòu)建成圖,利用圖的相似性算法選取相似的項(xiàng)目進(jìn)行復(fù)用。
文獻(xiàn)[6~8]在項(xiàng)目級(jí)復(fù)用研究中仍有不足之處。文獻(xiàn)[6]主要研究了項(xiàng)目開(kāi)發(fā)過(guò)程中跨項(xiàng)目的代碼復(fù)用技術(shù),是編碼階段的復(fù)用方法。文獻(xiàn)[7]是從項(xiàng)目使用的庫(kù)方面考慮復(fù)用,文獻(xiàn)[8]是根據(jù)歷史開(kāi)源項(xiàng)目、庫(kù)以及待開(kāi)發(fā)項(xiàng)目三者之間的依賴(lài)關(guān)系考慮復(fù)用。以上的研究都還沒(méi)有實(shí)現(xiàn)從待開(kāi)發(fā)項(xiàng)目的需求分析考慮項(xiàng)目級(jí)別的復(fù)用。
文獻(xiàn)[9]提出一種基于需求規(guī)范文檔進(jìn)行代碼的功能特征復(fù)用的方法,該方法首先從需求規(guī)范文檔中提取出功能特征關(guān)鍵詞,然后將提取出的關(guān)鍵詞與代碼庫(kù)中代碼的功能特征關(guān)鍵詞進(jìn)行相似性匹配,最后根據(jù)相似的功能特征進(jìn)行代碼復(fù)用。文獻(xiàn)[9]從需求規(guī)范文檔的功能特征出發(fā),搜索可復(fù)用的代碼,仍然屬于項(xiàng)目局部功能的代碼復(fù)用。
在軟件工程實(shí)踐中,當(dāng)開(kāi)發(fā)人員獲取項(xiàng)目的軟件需求后,通常需要根據(jù)需求文檔中的問(wèn)題領(lǐng)域、用例描述、數(shù)據(jù)模型E-R圖搜索開(kāi)源項(xiàng)目庫(kù)中的相似軟件項(xiàng)目。如果能從需求文檔的問(wèn)題領(lǐng)域、用例描述以及數(shù)據(jù)模型方面找到相似的歷史項(xiàng)目進(jìn)行復(fù)用,可以大大節(jié)省項(xiàng)目設(shè)計(jì)與實(shí)施時(shí)間。而用自動(dòng)化的方法找到相似的歷史項(xiàng)目,是一件復(fù)雜的工作。因此本文提出了一種基于軟件需求規(guī)范的的項(xiàng)目級(jí)復(fù)用方法PR-REQ(Project Reuse based on Requirements Specification)。該方法首先分析歷史開(kāi)源項(xiàng)目,構(gòu)建算法提取歷史項(xiàng)目核心信息,包括項(xiàng)目的領(lǐng)域信息、代碼的功能操作序列以及數(shù)據(jù)模型信息。然后針對(duì)待開(kāi)發(fā)軟件項(xiàng)目的需求文檔,研究提取問(wèn)題領(lǐng)域、用例的功能操作序列以及數(shù)據(jù)模型等信息的方法。最后分別構(gòu)建領(lǐng)域相似性度量、功能操作序列相似性度量以及數(shù)據(jù)模型相似性度量算法,加權(quán)計(jì)算得到最終的相似性度量值并按由大到小排列。文中從GitHub上下載了8類(lèi)Java web項(xiàng)目構(gòu)造實(shí)驗(yàn),對(duì)本文提出的方法進(jìn)行實(shí)證。
項(xiàng)目級(jí)別的復(fù)用是對(duì)歷史項(xiàng)目在軟件架構(gòu)、功能實(shí)現(xiàn)、數(shù)據(jù)模型、設(shè)計(jì)與編碼等多方面的復(fù)用,也是軟件復(fù)用中最高級(jí)別的復(fù)用。為了實(shí)現(xiàn)項(xiàng)目級(jí)別的復(fù)用,圖1給出了該方法的操作流程圖,分為3步,它們分別是歷史開(kāi)源項(xiàng)目信息的提取、待開(kāi)發(fā)項(xiàng)目的需求文檔分析以及項(xiàng)目相似性度量計(jì)算。
(1)歷史開(kāi)源項(xiàng)目信息的提取。
為了復(fù)用歷史項(xiàng)目,需要對(duì)開(kāi)源歷史項(xiàng)目進(jìn)行數(shù)據(jù)分析與特征提取。在每個(gè)項(xiàng)目中,大部分都有源代碼和描述文檔。源代碼包含了項(xiàng)目的功能信息和數(shù)據(jù)模型信息。描述文檔通常給出了項(xiàng)目的功能介紹、用法以及如何安裝或部署。
a.描述文檔領(lǐng)域信息的提取。
分析描述文檔中的項(xiàng)目功能介紹,利用自然語(yǔ)言的方法處理文本主題分析提取項(xiàng)目的領(lǐng)域信息。
b.代碼中功能信息的提取。
采用靜態(tài)代碼分析技術(shù)解析歷史項(xiàng)目的代碼,提取項(xiàng)目的各功能操作,構(gòu)建項(xiàng)目的功能操作序列。
c.數(shù)據(jù)模型信息的提取。
從數(shù)據(jù)庫(kù)配置文件或源代碼中提取所使用的數(shù)據(jù)庫(kù)的表名、列名等信息,構(gòu)建數(shù)據(jù)模型。
(2)待開(kāi)發(fā)項(xiàng)目的需求文檔分析。
a.領(lǐng)域信息的提取。
在軟件復(fù)用時(shí),屬于同一個(gè)領(lǐng)域的項(xiàng)目被復(fù)用的可能性更高。這里通過(guò)自然語(yǔ)言處理方法,對(duì)需求文檔進(jìn)行分析,提取待開(kāi)發(fā)項(xiàng)目的領(lǐng)域信息。
b.功能操作信息的提取。
為了從項(xiàng)目的功能方面進(jìn)行相似性度量分析,需提取需求文檔中的用例,根據(jù)用例中的活動(dòng)和參與活動(dòng)的對(duì)象,構(gòu)建待開(kāi)發(fā)項(xiàng)目各功能的功能操作序列。
c.數(shù)據(jù)模型信息的提取。
在數(shù)據(jù)模型E-R圖中提取與待開(kāi)發(fā)項(xiàng)目有關(guān)的實(shí)體信息。
(3)項(xiàng)目相似性度量。
a.領(lǐng)域相似性度量。
為了能夠根據(jù)需求文檔中的領(lǐng)域信息在歷史開(kāi)源項(xiàng)目中尋找領(lǐng)域方面相似的項(xiàng)目,本文從開(kāi)源歷史項(xiàng)目的描述文檔和待開(kāi)發(fā)項(xiàng)目的需求文檔中各提取若干個(gè)主題,利用主題的相似性計(jì)算領(lǐng)域的相似度。a
=(a
,a
,…,a
)定義為從待開(kāi)發(fā)項(xiàng)目的需求文檔描述中提取的n
維主題向量,b
=(b
,b
,…,b
)定義為從開(kāi)源歷史項(xiàng)目的描述文檔中提取的n
維主題向量,領(lǐng)域相似度計(jì)算如公式(1)所示。(1)
b.功能操作相似性度量。
為了從功能操作方面比較待開(kāi)發(fā)項(xiàng)目的需求文檔和歷史開(kāi)源項(xiàng)目之間的相似性,本文構(gòu)建了功能操作序列的相似性度量方法。待開(kāi)發(fā)項(xiàng)目的需求文檔中的功能操作序列定義為W
={W
,W
,…,W
},其中W
(i
=1,2,…,m
)代表一組功能操作序列的集合。歷史開(kāi)源項(xiàng)目中提取的功能操作序列定義為T
={T
,T
,…,T
},其中T
(j
=1,2,…,n
)代表一組功能操作序列的集合。序列W
中序列的個(gè)數(shù)記為m
,序列T
中序列的個(gè)數(shù)記為n
,采用余弦相似度計(jì)算W
中任一個(gè)序列W
與T
中任一個(gè)序列T
的相似度值記為S
(W
,T
),最后根據(jù)公式(2)計(jì)算最終的相似度值。S
(W
,T
)=(2)
c.數(shù)據(jù)模型相似性度量。
為了更準(zhǔn)確地進(jìn)行項(xiàng)目復(fù)用,本文對(duì)數(shù)據(jù)模型也進(jìn)行分析,構(gòu)建數(shù)據(jù)模型相似性分析。歷史開(kāi)源項(xiàng)目中的數(shù)據(jù)模型定義為A
={A
,A
,…,A
},其中A
(j
=1,2,…,n
)代表由表名、列名信息組成的一組數(shù)據(jù)模型集合,集合A
中的個(gè)數(shù)記為n
。待開(kāi)發(fā)項(xiàng)目的需求文檔中提取出的數(shù)據(jù)模型定義為C
={C
,C
,…,C
},其中C
(i
=1,2,…,m
)代表由需求文檔中表名、列名信息組成的一組數(shù)據(jù)模型集合,集合C
中的個(gè)數(shù)記為m
。采用余弦相似度計(jì)算集合A
中任一組數(shù)據(jù)模型A
與集合C
中任一組數(shù)據(jù)模型C
的相似度值記為S
(C
,A
),最后根據(jù)公式(3)計(jì)算集合C
與A
的相似度值。S
(C
,A
)=(3)
d.計(jì)算候選項(xiàng)目的最終相似得分。
在分別計(jì)算上述三種相似度值后,最后采用公式(4)進(jìn)行加權(quán)計(jì)算得到最終的相似性度量分值。
(4)
其中,α
代表領(lǐng)域信息的權(quán)重,β
代表功能操作序列的權(quán)重,γ
代表數(shù)據(jù)模型的權(quán)重。圖1 PR-REQ方法流程圖
PR-REQ項(xiàng)目復(fù)用方法中的關(guān)鍵技術(shù)主要是從歷史開(kāi)源項(xiàng)目與待開(kāi)發(fā)項(xiàng)目的需求文檔中提取相關(guān)特征,然后計(jì)算這些特征的相似度并基于特征相似性推薦可復(fù)用的歷史項(xiàng)目。其中的關(guān)鍵技術(shù)主要有歷史開(kāi)源項(xiàng)目信息的提取和待開(kāi)發(fā)項(xiàng)目需求文檔信息的提取。
大多數(shù)開(kāi)源項(xiàng)目中都有描述文檔和源代碼。為了分析歷史開(kāi)源項(xiàng)目,本文對(duì)項(xiàng)目中包含的描述文檔和源代碼進(jìn)行數(shù)據(jù)分析和特征提取。
(1)領(lǐng)域信息的提取
描述文檔是描述軟件項(xiàng)目信息的文檔,它一般包含軟件的基本功能、簡(jiǎn)要的使用說(shuō)明、代碼目錄結(jié)構(gòu)說(shuō)明等信息。文中使用斯坦福主題模型工具提供的基于概率模型的LDA主題模型算法對(duì)描述文檔中的項(xiàng)目功能介紹部分進(jìn)行領(lǐng)域信息的主題提取。
在對(duì)領(lǐng)域描述文本進(jìn)行數(shù)據(jù)提取等相關(guān)工作之前,一般要進(jìn)行文本的預(yù)處理。文本的預(yù)處理也就是將需要進(jìn)行分析的文本通過(guò)一定的方式轉(zhuǎn)換成方便處理的結(jié)構(gòu)化的數(shù)據(jù)形式, 可以提高文本處理的準(zhǔn)確性。需求規(guī)范文檔大多由中文文本構(gòu)成,因此文中主要使用的預(yù)處理方式是中文文本的預(yù)處理。結(jié)合對(duì)于中文文本的特征進(jìn)行分析,在研究的過(guò)程中,文本預(yù)處理方式主要包括語(yǔ)料庫(kù)清理、分詞、詞性標(biāo)注和停止詞過(guò)濾。
①語(yǔ)料庫(kù)清理。
語(yǔ)料庫(kù)的清理主要是清理和刪除一些非法語(yǔ)言文字等不良數(shù)據(jù)。
②分詞、詞性標(biāo)注。
詞是構(gòu)成語(yǔ)句的基本單元,分析語(yǔ)句前需要先分詞,將文本中詞切分出來(lái)作為特征值,是自然語(yǔ)言處理比較重要的一步。中文分詞就是指將句子中漢字序列切分成詞集合。相對(duì)于英文而言,中文分詞要復(fù)雜得多。
③停止詞過(guò)濾。
在普通文本中含有標(biāo)點(diǎn)符號(hào)、介詞、語(yǔ)氣詞等,這些詞對(duì)理解文本沒(méi)有實(shí)際意義,應(yīng)從分詞結(jié)果中去除,這些詞稱(chēng)之為停用詞。去停用詞可以省存儲(chǔ)空間,減少停用詞對(duì)理解語(yǔ)句造成的噪音,降低文本維度,可以提高處理文本的效率和準(zhǔn)確率。
文獻(xiàn)[13]認(rèn)為對(duì)一篇科技文獻(xiàn),提取主題數(shù)量在5到6個(gè)時(shí)分析效果最好。借鑒該研究的結(jié)論,對(duì)軟件需求與歷史項(xiàng)目文檔的主題數(shù)量為5。
(2)代碼中功能操作序列的提取。
如何在軟件項(xiàng)目代碼中提取主要功能的操作序列是本文的關(guān)鍵算法。對(duì)于不同的軟件項(xiàng)目,由于其軟件架構(gòu)不同,其功能的操作序列提取方法也有差異,但都可以通過(guò)對(duì)配置文件與源代碼的靜態(tài)分析獲得。文中以Java web項(xiàng)目為研究對(duì)象,給出特征提取算法。Java web項(xiàng)目的功能操作信息主要體現(xiàn)在項(xiàng)目的頁(yè)面文件上,因此文中針對(duì)Java web項(xiàng)目的頁(yè)面文件提取功能操作序列。為了從頁(yè)面文件中提取項(xiàng)目的功能操作,需要利用JSOUP解析器從應(yīng)用程序的入口頁(yè)面開(kāi)始對(duì)其進(jìn)行數(shù)據(jù)解析,提取對(duì)應(yīng)頁(yè)面的功能操作,構(gòu)建功能操作序列。在提取功能操作時(shí),在web頁(yè)面中,操作功能主要分為靜態(tài)和動(dòng)態(tài)兩類(lèi)。 就是一個(gè)靜態(tài)頁(yè)面的跳轉(zhuǎn),可以從中提取出“注冊(cè)”功能; 是一個(gè)動(dòng)態(tài)頁(yè)面的跳轉(zhuǎn),在點(diǎn)擊“提交訂單”的同時(shí)會(huì)調(diào)用saveOrder方法,從后臺(tái)數(shù)據(jù)庫(kù)中調(diào)取數(shù)據(jù),可以從中提取出“提交訂單”功能。算法1給出了代碼功能操作提取算法。
算法1:代碼功能操作提取算法。
輸入:Java web項(xiàng)目的頁(yè)面文件集合P
={p
,p
,…,p
},項(xiàng)目的配置文件config。輸出:項(xiàng)目的功能操作序列T
={T
,T
,…,T
},其中T
(i
=1,2,…,m
)為一組功能操作序列的集合處理:
1.初始化隊(duì)列Queue,G
={V
,E
},V
=Φ,E
=Φ;2.從config中找到項(xiàng)目的入口頁(yè)面文件,不失一般性假設(shè)為p
;3.將p
作為訪(fǎng)問(wèn)的第一個(gè)頁(yè)面文件入隊(duì)列Queue;4.while(Queue非空)
{
CurrentPage=deQueue(Queue);//隊(duì)頭元素出隊(duì);
V
=V
∪{CurrentPage};利用JSOUP解析器提取CurrentPage頁(yè)面中的功能操作信息f
和與之對(duì)應(yīng)的跳轉(zhuǎn)頁(yè)面p
,p
∈P
;構(gòu)造G
的有向邊,加入到集合E
中,記為E
=E
∪{<(CurrentPage,p
),f
>};if (p
not inV
)p
入隊(duì)列Queue;}
5.在圖G
中,從節(jié)點(diǎn)p
開(kāi)始按照深度優(yōu)先算法遍歷路徑上的功能操作f
構(gòu)造功能操作序列T
;6.輸出功能操作序列T
,結(jié)束算法。(3)數(shù)據(jù)模型的提取
算法以Java web項(xiàng)目的代碼文檔集合作為輸入,采用一種輕量級(jí)的查詢(xún)提取工具SQL提取器,該工具使用AST過(guò)程內(nèi)的字符串解析,能夠?qū)Υa中的數(shù)據(jù)模型進(jìn)行靜態(tài)分析,提取出帶有元信息的SQL語(yǔ)句,通過(guò)對(duì)SQL語(yǔ)句進(jìn)行分析,輸出含有數(shù)據(jù)庫(kù)的表名、列名信息的集合。文中給出了利用SQL提取器進(jìn)行數(shù)據(jù)模型提取的過(guò)程,見(jiàn)算法2。
算法2:數(shù)據(jù)模型的提取。
輸入:項(xiàng)目的代碼文檔集合B
={b
,b
,…,b
}。輸出:表名、列名信息組成的數(shù)據(jù)模型集合A
={處理:
1.初始化集合A
;2.將b
作為訪(fǎng)問(wèn)的第一個(gè)代碼文檔;3.for each (CurrentFile inB
){
利用SQL提取器提取出CurrentFile中SQL語(yǔ)句的表名和Insert語(yǔ)句中的列名,記為
A
=A
∪{對(duì)于待開(kāi)發(fā)項(xiàng)目,需要在需求文檔中提取領(lǐng)域信息、功能操作信息、數(shù)據(jù)模型。其中領(lǐng)域信息的提取方法與歷史開(kāi)源項(xiàng)目中提取領(lǐng)域信息的方法一致。數(shù)據(jù)模型的提取是對(duì)需求文檔的數(shù)據(jù)模型E-R圖中的實(shí)體關(guān)系進(jìn)行分析。功能信息的提取是對(duì)需求文檔中的用例進(jìn)行特征提取,提取用例的活動(dòng),構(gòu)建待開(kāi)發(fā)項(xiàng)目的功能操作序列。限于篇幅,文中主要介紹對(duì)需求文檔中的功能信息進(jìn)行提取的方法。
用例由用例名稱(chēng)、描述、角色、編號(hào)、前置條件以及主事件流等組成,文中給出了用例功能操作序列的提取算法,該算法使用需求文檔中的用例集合R
={r
,r
,…,r
}作為輸入,提取出與系統(tǒng)進(jìn)行交互的用例活動(dòng),構(gòu)建功能操作序列W
={W
,W
,…,W
}作為輸出,見(jiàn)算法3。算法3:用例功能特征的操作序列的提取。
輸入:需求文檔中的用例集合R
={r
,r
,…,r
}。輸出:功能操作序列W
={W
,W
,…,W
},其中W
(i
=1,2,…,m
)為一組功能操作序列的集合。處理:
1.初始化集合W
;2.將r
作為訪(fǎng)問(wèn)的第一個(gè)用例;3.for each (CurrentUse inR
){
根據(jù)CurrentUse中的事件流的交互過(guò)程,提取出參與用例活動(dòng)的操作和對(duì)應(yīng)的活動(dòng)對(duì)象,構(gòu)建功能操作序列集合記為W
;W
=W
∪W
;}
4.輸出操作序列W
,結(jié)束算法。在軟件項(xiàng)目級(jí)別的復(fù)用研究領(lǐng)域中,目前尚沒(méi)有找到包含待開(kāi)發(fā)項(xiàng)目的需求文檔、歷史項(xiàng)目的源代碼數(shù)據(jù)集,以及它們之間相似度的度量參考標(biāo)準(zhǔn)。因此為了驗(yàn)證文中提出的PR-REQ方法的準(zhǔn)確性,文中構(gòu)造了一個(gè)實(shí)驗(yàn),采用人工方法和PR-REQ方法分別對(duì)需求文檔進(jìn)行分析,將PR-REQ方法找出的Top N的相似軟件項(xiàng)目與人工找出的Top N的相似軟件項(xiàng)目進(jìn)行一致性和包含性比較。
文中從GitHub上下載了958個(gè)Java Web項(xiàng)目,這些項(xiàng)目包含學(xué)校管理類(lèi)、企業(yè)類(lèi)、競(jìng)賽類(lèi)、網(wǎng)購(gòu)類(lèi)、游戲類(lèi)等八類(lèi)項(xiàng)目,在這些項(xiàng)目中同時(shí)具有需求描述和項(xiàng)目代碼的項(xiàng)目數(shù)共68個(gè)。開(kāi)源軟件項(xiàng)目數(shù)及其類(lèi)別見(jiàn)表1。
表1 開(kāi)源軟件項(xiàng)目數(shù)及其類(lèi)別
基于PR-REQ方法開(kāi)發(fā)了一個(gè)項(xiàng)目復(fù)用推薦程序,該推薦程序首先從數(shù)據(jù)庫(kù)中讀取歷史開(kāi)源項(xiàng)目和待開(kāi)發(fā)項(xiàng)目的需求文檔。然后分別提取開(kāi)源項(xiàng)目和需求文檔中的領(lǐng)域信息、功能操作序列以及數(shù)據(jù)模型信息并存儲(chǔ)于數(shù)據(jù)庫(kù)中。最后通過(guò)調(diào)用相似度量程序?qū)π枨笪臋n和歷史開(kāi)源項(xiàng)目進(jìn)行相似度量,利用相似度得分機(jī)制將候選項(xiàng)目按得分由大到小排列,并將候選項(xiàng)目的結(jié)果存儲(chǔ)到數(shù)據(jù)庫(kù)中。
為了驗(yàn)證該方法的準(zhǔn)確性,文中從百度文庫(kù)中下載了5個(gè)學(xué)校管理類(lèi)需求文檔和5個(gè)企業(yè)類(lèi)需求文檔,對(duì)其從①到⑩進(jìn)行編號(hào)。為了便于實(shí)驗(yàn)中對(duì)相似項(xiàng)目進(jìn)行排序,將表1中同時(shí)具有需求描述和項(xiàng)目代碼的68個(gè)項(xiàng)目進(jìn)行從1到68編號(hào)。其次,分別采用人工方法和PR-REQ方法對(duì)這10個(gè)需求文檔進(jìn)行分析,從68個(gè)項(xiàng)目中找出相似的軟件項(xiàng)目。人工方法是由作者共同對(duì)每個(gè)需求文檔進(jìn)行分析,從領(lǐng)域、功能操作以及數(shù)據(jù)模型三個(gè)方面進(jìn)行數(shù)據(jù)分析,找出與之相似程度最高的3個(gè)項(xiàng)目,對(duì)其進(jìn)行相似度排序并記錄3個(gè)項(xiàng)目對(duì)應(yīng)的編號(hào)。PR-REQ方法則是利用開(kāi)發(fā)好的項(xiàng)目復(fù)用推薦程序,對(duì)這10個(gè)需求文檔進(jìn)行特征提取與分析,同樣找出與之相似程度最高的3個(gè)項(xiàng)目,對(duì)其進(jìn)行相似度排序并記錄3個(gè)項(xiàng)目對(duì)應(yīng)的編號(hào)。最后,分別對(duì)人工選取的項(xiàng)目和PR-REQ方法選取的項(xiàng)目進(jìn)行一致率和包含率分析,驗(yàn)證文中提出的PR-REQ方法的準(zhǔn)確性。
定義1:一致率:PR-REQ系統(tǒng)找出的項(xiàng)目與人工找出的項(xiàng)目一致的比率。
定義2:包含率:PR-REQ系統(tǒng)找出的項(xiàng)目包含在人工找出的項(xiàng)目中的比率。
表2是針對(duì)每個(gè)需求文檔,利用人工方法和PR-REQ方法找出的相似軟件項(xiàng)目對(duì)應(yīng)的編號(hào)。然后對(duì)表2中的編號(hào)進(jìn)行一致率和包含率分析,分析結(jié)果見(jiàn)表3。
表2 人工方法和PR-REQ方法選取的相似項(xiàng)目的編號(hào)
表3 一致率和包含率分析 %
由表3可以看出,針對(duì)這10個(gè)需求文檔,人工分析與PR-REQ分析推薦的第一個(gè)歷史項(xiàng)目有80%相同,在推薦一個(gè)最相似的項(xiàng)目時(shí),一致率與包含率意義相同。Top 2一致率為40%,Top 3一致率為30%,可以看出,隨著推薦的項(xiàng)目越多,一致率會(huì)有所下降,這一結(jié)果也符合預(yù)期;而對(duì)于包含率,Top 1、Top 2與Top 3都不低于80%,也就是說(shuō)利用PR-REQ方法找出的1到3個(gè)相似項(xiàng)目與人工找出的1到3個(gè)相似項(xiàng)目雖然無(wú)法在相似程度上保持一致,但包含率在80%以上,這說(shuō)明文中提出的PR-REQ方法具有較高的準(zhǔn)確性,對(duì)于項(xiàng)目復(fù)用具有實(shí)用價(jià)值。
軟件項(xiàng)目需求分析是開(kāi)發(fā)人員開(kāi)發(fā)一個(gè)新項(xiàng)目時(shí)的第一階段,目前尚沒(méi)有一種項(xiàng)目復(fù)用方法可以根據(jù)待開(kāi)發(fā)項(xiàng)目的需求文檔進(jìn)行項(xiàng)目級(jí)復(fù)用。針對(duì)這一問(wèn)題,文中提出了一種基于軟件需求分析的項(xiàng)目級(jí)復(fù)用方法PR-REQ,該方法從項(xiàng)目的主題領(lǐng)域、功能操作信息以及數(shù)據(jù)模型三個(gè)方面對(duì)待開(kāi)發(fā)項(xiàng)目的需求文檔和開(kāi)源歷史項(xiàng)目進(jìn)行特征提取和數(shù)據(jù)分析,最后構(gòu)建相似性度量方法進(jìn)行相似項(xiàng)目推薦?;谖闹刑岢龅姆椒ǎS機(jī)選取了企業(yè)類(lèi)和學(xué)校管理類(lèi)的需求文檔各5個(gè)來(lái)構(gòu)造實(shí)驗(yàn)驗(yàn)證其準(zhǔn)確性。
實(shí)驗(yàn)結(jié)果表明,文中提出的基于需求分析的項(xiàng)目級(jí)復(fù)用方法在尋找相似的軟件項(xiàng)目方面具有較高的準(zhǔn)確性,該方法對(duì)于開(kāi)發(fā)人員在項(xiàng)目開(kāi)發(fā)的初期階段具有重要作用。但是本實(shí)驗(yàn)只取了68個(gè)歷史項(xiàng)目文件,針對(duì)兩類(lèi)共10個(gè)項(xiàng)目需求文檔進(jìn)行了分析,實(shí)驗(yàn)樣本數(shù)量仍然偏少,為了證實(shí)該方法的實(shí)用性,還需下載更多的項(xiàng)目進(jìn)行分析。另外對(duì)于非Java web項(xiàng)目,還需基于歷史項(xiàng)目的代碼進(jìn)一步構(gòu)建算法提取功能操作序列與項(xiàng)目的數(shù)據(jù)模型。
計(jì)算機(jī)技術(shù)與發(fā)展2022年2期