張森森
(桂林航天工業(yè)學(xué)院 計(jì)算機(jī)科學(xué)與工程學(xué)院,廣西 桂林 541000)
隨著軟件工程技術(shù)的成熟與發(fā)展,采用工程化的方法進(jìn)行軟件開(kāi)發(fā)已成必然。在進(jìn)行面向?qū)ο蠓椒▽W(xué)開(kāi)發(fā)時(shí),軟件設(shè)計(jì)起到了至關(guān)重要的作用,只有好的設(shè)計(jì)才能保證編碼階段不會(huì)產(chǎn)生錯(cuò)誤。因此,對(duì)大型的軟件進(jìn)行開(kāi)發(fā),必須按照不同的主題來(lái)進(jìn)行對(duì)象模型的設(shè)計(jì)。這樣即可以降低設(shè)計(jì)階段錯(cuò)誤的引入,也能減少后期編碼階段的難度[1]。目前,常規(guī)的主題劃分方法,一般先由高級(jí)的軟件開(kāi)發(fā)人員根據(jù)前期得到的類(lèi)圖來(lái)進(jìn)行劃分,然后由具體的項(xiàng)目負(fù)責(zé)人員對(duì)項(xiàng)目逐步進(jìn)行深入了解后,再進(jìn)行進(jìn)一步的修改。所采用的技術(shù)大都是按著問(wèn)題域來(lái)進(jìn)行主題的確認(rèn),而此方法未將功能或者是對(duì)象之間的耦合性作為參考的標(biāo)準(zhǔn)。
一般在研究問(wèn)題時(shí)得到的原始類(lèi)圖中,類(lèi)之間的相互連接因?yàn)橛袛?shù)據(jù)的傳送,僅僅按著問(wèn)題域進(jìn)行劃分并不是很好的選擇。由于前期設(shè)計(jì)階段得到的結(jié)果對(duì)后期的實(shí)現(xiàn)會(huì)產(chǎn)生深遠(yuǎn)的影響。因此,在進(jìn)行類(lèi)圖主題劃分時(shí),也應(yīng)該將得到的類(lèi)之間的數(shù)據(jù)傳送考慮進(jìn)去。如果類(lèi)圖中存在兩個(gè)類(lèi)之間有密集的數(shù)據(jù)交流,但并不在同一個(gè)問(wèn)題域中,也應(yīng)該在實(shí)際的設(shè)計(jì)階段將其放到同一個(gè)主題中。那么依據(jù)什么來(lái)進(jìn)行這些類(lèi)的移動(dòng),如何將這些放到一個(gè)合適的主題中,是一個(gè)優(yōu)秀設(shè)計(jì)的關(guān)鍵。
軟件重構(gòu)應(yīng)用于軟件開(kāi)發(fā)的各個(gè)階段,主要目的是為了優(yōu)化軟件的結(jié)構(gòu),提高軟件的可讀性。在軟件開(kāi)發(fā)過(guò)程中占據(jù)的地位也是越來(lái)越大,例如軟件開(kāi)發(fā)的預(yù)防性維護(hù)階段,主要采用的軟件重構(gòu)技術(shù)來(lái)進(jìn)行。軟件重構(gòu)最主要的意義在于軟件重構(gòu)前后軟件的功能不會(huì)發(fā)生改變,僅僅改變軟件的內(nèi)部結(jié)構(gòu)。在類(lèi)圖主題劃分階段應(yīng)用過(guò)程中,必須保證軟件重構(gòu)前后類(lèi)圖的整體設(shè)計(jì)不會(huì)發(fā)生改變,即系統(tǒng)對(duì)外顯示的功能不會(huì)發(fā)生改變[2-3]。
權(quán)重計(jì)算法是為了解決上述問(wèn)題,優(yōu)化類(lèi)圖主題而提出的。權(quán)重計(jì)算的原理是根據(jù)類(lèi)圖中類(lèi)的相互依賴(lài)關(guān)系,確定一個(gè)數(shù)值,定量得到某個(gè)類(lèi)與對(duì)應(yīng)主題以及相關(guān)主題之間的依賴(lài)關(guān)系[4]。如圖1 所示:類(lèi)A 按問(wèn)題域劃分到a 主題中,類(lèi)B 按問(wèn)題域劃分到b 主題中,A 與B 之間有數(shù)據(jù)交流給其定值為1。假設(shè)b 主題中還有C、D 兩個(gè)類(lèi),C、D 都與類(lèi)A 有數(shù)據(jù)交流。但是主題a 中的其它類(lèi)與類(lèi)A 并沒(méi)有據(jù)交流,可以粗略的認(rèn)為主題a 與類(lèi)A 的權(quán)重值為1,主題b 與類(lèi)A 的權(quán)重值為3,在不影響軟件整體功能的前提下,可以認(rèn)為將類(lèi)A 移動(dòng)到主題b 中能夠減少主題之間的依賴(lài)性,提高軟件的質(zhì)量,以及優(yōu)化軟件的結(jié)構(gòu)。
圖1 權(quán)重圖形化Fig.1 Weight graphing
研究對(duì)象自動(dòng)取款機(jī)(ATM)系統(tǒng),銀行擬開(kāi)發(fā)一個(gè)對(duì)應(yīng)的ATM 系統(tǒng)。按照對(duì)應(yīng)的軟件工程開(kāi)發(fā)步驟先得到所需的類(lèi),建立相應(yīng)的關(guān)聯(lián),然后按照主題劃分為3 個(gè)常見(jiàn)的主題,即總行、分行、ATM,如圖2 所示??傂兄饕傂蓄?lèi)與ATM 類(lèi);分行主要包含分行類(lèi)、分行計(jì)算機(jī)類(lèi)、柜員終端類(lèi)等等;ATM主要包含ATM 類(lèi)、遠(yuǎn)程事務(wù)類(lèi)以及銀行卡類(lèi)以及儲(chǔ)戶(hù)相關(guān)類(lèi)等。
圖2 ATM 系統(tǒng)常見(jiàn)的主題圖Fig.2 Common themes of ATM systems
根據(jù)原始類(lèi)圖此類(lèi)相關(guān)的信息,將里面的類(lèi)進(jìn)行抽象化得到圖3。圖3 具體記錄了ATM 系統(tǒng)中各個(gè)類(lèi)之間的關(guān)聯(lián)。此類(lèi)連接主要分為二種情況,一是每個(gè)主題內(nèi)部自身類(lèi)之間的連接。如:在主題分行中,分行類(lèi)用來(lái)保管賬戶(hù),所以分行類(lèi)與賬戶(hù)類(lèi)之間具有具體的連接,分行類(lèi)與柜員類(lèi)、分行類(lèi)與分行計(jì)算機(jī)類(lèi)、柜員類(lèi)與柜員事務(wù)類(lèi)等都屬于這類(lèi)的關(guān)系。通過(guò)相應(yīng)的分析,也可以得到主題總行以及主題ATM 的內(nèi)部各個(gè)類(lèi)之間相應(yīng)的連接情況。另一種連接方式則是各個(gè)不同主題之間類(lèi)的連接。如:在圖3 中,主題ATM 中的現(xiàn)金兌換卡能夠訪問(wèn)主題分行中的賬戶(hù),則需要在代表現(xiàn)金兌換卡類(lèi)與代表儲(chǔ)戶(hù)類(lèi)的抽象化的類(lèi)之間建立相應(yīng)的連接。同樣在圖3 中也可以找到很多類(lèi)似此類(lèi)的連接,如主題分行計(jì)算機(jī)類(lèi)與主題總行中的中央計(jì)算機(jī)類(lèi)等等。為了能夠利用軟件重構(gòu)的權(quán)重計(jì)算法來(lái)進(jìn)行研究,本文粗略的將各個(gè)有關(guān)聯(lián)類(lèi)之間的關(guān)聯(lián)數(shù)據(jù)定量為1。在進(jìn)行研究時(shí),研究的對(duì)象應(yīng)該是那些與其他主題具有直接關(guān)聯(lián)的類(lèi),也就是能夠滿(mǎn)足第二種條件的類(lèi)。
圖3 ATM 權(quán)重圖Fig.3 ATM weight diagram
在研究的ATM 系統(tǒng)中,中央計(jì)算機(jī)類(lèi)、賬戶(hù)類(lèi)、分行類(lèi)、遠(yuǎn)程事務(wù)類(lèi)、現(xiàn)金卡類(lèi)、儲(chǔ)戶(hù)類(lèi)都是滿(mǎn)足第二種條件的類(lèi)。因此,這些類(lèi)作為全部的觀察對(duì)象,因?yàn)樾枰玫皆戎黝}以及可能需要移動(dòng)主題之間的關(guān)系,因此還需要得到這些類(lèi)第一種方法的值,具體的數(shù)據(jù)分析見(jiàn)表1。表1 中記錄的信息主要包括需要研究的這些類(lèi)與相應(yīng)主題之間的權(quán)重?cái)?shù)據(jù)。對(duì)表1 分析可見(jiàn),中央計(jì)算機(jī)類(lèi)、分行類(lèi)、儲(chǔ)戶(hù)類(lèi)與其它主題類(lèi)的交流權(quán)重值等于與其對(duì)應(yīng)主題的交流權(quán)重值,遠(yuǎn)程事務(wù)、現(xiàn)金卡類(lèi)與其它主題類(lèi)的交流權(quán)重值小于與其對(duì)應(yīng)主題的交流權(quán)重值。因此,這些類(lèi)在原主體中應(yīng)保持不變。分析賬戶(hù)類(lèi)明顯看出,此類(lèi)在分行主題中的權(quán)重值要小于ATM 主題中的權(quán)重值,因此可以進(jìn)行移動(dòng)。
表1 各類(lèi)在不同主題分布表Tab.1 The categories are distributed in different topics
通過(guò)利用權(quán)重計(jì)算法能夠定量的分析出主題間需要移動(dòng)的類(lèi),保證了主題結(jié)構(gòu)的清晰度,減少了主題之間的耦合性,確保在后期代碼編寫(xiě)過(guò)程中軟件的穩(wěn)定性,減少了代碼書(shū)寫(xiě)量,縮短了開(kāi)發(fā)的時(shí)間,優(yōu)化了軟件的結(jié)構(gòu)。在實(shí)際開(kāi)發(fā)大型軟件過(guò)程中已有很多的可視化工具能夠幫助人們迅速找到類(lèi),以及各個(gè)類(lèi)之間的關(guān)聯(lián)值。而開(kāi)發(fā)者需要做的,就是利用這些關(guān)聯(lián)去得到需要進(jìn)行比較的類(lèi),然后根據(jù)權(quán)重值來(lái)判斷類(lèi)是否需要移動(dòng)。對(duì)軟件重構(gòu)來(lái)說(shuō),還有一點(diǎn)至關(guān)重要,就是主題之間類(lèi)移動(dòng)前后必須要保證軟件對(duì)外的功能沒(méi)有發(fā)生變化。由于本例中要移動(dòng)的賬戶(hù)類(lèi)設(shè)計(jì)較小,可以通過(guò)簡(jiǎn)單的結(jié)構(gòu)分析得到結(jié)論,保證軟件重構(gòu)。但在大型的軟件開(kāi)發(fā)時(shí),特別對(duì)于那些結(jié)構(gòu)復(fù)雜的軟件,在利用權(quán)重進(jìn)行分析時(shí)必須要進(jìn)行軟件重構(gòu)分析,必要時(shí)需要進(jìn)行相應(yīng)的測(cè)試,來(lái)保證軟件重構(gòu)前后軟件的功能不會(huì)發(fā)生變化。在實(shí)際的運(yùn)用過(guò)程中,沒(méi)有必要去統(tǒng)計(jì)原有主題或者目標(biāo)主題中的權(quán)重值,可以引進(jìn)一個(gè)新的變量Q。Q 代表的是某個(gè)類(lèi)在主題之間移動(dòng)之后權(quán)重值的差值,引進(jìn)這個(gè)變量就可以直接通過(guò)其的正負(fù)值來(lái)得到需要移動(dòng)的類(lèi)。通過(guò)上訴分析可知,Q 值為正時(shí)需要進(jìn)行此類(lèi)的移動(dòng),這在進(jìn)行一些大型的軟件開(kāi)發(fā)過(guò)程中能夠節(jié)省時(shí)間減少操作步驟。
本文雖然應(yīng)用于一個(gè)小型的ATM 系統(tǒng)開(kāi)發(fā),但軟件開(kāi)發(fā)的步驟以及原則結(jié)構(gòu)都非常的詳盡,將此技術(shù)應(yīng)用于主題間類(lèi)的移動(dòng),能夠明顯的改善原始類(lèi)圖中主題的結(jié)構(gòu)幫助,對(duì)整個(gè)軟件開(kāi)發(fā)過(guò)程都具有深遠(yuǎn)的影響。但是此項(xiàng)技術(shù)應(yīng)用范圍比較局限,沒(méi)有得到更多的驗(yàn)證,僅僅本文中的例子是遠(yuǎn)遠(yuǎn)不夠的,希望今后能夠在更多的軟件開(kāi)發(fā)過(guò)程中得到運(yùn)用。