• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

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

      鮮茜

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

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

      鮮茜

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

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

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

      0 引言

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

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

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

      1 相關(guān)工作

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

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

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

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

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

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

      ②構(gòu)建堅(jiān)實(shí)的測(cè)試

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

      2.2 重構(gòu)步驟

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

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

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

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

      ●癥狀

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

      ●解決方法

      打破依賴,有一個(gè)明確的數(shù)據(jù)和邏輯的分離,讓所有服務(wù)對(duì)象無(wú)狀態(tài),狀態(tài)駐留在請(qǐng)求對(duì)象本身。所有的服務(wù)方法的請(qǐng)求對(duì)象作為輸入?yún)?shù),這樣使得每個(gè)服務(wù)對(duì)象可以一次創(chuàng)建并為多個(gè)請(qǐ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ì),有時(shí)往往會(huì)對(duì)此認(rèn)識(shí)不清晰。沒(méi)有明確的泛化關(guān)系,而依賴關(guān)系是由調(diào)用者從靜態(tài)工廠方法和獲取使用之前初始化。而且代碼中存在工廠模式的錯(cuò)誤使用導(dǎo)致代碼冗余、代碼層次多余、結(jié)構(gòu)紊亂等問(wèn)題。很難闡述代碼變化的影響,而且容易創(chuàng)建一個(gè)循環(huán)引用關(guān)系。

      ●解決方法

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

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

      ●癥狀

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

      ●解決方法

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

      (4)功能函數(shù)

      ●癥狀

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

      ●解決方法

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

      (5)異常

      ●癥狀

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

      ●解決方法

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

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

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

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

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

      ●癥狀

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

      ●解決方法

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

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

      ●癥狀

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

      ●解決方法

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

      (3)覆蓋率

      ●癥狀

      測(cè)試覆蓋是對(duì)測(cè)試完全程度的評(píng)測(cè)。測(cè)試覆蓋是由測(cè)試需求和測(cè)試用例的覆蓋或已執(zhí)行代碼的覆蓋表示。測(cè)試代碼中路徑覆蓋似乎很好,但事實(shí)上一些邊界和特殊條件并沒(méi)有測(cè)試。一些測(cè)試用例沒(méi)有驗(yàn)證到任何功能,它們只是用來(lái)制造一個(gè)不錯(cuò)的覆蓋率。

      ●解決方法

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

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

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

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

      5 結(jié)語(yǔ)

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

      未來(lái)研究設(shè)計(jì)重構(gòu)驅(qū)動(dòng)開(kāi)發(fā)的方法及工具,選擇最優(yōu)架構(gòu)方案,避免多次修改代碼,破壞整體架構(gòu)以及付出巨大的人力開(kāi)銷。探索更多地使用于不同規(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é)報(bào),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.

      作者簡(jiǎn)介:

      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

      ,女,四川成都人,碩士,研究方向?yàn)檐浖|(zhì)量保證與測(cè)試

      2017-03-11

      2017-03-20

      猜你喜歡
      單元測(cè)試代碼重構(gòu)
      長(zhǎng)城敘事的重構(gòu)
      攝影世界(2022年1期)2022-01-21 10:50:14
      北方大陸 重構(gòu)未來(lái)
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      創(chuàng)世代碼
      北京的重構(gòu)與再造
      商周刊(2017年6期)2017-08-22 03:42:36
      論中止行為及其對(duì)中止犯的重構(gòu)
      一年級(jí)上冊(cè)第五單元測(cè)試
      一年級(jí)上冊(cè)一、二單元測(cè)試
      武义县| 虎林市| 荣昌县| 岳西县| 交口县| 白水县| 财经| 汤阴县| 敦煌市| 富源县| 丰县| 梅河口市| 色达县| 广西| 镇原县| 阜平县| 民县| 湖南省| 班戈县| 卢湾区| 绿春县| 山阳县| 沧源| 木兰县| 聂拉木县| 杭锦旗| 永泰县| 开封市| 荃湾区| 栾川县| 唐河县| 海丰县| 平湖市| 德阳市| SHOW| 江门市| 上饶县| 福安市| 北碚区| 毕节市| 芦山县|