亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        代碼重構(gòu)的作用和時機

        2015-02-23 22:30:25金戈
        現(xiàn)代計算機 2015年2期
        關(guān)鍵詞:程序設(shè)計

        金戈

        (廣州賽寶認證中心,廣州 510610)

        代碼重構(gòu)的作用和時機

        金戈

        (廣州賽寶認證中心,廣州 510610)

        軟件的修改會不斷地產(chǎn)生技術(shù)債務(wù),而重構(gòu)是償還技術(shù)債務(wù)的有效方法。對代碼重構(gòu)的作用進行歸納,體現(xiàn)在改進軟件設(shè)計,幫助理解代碼、發(fā)現(xiàn)缺陷和提升效率等方面;并分析在添加新功能、修改錯誤和代碼評審這三個重構(gòu)的時機。

        代碼重構(gòu);軟件;技術(shù)債務(wù)

        0 引言

        在面對不斷變化的需求時,由于倉促實現(xiàn)某些功能特性而對代碼庫及其架構(gòu)產(chǎn)生的破壞,就會產(chǎn)生一種技術(shù)債務(wù),如果現(xiàn)在不解決,這些債務(wù)遺留下來就會阻礙未來開發(fā)。而且,技術(shù)債務(wù)有一個致命的特點,那就是會利滾利。如果開發(fā)者在一個類中欠下了技術(shù)債務(wù),之后的程序又對這個類進行了擴展和修改,再后的程序?qū)U展后的程序又做出了更大的擴展,或者說后來的程序在一些功能的寫法上參照了欠下債務(wù)的類,那么這個債務(wù)就會產(chǎn)生非常大的利息,甚至于超過了債務(wù)本身。用不了太多時間就會發(fā)現(xiàn),這份技術(shù)債務(wù)已經(jīng)無力償還了。因此,在開發(fā)過程中首先盡量不要欠下技術(shù)債務(wù),其次一旦迫不得已欠下了債務(wù),就應(yīng)該以最快的速度償還,時間拖得越久,償還債務(wù)的負擔(dān)也就會越重。

        而如何償還技術(shù)債務(wù)的答案就是重構(gòu)。重構(gòu)就是對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本。

        設(shè)計人員都會面臨這樣的難題,要設(shè)計一個可以應(yīng)對各種變化、擴展靈活的產(chǎn)品是非常困難的。大部分設(shè)計人員,尤其是交付型項目的設(shè)計人員,往往沒有足夠的時間去詳細設(shè)計產(chǎn)品的每個細節(jié),在后續(xù)開發(fā)中進行設(shè)計的調(diào)整在所難免。隨著代碼的不斷修改,系統(tǒng)的整體結(jié)構(gòu)會變得混亂,代碼質(zhì)量慢慢沉淪,從而欠下越來越多的技術(shù)債務(wù),阻礙整個系統(tǒng)后期的改變和發(fā)展。

        重構(gòu)則是一個相反的過程,它的每一個步驟都很簡單,開發(fā)者只需要把某個函數(shù)中的一段代碼拉出來形成一個新的函數(shù),或者把一些方法在繼承體系內(nèi)進行移動,甚至修改一些變量名稱和注釋就可以了。這樣,每一次微小的修改積累起來就可以從本質(zhì)上改善設(shè)計和代碼的質(zhì)量。

        1 代碼重構(gòu)的作用

        當項目為了完成快速交付時,往往沒有很多精力關(guān)注在設(shè)計和代碼的結(jié)構(gòu)上,隨著代碼的增多,代碼逐漸失去了自身的結(jié)構(gòu)。這種結(jié)構(gòu)的流失累積到一定程度的時候,對代碼的理解就會變得越來越困難。

        再加上項目的需求總是不斷地變化,項目組需要不斷地對現(xiàn)有的系統(tǒng)進行修改和完善。為了盡快實現(xiàn)這些變更,不可避免地要違反最初的設(shè)計。因此軟件的結(jié)構(gòu)就會出現(xiàn)混亂,容易導(dǎo)致項目bug越來越多,軟件的維護越來越困難。

        重構(gòu)能夠最大限度地避免以上這些現(xiàn)象的出現(xiàn)。當項目開發(fā)到一定程度后,對系統(tǒng)使用重構(gòu)的方式,在不改變系統(tǒng)外部功能的情況下,對內(nèi)部的結(jié)構(gòu)進行重新的整理。不斷完善系統(tǒng)的結(jié)構(gòu),使系統(tǒng)對需求的變更始終具有較強的適應(yīng)能力。

        通過重構(gòu),可以帶來以下幾方面的好處:

        (1)可以改進軟件的設(shè)計

        人們在修改和維護代碼時往往只考慮短期內(nèi)的目的,或者沒有完全理解軟件的整體設(shè)計,這樣程序就會逐漸失去原有的結(jié)構(gòu),也越來越難以通過閱讀源代碼來理解軟件原來的設(shè)計。并且代碼結(jié)構(gòu)的流失是積累性的,越難看出代碼所表示的設(shè)計意圖,也就越難保護其中的設(shè)計。而重構(gòu)就像是對代碼的整理,讓代碼的各個部分處于合理的位置上,通過經(jīng)常性的重構(gòu)來幫助代碼維持自己應(yīng)該有的形態(tài)。

        設(shè)計不良的程序常常會在不同的地方使用完全相同的語句來做同樣的事,從而需要更多的代碼來完成特定的功能。因此消除這些重復(fù)的代碼成為了軟件設(shè)計改進的一個重要方向。雖然簡化代碼并不會讓系統(tǒng)運行得更高效,但卻使未來可能的對程序的修改變得容易的多。

        (2)使軟件代碼更容易理解

        Martin Flower在《重構(gòu)》中有一句經(jīng)典的話:“任何一個傻瓜都能寫出計算機可以理解的程序,只有寫出人類容易理解的程序才是優(yōu)秀的程序員。”

        目前,大部分軟件已經(jīng)不再是通過一個人就可以完成的了,軟件需要大量的人員來進行開發(fā)和維護。為了使代碼容易被他人理解,開發(fā)團隊需要遵照統(tǒng)一的編碼規(guī)范,需要讓代碼寫得更加簡練和可讀性更強。通過代碼的重構(gòu),可以使代碼更加簡潔,使團隊成員更容易理解軟件的設(shè)計思路,也就更容易讀懂代碼。

        (3)幫助發(fā)現(xiàn)隱含在代碼中的缺陷

        開發(fā)人員在進行重構(gòu)的時候,需要對代碼進行理解,搞清楚程序的結(jié)構(gòu)。這時,就容易發(fā)現(xiàn)之前編寫的代碼中沒有關(guān)注到的一些問題。通過重構(gòu),可以將這些問題找出來,加以糾正,使代碼更加健壯、質(zhì)量更高。

        (4)重構(gòu)有助于提高編碼效率

        重構(gòu)沒有改變功能,為什么會提高效率?正如之前所言,重構(gòu)可以幫助改善設(shè)計,而良好的設(shè)計是快速交付的根本。如果設(shè)計出現(xiàn)問題,開發(fā)團隊會發(fā)現(xiàn)需要花大量的時間在設(shè)計不足帶來的修改,以及理解系統(tǒng)等方面的問題上。

        重構(gòu)可以幫助建立良好的設(shè)計,及時找出程序中的問題,使我們的軟件向良性方向發(fā)展,從而減少我們花在理解和返工上的時間,幫助提升編碼的效率。

        在重構(gòu)的這些作用里,和設(shè)計的關(guān)系應(yīng)當顯得尤為重要,它們之間是一種互補的關(guān)系。在傳統(tǒng)觀念里,設(shè)計是軟件開發(fā)的關(guān)鍵環(huán)節(jié),而編碼只是機械式的低級勞動,設(shè)計就像畫工程圖紙而編碼就像施工。但是,軟件和機械、建筑有著很大差異,軟件的可塑性更強,而且完全是思想的體現(xiàn)。因此就產(chǎn)生了另外的一種觀點,認為重構(gòu)可以取代預(yù)先的設(shè)計。這代表我們根本不必做任何設(shè)計,只需按最初的想法進行編碼,讓代碼有效運作,然后再將它重構(gòu)成型。事實上這種方法是可行的,在極限編程中也會倡導(dǎo)這種方法。

        盡管只運用重構(gòu)也能得到效果,但這并不是最有效的途徑,極限編程的愛好者們也會預(yù)先使用諸如CRC卡等方法來檢驗各種不同的想法并得到可接受的解決方案,然后才開始編碼并進行重構(gòu)。這關(guān)鍵在于重構(gòu)改變了預(yù)先設(shè)計的角色。如果沒有重構(gòu),就必須保證設(shè)計完全正確無誤,并且如果將來要對原始設(shè)計做任何修改,代價都會非常高昂。而如果選擇了重構(gòu)并且仍然預(yù)先進行設(shè)計,那么在設(shè)計時只需要得到一個足夠合理的解決方案即可。在實現(xiàn)這個初始的解決方案的時候,開發(fā)者對問題的理解也會逐漸加深,從而可以通過重構(gòu)不斷地完善設(shè)計。如此一來,軟件設(shè)計變得更加簡化。原先在設(shè)計時會力求靈活的解決方案,考慮軟件未來可能變化的方向,并讓這個解決方案能夠適應(yīng)未來的變化,但是靈活的設(shè)計會帶來更高的復(fù)雜性和設(shè)計成本,并且有些靈活性的設(shè)計也未必能派上用場,而項目團隊也無法預(yù)測哪些靈活性未來不會用到。有了重構(gòu),雖然仍需要思考潛在的變化,但卻不必預(yù)先實現(xiàn)所有的設(shè)計,而是只考慮建造當前可運行的最簡方案,以及將這個最簡方案重構(gòu)成一個靈活的方案。

        2 代碼重構(gòu)的時機

        對于何時進行重構(gòu),只要團隊覺得有必要,任何時候都可以開始。如果資源有限,至少可以在以下三個方面開展重構(gòu):

        (1)增加新功能重構(gòu)

        在添加新功能時,為了幫助更好地理解需要修改的代碼,開發(fā)團隊可以對已有的代碼進行重構(gòu)。不論之前的代碼是別人寫的,還是自己寫的,只要需要理解代碼時就可以考慮重構(gòu),這樣可以隨著程序更新的進展而不斷理清代碼結(jié)構(gòu),也可以從中理解更多的東西。當然,除了幫助理解代碼外,還有一個原因就是代碼的設(shè)計無法幫助開發(fā)人員輕松添加新的特性。在理解了原有的設(shè)計后,可以考慮用某種新的方式來設(shè)計,從而使添加新的特性變得簡單,如此就能用重構(gòu)來彌補之前設(shè)計上的不足。重構(gòu)是一個快速流暢的過程,一旦完成重構(gòu),新特性的添加就會更加快速和流暢。

        (2)修改錯誤重構(gòu)

        在軟件調(diào)試過程中,對代碼進行重構(gòu),可以讓代碼更具可讀性。在閱讀代碼并試圖理解它的時候,可以通過重構(gòu)來作為幫助,并且在理解和重構(gòu)的過程中可以找出代碼中的bug,因而當團隊收到缺陷報告的時候,就是需要開始重構(gòu)的信號,這說明代碼還沒有清晰到可以一眼看出缺陷。

        (3)代碼評審重構(gòu)

        很多公司都會做代碼評審,因為這種活動可以改善開發(fā)情況,它有助于在開發(fā)團隊中傳播知識,也有助于讓較有經(jīng)驗的開發(fā)人員把知識傳遞給比較欠缺經(jīng)驗的人,并幫助更多的人理解系統(tǒng)軟件中的內(nèi)容。

        重構(gòu)可以幫助評審別人的代碼。開始重構(gòu)前可以先閱讀別人的代碼,得到一定程度的理解,并提出一些建議。一旦想到一些好的解決方法,就可以通過重構(gòu)來實現(xiàn)它們。開發(fā)團隊可以通過自己動手來實現(xiàn)它們,也可以通過提醒別人來實現(xiàn)它們。重構(gòu)還可以使代碼評審工作得到更具體的結(jié)果。不僅獲得建議,而且其中很多建議能夠立刻實現(xiàn)。

        (4)何時不該重構(gòu)

        當然,在以下情況出現(xiàn)時,開發(fā)團隊不應(yīng)考慮對代碼進行重構(gòu):

        現(xiàn)有代碼太混亂,重構(gòu)不如重寫。當代碼中缺陷非常多,根本無法工作時,應(yīng)考慮對代碼進行重寫而不是重構(gòu)。重構(gòu)的一個前提是代碼能夠在大部分情況下正常運行。

        如果現(xiàn)有研發(fā)活動已經(jīng)接近尾聲,需要盡快交付時,也應(yīng)避免重構(gòu)。因為這時項目可能已經(jīng)沒有時間進行重構(gòu)了。

        3 結(jié)語

        通過代碼重構(gòu),可以幫助開發(fā)團隊理解之前的設(shè)計,幫助發(fā)現(xiàn)代碼中的缺陷,從而提高開發(fā)效率,償還技術(shù)上的債務(wù)。而由于資源和時間的限制,團隊需要確定是否需要重構(gòu),以及重構(gòu)的最佳時機。重構(gòu)的時機可以是軟件開發(fā)過程中覺得需要的任何時候,包括文中提及的三個方面等。

        [1] Martin Fowler.重構(gòu):改善既有代碼的設(shè)計[M].熊節(jié)譯.北京:人民郵電出版社,2010,4

        [2] Robert C.Martin,Micah Martin.敏捷軟件開發(fā):原則、模式與實踐[M].鄧輝,孫鳴譯.北京:人民郵電出版社,2008,1

        [3] 陳容華.軟件代碼重構(gòu)的時機[J].科技資訊,2009(28)

        Effect and Opportunity of Code Refactoring

        JIN Ge
        (CEPREI Certification Body,Guangzhou 510610)

        Code refactoring is an effective method to repay technical debt,which caused by the modification to software.Sums up the effects of code refactoring,including improving software design,helping code understanding,defect discovery and increasing efficiency.Analyzes three opportunities for refactoring:while adding new functions,fixing defects,and code review.

        Code Refactoring;Software;Technical Debt

        1007-1423(2015)02-0051-04

        10.3969/j.issn.1007-1423.2015.02.013

        金戈(1986-),男,安徽合肥人,碩士,工程師,研究方向為質(zhì)量過程改進、軟件工程

        4-11-25

        2014-12-16

        猜你喜歡
        程序設(shè)計
        何為設(shè)計的守護之道?
        《豐收的喜悅展示設(shè)計》
        流行色(2020年1期)2020-04-28 11:16:38
        試論我國未決羈押程序的立法完善
        瞞天過?!律O(shè)計萌到家
        失能的信仰——走向衰亡的民事訴訟程序
        “程序猿”的生活什么樣
        設(shè)計秀
        海峽姐妹(2017年7期)2017-07-31 19:08:17
        有種設(shè)計叫而專
        Coco薇(2017年5期)2017-06-05 08:53:16
        英國與歐盟正式啟動“離婚”程序程序
        創(chuàng)衛(wèi)暗訪程序有待改進
        精品人妻久久一区二区三区| 国产午夜亚洲精品午夜鲁丝片| 色拍自拍亚洲综合图区| 帮老师解开蕾丝奶罩吸乳视频 | 久久精品亚洲热综合一本色婷婷| 久久久精品国产免费看| 极品尤物人妻堕落沉沦| 香港aa三级久久三级| 超薄丝袜足j好爽在线观看| 久久福利青草精品免费| 亚洲中文字幕乱码免费| 性感人妻av在线播放| 日本一区二区免费在线看| 无码日韩精品一区二区免费暖暖| 欧美日韩在线视频一区| 樱桃视频影视在线观看免费| 国产又黄又大又粗视频| 中文字幕有码高清| 99久久精品人妻一区二区三区| 精品人妻久久一区二区三区| 久久99精品国产麻豆不卡| h在线国产| 久久熟女精品—区二区蜜臀| 久草视频这里只有精品| 亚洲av无码一区二区三区人| 97影院在线午夜| 久久狠色噜噜狠狠狠狠97| 久久久成人av毛片免费观看| 亚洲av高清一区二区在线观看| 国产亚洲精品第一综合另类| 亚洲国产成人久久综合下载| 在线国产小视频| 欧美日韩中文字幕日韩欧美| 亚洲av男人的天堂在线| 成人女同av在线观看网站| 久久精品国产亚洲av无码娇色| 熟女人妇交换俱乐部| 国产精品每日更新在线观看 | 亚洲国产精品国自产拍久久蜜av| 韩国av一区二区三区不卡| 亚洲av无码精品色午夜|