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

?

代碼重構(gòu)的作用和時(shí)機(jī)

2015-02-23 22:30金戈
現(xiàn)代計(jì)算機(jī) 2015年2期
關(guān)鍵詞:代碼重構(gòu)債務(wù)

金戈

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

代碼重構(gòu)的作用和時(shí)機(jī)

金戈

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

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

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

0 引言

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2 代碼重構(gòu)的時(shí)機(jī)

對(duì)于何時(shí)進(jìn)行重構(gòu),只要團(tuán)隊(duì)覺(jué)得有必要,任何時(shí)候都可以開(kāi)始。如果資源有限,至少可以在以下三個(gè)方面開(kāi)展重構(gòu):

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

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

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

在軟件調(diào)試過(guò)程中,對(duì)代碼進(jìn)行重構(gòu),可以讓代碼更具可讀性。在閱讀代碼并試圖理解它的時(shí)候,可以通過(guò)重構(gòu)來(lái)作為幫助,并且在理解和重構(gòu)的過(guò)程中可以找出代碼中的bug,因而當(dāng)團(tuán)隊(duì)收到缺陷報(bào)告的時(shí)候,就是需要開(kāi)始重構(gòu)的信號(hào),這說(shuō)明代碼還沒(méi)有清晰到可以一眼看出缺陷。

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

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

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

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

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

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

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

3 結(jié)語(yǔ)

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

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

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

[3] 陳容華.軟件代碼重構(gòu)的時(shí)機(jī)[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-),男,安徽合肥人,碩士,工程師,研究方向?yàn)橘|(zhì)量過(guò)程改進(jìn)、軟件工程

4-11-25

2014-12-16

猜你喜歡
代碼重構(gòu)債務(wù)
視頻壓縮感知采樣率自適應(yīng)的幀間片匹配重構(gòu)
長(zhǎng)城敘事的重構(gòu)
北方大陸 重構(gòu)未來(lái)
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
創(chuàng)世代碼
家庭日常生活所負(fù)債務(wù)應(yīng)當(dāng)認(rèn)定為夫妻共同債務(wù)
北京的重構(gòu)與再造
萬(wàn)億元債務(wù)如何化解
玛多县| 汤阴县| 孝昌县| 甘南县| 杂多县| 石城县| 东阳市| 九龙坡区| 东丰县| 日土县| 奉化市| 防城港市| 西藏| 手游| 镇原县| 曲松县| 渝北区| 崇州市| 华容县| 郧西县| 铜鼓县| 奉贤区| 南投市| 博罗县| 滨州市| 明溪县| 多伦县| 花莲市| 汉川市| 七台河市| 盐山县| 龙山县| 仲巴县| 基隆市| 拜泉县| 兴文县| 白沙| 定西市| 沾益县| 安阳县| 杭锦后旗|