當(dāng)前位置:

專家教你如何處理遺留代碼

發(fā)表時(shí)間:2015/7/15 14:54:04 來源:互聯(lián)網(wǎng) 點(diǎn)擊關(guān)注微信:關(guān)注中大網(wǎng)校微信
關(guān)注公眾號(hào)

遺留代碼不可避免

在我們的職業(yè)生涯中,有很多時(shí)候必須忍受遺留代碼?;蛟S,你接受一份新的工作,遺留代碼是你的第一個(gè)任務(wù);或許,你們公司重組,并且有個(gè)產(chǎn)品最終在 你這里完成。不論什么緣由,事實(shí)就是這樣。你想編寫一些新的優(yōu)秀的代碼,但是現(xiàn)在負(fù)責(zé)的是對(duì)于你來說全新的完全不熟悉的一段代碼。這個(gè)代碼看起來相當(dāng)復(fù) 雜、陌生,但你卻不得不接受這項(xiàng)工作。

事實(shí)上,要是我擴(kuò)展一下這個(gè)定義,你就能將任何一段先前編寫的代碼看作遺留代碼。你是否曾經(jīng)嘗試回顧六個(gè)月前你編寫的代碼?忍受你自己所寫的代碼并非總是易事,更何況對(duì)于別人所寫的代碼。如果你不遵循一些基本的指導(dǎo)原則,這兩種情況都是相當(dāng)有挑戰(zhàn)的。

傳統(tǒng)的方法是,在你竭盡全力避免非有意的間接損害的同時(shí),適當(dāng)做些修改。不幸的是,因?yàn)閷?duì)代碼的不熟悉,當(dāng)你改變一個(gè)數(shù)據(jù)結(jié)構(gòu)或者更新一個(gè)變量時(shí),你無法確信將要發(fā)生什么。

與其在這種充滿危險(xiǎn)的境況里盲目地徘徊,還不如制定一個(gè)處理的策略。不要只是作出改變后就期待萬(wàn)事如意。相反,瞄準(zhǔn)目標(biāo),用“BAT”將它擊出棒球場(chǎng)。

處理問題時(shí),你可以三管齊下,構(gòu)建(build),自動(dòng)化(automate)并且測(cè)試(test)。對(duì)遺留代碼可以使用這個(gè)BAT,并且給自己設(shè)置一個(gè)安全網(wǎng)。BAT方法將確保代碼如你所期的那樣繼續(xù)工作。它可以“捕獲”非有意的副作用,幫助你“消滅”它們。

構(gòu)建

要解決的第一個(gè)問題就是構(gòu)建。除非你能可靠地構(gòu)建它,不然測(cè)試一個(gè)產(chǎn)品很困難。先解決如何在你的電腦上干凈地構(gòu)建該產(chǎn)品,然后再編寫構(gòu)建腳本。

有 時(shí)候這是個(gè)不成問題的問題,但通常構(gòu)建不是總能夠如期待的一樣的干凈。構(gòu)建通常局限于單一機(jī)器或者一個(gè)特殊的環(huán)境。在團(tuán)隊(duì)中,當(dāng)代碼在代碼所有者間傳遞 時(shí),很容易積累一些臨時(shí)的構(gòu)建需求。每個(gè)所有者可以添加他/她自己的特殊需求,并且混合在一起。當(dāng)你接手這攤子事情時(shí),廚房里可能已經(jīng)有了很多的廚子。

一個(gè)復(fù)雜的構(gòu)建能夠引發(fā)整個(gè)產(chǎn)品一連串的問題。

當(dāng)一件事情困難時(shí),人們就很少去完成它。當(dāng)一個(gè)構(gòu)建困難時(shí),人們就很少去構(gòu)建它。這是人的天性。運(yùn)行一個(gè)干凈構(gòu)建的能力正在成為一種黑色藝術(shù),在你的工作環(huán)境中,只有少部分人才能掌握它。

因?yàn)槟銦o法測(cè)試你未構(gòu)建的事物,使測(cè)試變得不頻繁。當(dāng)人們最終運(yùn)行他們的測(cè)試時(shí),他們發(fā)現(xiàn)了更多的缺陷…不頻繁的測(cè)試使得缺陷有更多的時(shí)間積聚。如果你每天都運(yùn)行測(cè)試,那么只需要你報(bào)告當(dāng)天的缺陷。如果你等6個(gè)月后去測(cè)試,你將會(huì)有很多的問題去處理。

因此測(cè)試變得繁重。測(cè)試者厭煩了測(cè)試周期內(nèi)的所有工作,所以他們?cè)噲D避免測(cè)試工作。沒人喜歡記錄十幾個(gè)或者幾百個(gè)缺陷這種無聊的工作。

開發(fā)者開始畏懼測(cè)試周期,因?yàn)樗麄兏杏X自己象被所有的缺陷報(bào)告進(jìn)行轟炸。所以開發(fā)者開始怨恨,并且叨擾測(cè)試者。這使得測(cè)試周期更加痛苦。這真是一個(gè)惡性反饋循環(huán)。

復(fù)雜的構(gòu)建給整個(gè)產(chǎn)品生命周期帶來一些問題。所以必須要保證構(gòu)建是干凈的。

當(dāng)任何人都能構(gòu)建時(shí),任何人也就都能進(jìn)行測(cè)試,于是也就會(huì)更加頻繁地運(yùn)行測(cè)試,產(chǎn)生出更小范圍的缺陷報(bào)告。一次少量的工作就意味著更少的瑣事。任何人都愿意搬動(dòng)一桶涂料并且不用三思,但是如果讓人去搬五百桶涂料,看看他們會(huì)說什么。

你的目標(biāo)就是創(chuàng)建一個(gè)能夠在任何開發(fā)機(jī)器上易于運(yùn)行、易于維護(hù)的干凈的構(gòu)建。使用一個(gè)構(gòu)建腳本工具或者語(yǔ)言,例如Rake、Ant、Maven或者Nant.這些高層次的構(gòu)建語(yǔ)言使你能聚焦于構(gòu)建自己的應(yīng)用程序,而不是構(gòu)建、語(yǔ)言或者平臺(tái)等細(xì)節(jié)。

當(dāng)你可以僅用一句命令(如ant all)來構(gòu)建產(chǎn)品,你就能繼續(xù)到下一步。確保在不止一臺(tái)機(jī)器上測(cè)試這一步。

我想請(qǐng)你試著用BAT方式來處理遺留代碼。 看看與日常工作相比的區(qū)別是什么,是否需要用不同的手段處理工作。

自動(dòng)化

現(xiàn)在你已經(jīng)可以在任何一臺(tái)機(jī)器上自動(dòng)構(gòu)建你的產(chǎn)品了,那么讓我們來使它自動(dòng)化吧。

自動(dòng)化的目標(biāo)是自動(dòng)化整個(gè)構(gòu)建,在一臺(tái)干凈的機(jī)器上,在測(cè)試周期內(nèi),使人為干預(yù)最小化。使萬(wàn)事自動(dòng)化并非都有可能。但是我們希望達(dá)到的目標(biāo)是,把那些可以被合理的自動(dòng)化執(zhí)行的東西都寫入腳本。

有時(shí),安裝和配置一個(gè)軟件要比編寫一個(gè)腳本來自動(dòng)安裝和配置更為容易。只需一次性安裝的應(yīng)用程序當(dāng)然是首選。諸如編譯器,運(yùn)行庫(kù)和已存的數(shù)據(jù)集都屬于這一 類。不要試圖花費(fèi)兩個(gè)小時(shí)去復(fù)制已存的數(shù)據(jù)集。但是,如果你能在30秒內(nèi)重建一個(gè)代表性的數(shù)據(jù)集,那么你便應(yīng)該從頭開始。以一個(gè)干凈的已知的數(shù)據(jù)集開始的 好處非常大,但是并非總是符合實(shí)際。不要因?yàn)橹亟愕臄?shù)據(jù),將15分鐘的測(cè)試變?yōu)橐粋€(gè)小時(shí)。

要確保記錄下任何一個(gè)手動(dòng)步驟及所有指令,它們可以為其他想復(fù)制運(yùn)行環(huán)境的人提供幫助。

另一方面,為什么你應(yīng)該整天監(jiān)視著全部的構(gòu)建?時(shí)間是寶貴的。IDE或多或少都是可以進(jìn)行增量構(gòu)建(incremental build)和運(yùn)行細(xì)粒度單元測(cè)試(small unit test)。很多時(shí)候,這種部分覆蓋(partial coverage)已經(jīng)夠用了。讓開發(fā)人員針對(duì)活動(dòng)的代碼區(qū)域(active code area),運(yùn)行一組冒煙測(cè)試(smoke test),就可以覆蓋大多數(shù)情況。

編輯推薦

JAVA認(rèn)證考試報(bào)考指南 / 更多JAVA考試資料


(責(zé)任編輯:)

2頁(yè),當(dāng)前第1頁(yè)  第一頁(yè)  前一頁(yè)  下一頁(yè)
最近更新 考試動(dòng)態(tài) 更多>