国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

代碼重構(gòu)方法在敏捷開發(fā)中的應(yīng)用

2017-05-12 09:22:50鮮茜
現(xiàn)代計算機(jī) 2017年9期
關(guān)鍵詞:單元測試代碼重構(gòu)

鮮茜

(四川大學(xué)計算機(jī)學(xué)院,成都 610065)

代碼重構(gòu)方法在敏捷開發(fā)中的應(yīng)用

鮮茜

(四川大學(xué)計算機(jī)學(xué)院,成都 610065)

軟件產(chǎn)品由于互聯(lián)網(wǎng)蓬勃發(fā)展而以井噴之勢持續(xù)遞增。許多企業(yè)選擇敏捷開發(fā)模式來節(jié)約時間成本。同時,需要對軟件進(jìn)行不斷地完善和改進(jìn),這導(dǎo)致軟件越來越復(fù)雜,維護(hù)成本增加。因此,代碼重構(gòu)顯得十分重要,通過參考大量文獻(xiàn)和依托項目實例,總結(jié)優(yōu)化代碼的一些改進(jìn)方法,并以結(jié)果展示代碼重構(gòu)后能提高其性能,使軟件更易于理解和維護(hù)。

重構(gòu);敏捷開發(fā);改進(jìn)方法

0 引言

科技社會日新月異,互聯(lián)網(wǎng)行業(yè)突飛猛進(jìn),許多互聯(lián)網(wǎng)公司如雨后春筍般崛起。在面臨行業(yè)競爭,需要提升產(chǎn)品的功能多樣性、易用性、安全性、用戶體驗等復(fù)雜需求下,企業(yè)往往采用敏捷開發(fā),這種開發(fā)技術(shù)的優(yōu)點(diǎn)不言而喻,但缺點(diǎn)在于小組成員間工作較為獨(dú)立,各自在代碼風(fēng)格、邏輯結(jié)構(gòu)方面有較大差異。軟件產(chǎn)品隨著時間的推移,必須不斷地修改原有的代碼、增加新的功能。為了實現(xiàn)變更,不可避免地要違反最初的設(shè)計構(gòu)架。一段時間以后,軟件的架構(gòu)就會千瘡百孔。代碼以指數(shù)級數(shù)量增加,發(fā)現(xiàn)的代碼錯誤越來越多,系統(tǒng)變得很難維護(hù),間接說明代碼存在許多問題。例如:可讀性差、冗余、代碼依賴性強(qiáng)、自動測試代碼更新不及時、維護(hù)困難。

這個現(xiàn)象帶來了科技的革新:代碼演化技術(shù)、代碼自動化生成、測試驅(qū)動、形式化驗證、代碼重構(gòu)與優(yōu)化等方面的研究。其中,代碼重構(gòu)技術(shù)十分重要,它是優(yōu)化功能代碼的核心技術(shù),不改變系統(tǒng)的外部功能,只對內(nèi)部的結(jié)構(gòu)進(jìn)行重新的整理,能夠在較大程度優(yōu)化代碼,使系統(tǒng)對需求變化具有自適應(yīng)能力。

通過實際項目中代碼重構(gòu)經(jīng)驗,分析對比重構(gòu)前后代碼性能、代碼復(fù)雜度等參數(shù)??偨Y(jié)其中有效的優(yōu)化方法,保證功能工作的情況下,使軟件得到改進(jìn)。

1 相關(guān)工作

Martin Fowler清楚揭示了重構(gòu)過程,解釋重構(gòu)的原理,并指出何時何地你應(yīng)該開始挖掘你的代碼以求改善[1]。陳林等人針對現(xiàn)有泛化關(guān)系重構(gòu)方法在處理泛型程序時不考慮參數(shù)化類型的約束,會破壞程序類型正確性的問題,提出了一組泛型Java程序的類型約束規(guī)則,可以在與程序代碼規(guī)模成線性關(guān)系的時間內(nèi)實施重構(gòu),并有效地保證程序的類型正確性[2]。Kataoka等人提出一種定量評價方法來衡量程序重構(gòu)的可維護(hù)性增強(qiáng)效果。專注于耦合度量來評估重構(gòu)效應(yīng)[3]。Van等人提供了一組具有“壞氣味”的代碼,之后給出了測試的集合重構(gòu)去除這些問題代碼。最終,通過一個簡單程序的修改,測試重構(gòu)解釋的集合證明如何克服這些問題[4]。Du等人分析在哪些特定條件下如何重構(gòu)操作耦合/凝聚力特征,以及如何識別重構(gòu)的這些特征是否得到改善,最終在一個開放源碼軟件系統(tǒng)驗證相關(guān)改進(jìn)和適用性[5]。

2 重構(gòu)方法概述

根據(jù)目標(biāo)管理SMART原則,制定重構(gòu)計劃。需要考慮重構(gòu)所需時間,具體地為每個小目標(biāo)設(shè)定一個合理的最后期限,并設(shè)置明確的度量來評估目標(biāo)是否達(dá)成。采取結(jié)對編程有效策略,重構(gòu)之前構(gòu)建有效的測試來保證代碼質(zhì)量。將重構(gòu)分為功能代碼和測試代碼兩部分來進(jìn)行。如圖1所示,審視代碼整體結(jié)構(gòu)和風(fēng)格,分析出依賴關(guān)系并統(tǒng)一風(fēng)格,在重構(gòu)之前進(jìn)行回歸測試。接下來對功能代碼風(fēng)格和業(yè)務(wù)邏輯進(jìn)行重構(gòu),并每修改一次,進(jìn)行回歸測試,一直到所有結(jié)束。

圖1 重構(gòu)流程圖

2.1 重構(gòu)重點(diǎn)

①打破依賴明確的關(guān)系

②構(gòu)建堅實的測試

③優(yōu)化代碼,重新審視遺留缺陷

2.2 重構(gòu)步驟

在實際工程項目中,代碼庫一直在持續(xù)集成服務(wù)器運(yùn)行著,所以需要先從源代碼干線拉出一條分支進(jìn)行重構(gòu)。這樣可以使重構(gòu)周期限于非常小的范圍,通常為1或2個類;改進(jìn)類設(shè)計時不會涉及業(yè)務(wù)邏輯,修改一個類之后,需要用自動化測試工具進(jìn)行功能測試,直到測試通過;周而復(fù)始繼續(xù)修改類,直到所有類都更改,保證功能不受影響后,提交回代碼庫主干線。

3 實現(xiàn)及方法總結(jié)

3.1 功能代碼優(yōu)化

(1)有狀態(tài)的服務(wù)對象

●癥狀

一些服務(wù)對象是有狀態(tài)的,因為它們會從請求對象那里提取數(shù)據(jù)。代碼為每個服務(wù)對象將請求對象轉(zhuǎn)換成一個字段,并為每個請求創(chuàng)建新對象。當(dāng)系統(tǒng)負(fù)載很高時會對JVM(Java虛擬機(jī))造成強(qiáng)工作負(fù)載來分配內(nèi)存和垃圾回收。讓所有的服務(wù)對象線程變得不安全。

●解決方法

打破依賴,有一個明確的數(shù)據(jù)和邏輯的分離,讓所有服務(wù)對象無狀態(tài),狀態(tài)駐留在請求對象本身。所有的服務(wù)方法的請求對象作為輸入?yún)?shù),這樣使得每個服務(wù)對象可以一次創(chuàng)建并為多個請求所重用。

圖2 類重構(gòu)流程圖

(2)類關(guān)聯(lián)

●癥狀

類與類之間有繼承關(guān)系、泛化關(guān)系、依賴關(guān)系、關(guān)聯(lián)關(guān)系、聚合關(guān)系、組合關(guān)系六種關(guān)系,這些關(guān)系分類較細(xì),有時往往會對此認(rèn)識不清晰。沒有明確的泛化關(guān)系,而依賴關(guān)系是由調(diào)用者從靜態(tài)工廠方法和獲取使用之前初始化。而且代碼中存在工廠模式的錯誤使用導(dǎo)致代碼冗余、代碼層次多余、結(jié)構(gòu)紊亂等問題。很難闡述代碼變化的影響,而且容易創(chuàng)建一個循環(huán)引用關(guān)系。

●解決方法

通過為依賴接口創(chuàng)建字段,使依賴關(guān)系顯式化。封裝調(diào)用者的類和實現(xiàn)函數(shù)的功能代碼,實現(xiàn)高內(nèi)聚低耦合。

(3)對象創(chuàng)建

●癥狀

對象實例是根據(jù)每個請求創(chuàng)建,即使在同一類的不同方法中,也會重復(fù)創(chuàng)建相同的依賴對象實例。隨意的創(chuàng)建對象會增加了JVM的不必要的工作負(fù)載,并可能導(dǎo)致性能問題,從而整個產(chǎn)品性能較差,用戶體驗不佳。

●解決方法

除了請求對象之外,所有對象實例都由Spring(Java的一種框架)在應(yīng)用程序啟動時創(chuàng)建一次,并重復(fù)用于不同的請求,只有在必要時才創(chuàng)建一個新對象,對象生命周期應(yīng)該由框架管理。依賴對象是類的字段,使用Spring框架創(chuàng)建對象實例,使對象單例,然后使用Spring框架注入依賴對象實例。

(4)功能函數(shù)

●癥狀

函數(shù)是程序中最基本的功能結(jié)構(gòu),是一個可以從程序其它地方調(diào)用執(zhí)行的語句塊。函數(shù)通常只完成一個功能,當(dāng)函數(shù)代碼行數(shù)數(shù)量龐大,缺少戰(zhàn)略異常處理和日志記錄。會使得代碼難以閱讀,而且難以理解,查錯和維護(hù)變得困難。函數(shù)嵌套層次比較深時,內(nèi)部調(diào)用外部代碼時常常會引發(fā)錯誤調(diào)用。

●解決方法

良好的軟件系統(tǒng)設(shè)計需要將函數(shù)設(shè)計為實現(xiàn)單一功能,并且有一個自頂向下的抽象層??s短代碼函數(shù)以便于閱讀、理解和維護(hù)代碼。盡可能調(diào)用已有成熟的開源編程實現(xiàn)的函數(shù)。

(5)異常

●癥狀

異常處理功能提供了處理程序運(yùn)行時出現(xiàn)的任何意外或異常情況的方法。異常處理使用 try、catch和finally關(guān)鍵字來處理可能未成功的操作和失敗,以及在事后清理資源。通過異常處理,可以對用戶在程序中的非法輸入進(jìn)行控制和提示,以防程序崩潰。在項目代碼中使用超級異常包裝各種錯誤代碼,范圍跨度太大,不能較好地適用于不同的異常情況,同時導(dǎo)致錯誤處理和日志記錄幾乎發(fā)生在每種方法中,十分冗余和低效。

●解決方法

為不同的情況定義不同的異常類型,通過try{} catch()子句中的類型處理異常。并且僅使用運(yùn)行時異常。如果錯誤處理的唯一操作是日志記錄,則在每個模塊的入口點(diǎn)只執(zhí)行一次。設(shè)計時,定義異常需考慮層次、細(xì)分情況和系統(tǒng)產(chǎn)品界面友好。

程序中的關(guān)鍵代碼如下:

3.2 測試代碼優(yōu)化

自動化測試是代碼重構(gòu)的先決條件和重要步驟。沒有構(gòu)建完備的自動化測試環(huán)境,即使代碼優(yōu)化完成后,也無法驗證是否每一個修改動作是否是正確的。因此,構(gòu)建和優(yōu)化自動測試代碼也十分必要。

(1)單元測試設(shè)計與風(fēng)格

●癥狀

通常而言,一個單元測試是用于判斷某個特定條件下某個特定函數(shù)的行為。然而,在項目代碼中單元測試代碼數(shù)量巨大,一個案例測試了多個功能,單個案例中包括多個“assert”語句,顯得十分冗長。在單元測試代碼中沒有“Given-When-Then”代碼風(fēng)格結(jié)構(gòu),易讀性差。

●解決方法

每個單元測試按照“Given-When-Then”代碼風(fēng)格寫,使邏輯結(jié)構(gòu)清晰,提高易讀性。每個案例只專注測試一個函數(shù),減少測試代碼行數(shù)。

程序中的關(guān)鍵代碼如下:

●癥狀

mock測試是在測試過程中,對于某些不容易構(gòu)造或者不容易獲取的對象,用一個虛擬的對象來創(chuàng)建以便測試的測試方法。偽依賴的實現(xiàn)在單元測試中被用作mock,有時測試目標(biāo)本身被部mock。更糟的是使用Java反射機(jī)制,并且當(dāng)設(shè)置mock對象時,方法名稱被硬編碼為字符串。一半的測試代碼是關(guān)于設(shè)置mock,而不是關(guān)于測試開發(fā)代碼本身。

●解決方法

所有的mock由mock框架動態(tài)創(chuàng)建的,沒有實際的mock類代碼。測試目標(biāo)是真正的實現(xiàn)代碼,注入所有mock依賴項。使用代理對象、模擬對象和輔助對象來隔離網(wǎng)絡(luò),數(shù)據(jù)庫,文件和用戶接口。設(shè)置mock時使用智能默認(rèn)設(shè)置,可以減少mock代碼。不要用硬編碼設(shè)置方法名,mock最多用來測靜態(tài)方法。

(3)覆蓋率

●癥狀

測試覆蓋是對測試完全程度的評測。測試覆蓋是由測試需求和測試用例的覆蓋或已執(zhí)行代碼的覆蓋表示。測試代碼中路徑覆蓋似乎很好,但事實上一些邊界和特殊條件并沒有測試。一些測試用例沒有驗證到任何功能,它們只是用來制造一個不錯的覆蓋率。

●解決方法

刪除無用的測試保證測試單元測試用例有用且有效。不要為了覆蓋率在單元測試中制造空的測試函數(shù)。即使覆蓋數(shù)量已經(jīng)達(dá)到目標(biāo),繼續(xù)優(yōu)化邊界和異常測試。

4 重構(gòu)結(jié)果分析

表1展示了項目其中三個模塊代碼重構(gòu)前后一些參數(shù)的對比,可以清晰的看到,代碼行數(shù)、方法復(fù)雜度和類復(fù)雜度有在一定程度上減少,有效地減少了軟件容量。而單元測試覆蓋率和事務(wù)成功率的增加間接說明軟件質(zhì)量得到保證、性能提高。

表1 相關(guān)參數(shù)比較

5 結(jié)語

一方面,軟件質(zhì)量得到巨大的改進(jìn),具體體現(xiàn)在冗余代碼歸類、抽象提取和刪除,結(jié)構(gòu)重新設(shè)計、減少時間復(fù)雜度,使代碼易讀,便于維護(hù)。另一方面,通過項目實踐增強(qiáng)對重構(gòu)代碼的理解,掌握了如何結(jié)合實際情況構(gòu)建重構(gòu)的方法。維護(hù)工作減少,參與重構(gòu)工作的人員的業(yè)務(wù)能力提高,對代碼邏輯有了清晰的認(rèn)識。

未來研究設(shè)計重構(gòu)驅(qū)動開發(fā)的方法及工具,選擇最優(yōu)架構(gòu)方案,避免多次修改代碼,破壞整體架構(gòu)以及付出巨大的人力開銷。探索更多地使用于不同規(guī)模、用途的軟件系統(tǒng)的代碼重構(gòu)方案,以便提高工業(yè)界生產(chǎn)效率,保證產(chǎn)品質(zhì)量。

[1]Martin Fowler.Refactoring:Improving the Design of Existing Code[M].America:Addison-Wesley Professional,1999.

[2]陳林,徐寶文,周曉宇等.一種基于類型約束的泛型Java程序重構(gòu)方法[J].電子學(xué)報,2007:35(s2):185-191.

[3]Kataoka Y,Imai T,Andou H,et al.A Quantitative Evaluation of Maintainability Enhancement by Refactoring[C].Software Maintenance,2002.Proceedings.International Conference on.IEEE,2002:576-585.

[4]Van Deursen A,Moonen L,van den Bergh A,et al.Refactoring Test Code[C].Proceedings of the 2nd International Conference on Extreme Programming and Flexible Processes in Software Engineering,2001:92-95.

[5]Du Bois B,Demeyer S,Verelst J.Refactoring-Improving Coupling and Cohesion of Existing Code[C].Reverse Engineering,2004.Proceedings.11th Working Conference on.IEEE,2004:144-151.

作者簡介:

Application of Code Refactoring in Agile Development

XIAN Xi
(College of Computer Science,Sichuan University,Chengdu 610065)

Software products blow up the trend that continues to increase due to the vigorous development of the Internet.Many companies choose agile development models to save time costs.At the same time,the need for continuous improvement and improvement of software,which lead software become more and more complex as well as the maintenance costs increased.Therefore,the code refactoring is very important.Summarizes the improved methods of optimizing the code by referring to a large number of documents and relying on the project experience,and shows the improvement of performance with result makes the software easier to understand and maintain.

Refactoring;Agile Development;Improvement Methods

1007-1423(2017)09-0123-05

10.3969/j.issn.1007-1423.2017.09.028

,女,四川成都人,碩士,研究方向為軟件質(zhì)量保證與測試

2017-03-11

2017-03-20

猜你喜歡
單元測試代碼重構(gòu)
長城敘事的重構(gòu)
攝影世界(2022年1期)2022-01-21 10:50:14
北方大陸 重構(gòu)未來
創(chuàng)世代碼
動漫星空(2018年11期)2018-10-26 02:24:02
創(chuàng)世代碼
動漫星空(2018年2期)2018-10-26 02:11:00
創(chuàng)世代碼
動漫星空(2018年9期)2018-10-26 01:16:48
創(chuàng)世代碼
動漫星空(2018年5期)2018-10-26 01:15:02
北京的重構(gòu)與再造
商周刊(2017年6期)2017-08-22 03:42:36
論中止行為及其對中止犯的重構(gòu)
一年級上冊第五單元測試
一年級上冊一、二單元測試
九龙县| 鲜城| 兴国县| 江川县| 双桥区| 无锡市| 呈贡县| 福安市| 阿拉善左旗| 新和县| 大丰市| 栾川县| 宜阳县| 邵阳市| 东安县| 上林县| 六枝特区| 太白县| 长葛市| 壶关县| 平安县| 双流县| 平原县| 木兰县| 赤峰市| 民勤县| 安仁县| 库伦旗| 资兴市| 河东区| 炉霍县| 依兰县| 清新县| 石楼县| 乳山市| 肃北| 嵊泗县| 通山县| 富阳市| 依安县| 西城区|