從開發(fā)編碼伊始,重構(gòu)的事情就一次次被提起。重構(gòu)的基本操作往往是利用項(xiàng)目間隙,或者項(xiàng)目空閑時(shí)間,對代碼做優(yōu)化,做結(jié)構(gòu)調(diào)整,做相關(guān)方法或者類的抽取。然而往往這時(shí)候,線上的系統(tǒng)正在較穩(wěn)定地運(yùn)行著,開發(fā)的改造工作無法的到較準(zhǔn)確,較真實(shí)的驗(yàn)證,一些細(xì)小的點(diǎn)往往會被忽視,或者遺漏。再者,參與重構(gòu)的人員對系統(tǒng)的了解與熟悉程度,對業(yè)務(wù)的了解與認(rèn)知,編碼的能力,往往都有較高要求。這些現(xiàn)狀與原因,往往導(dǎo)致重構(gòu)的工作常常難以下手。
重構(gòu),它是一套嚴(yán)謹(jǐn)而安全的過程方法,它通過一系列行之有效的方法與措施,保證軟件在優(yōu)化的同時(shí),不會引入新的BUG,保證軟件改造的質(zhì)量。
系統(tǒng)重構(gòu),就是在不改變軟件外部行為的基礎(chǔ)上,改變軟件內(nèi)部的結(jié)構(gòu),使其更加易于閱讀、易于維護(hù)和易于變更。
系統(tǒng)重構(gòu)不是那種冒著極大風(fēng)險(xiǎn)進(jìn)行的代碼修改,而是必須保證修改前后輸入輸出的一致。為此,貫穿整個(gè)重構(gòu)過程的是不斷的測試。起初這種測試是手工測試,隨后逐漸轉(zhuǎn)變?yōu)樽詣?dòng)化測試。每修改一點(diǎn)點(diǎn)就進(jìn)行一個(gè)測試,再修改一點(diǎn)點(diǎn)。
現(xiàn)階段軟件的規(guī)模會越來越大,需求越來越多,生命周期也會越來越長。系統(tǒng)需要保持長期的維護(hù),才能保證其正常運(yùn)行。如果不做優(yōu)化與重構(gòu),系統(tǒng)將會變得越來越臃腫,遺留的問題會越來越多,維護(hù)的成本會越來越大。隨著需求的不斷累加,線上運(yùn)行的軟件系統(tǒng),會不斷累積各種業(yè)務(wù)邏輯,推倒重來的方案也會變得越來越難以實(shí)現(xiàn)。
應(yīng)用軟件在功能迭代,產(chǎn)品的功能在豐富,業(yè)務(wù)場景在變化,軟件實(shí)現(xiàn)的版本是在不斷累加,業(yè)務(wù)邏輯的代碼在不斷增多。僅應(yīng)用包的大小逐漸變成大?,F(xiàn)有的復(fù)雜的業(yè)務(wù)邏輯,和穩(wěn)定的用戶群,首先需要保證的是軟件的穩(wěn)定,業(yè)務(wù)正常運(yùn)作,軟件的生命周期會一直延續(xù)下去,推倒重來已經(jīng)變得不現(xiàn)實(shí),這樣的情況下代碼需要重構(gòu),需要優(yōu)化,簡化代碼,利于維護(hù)。
軟件系統(tǒng)的重構(gòu)要求“兩頂帽子”原則,1、先對原有程序做重構(gòu),以適應(yīng)新的功能2、實(shí)現(xiàn)新功能
在新需求接入進(jìn)項(xiàng)目時(shí),就需要考慮代碼重構(gòu)問題。高質(zhì)量的軟件設(shè)計(jì)當(dāng)軟件需求發(fā)生變更時(shí),應(yīng)當(dāng)根據(jù)業(yè)務(wù)邏輯的特點(diǎn),對原有程序結(jié)構(gòu)進(jìn)行調(diào)整然后再調(diào)整后的程序結(jié)構(gòu)上實(shí)現(xiàn)新的需求。當(dāng)軟件需求發(fā)生變更時(shí),業(yè)務(wù)邏輯開始變得復(fù)雜,一些功能需要解耦,另一些功能需要擴(kuò)展。如果軟件結(jié)構(gòu)沒有及時(shí)進(jìn)行調(diào)整以適應(yīng)新的需求,程序代碼就會變得凌亂,軟件開始退化
在對新功能設(shè)計(jì)開發(fā)的時(shí)候,應(yīng)當(dāng)盡量避免過度設(shè)計(jì),預(yù)留較多的預(yù)先設(shè)計(jì)接口與擴(kuò)展點(diǎn)。在需求實(shí)現(xiàn)過程中,有過類似的問題,過度的設(shè)計(jì),導(dǎo)致當(dāng)前開發(fā)周期的延長,降低了代碼的可讀性。然而在后續(xù)的運(yùn)營與應(yīng)用中,并沒有應(yīng)用上預(yù)先設(shè)計(jì)的功能,或者預(yù)設(shè)計(jì)的功能不能滿足新的業(yè)務(wù)需求。
業(yè)務(wù)功能開發(fā)時(shí)采用小步快跑的開發(fā)模式,用最快的速度開發(fā)一個(gè)最核心的功能,讓第一個(gè)版本運(yùn)行起來并可以驗(yàn)證。在第一個(gè)版本的基礎(chǔ)上不斷添加新功能,對添加的功能進(jìn)行驗(yàn)證并使其可運(yùn)行,每次添加新功能時(shí)如果需要應(yīng)當(dāng)適時(shí)進(jìn)行重構(gòu),復(fù)雜的系統(tǒng)是由一次次正確的開發(fā)積累而成。避免過多的設(shè)計(jì),加快開發(fā)的周期,開發(fā)的過程中加入重構(gòu)操作,有效保證系統(tǒng)代碼的可讀性。
關(guān)于軟件代碼重構(gòu)的方法,總結(jié)主要有
1、關(guān)于具體方法、類的代碼實(shí)現(xiàn)與抽取
將邏輯代碼、判斷語句等根據(jù)復(fù)雜程度,抽取成方法或者方法類,供工程中其他同樣邏輯的代碼區(qū)域調(diào)用,減少代碼的冗余,提高代碼的可讀性。
2、關(guān)于代碼結(jié)構(gòu)的調(diào)整
當(dāng)重復(fù)代碼所在類有并列關(guān)系,或者代碼復(fù)用出現(xiàn)繼承泛濫時(shí),我們需要調(diào)整代碼的結(jié)構(gòu),抽取、封裝成實(shí)體類、父類或者調(diào)整繼承關(guān)系,使用組合關(guān)系。
3、關(guān)于軟件設(shè)計(jì)模式的調(diào)整
代碼的設(shè)計(jì)中使用恰當(dāng)?shù)脑O(shè)計(jì)模式。例如,功能實(shí)現(xiàn)中減少實(shí)體類的直接引用,適時(shí)引入工廠模式,通過抽象接口完成模塊間的調(diào)用,減少代碼耦合,降低了因?yàn)槟K優(yōu)化、更新所帶來的影響,使程序能適應(yīng)新的實(shí)現(xiàn)框架
系統(tǒng)的重構(gòu),我們需要保證系統(tǒng)的穩(wěn)定性,在代碼重構(gòu)時(shí),需要不斷地進(jìn)行驗(yàn)證與測試,保證輸入與輸出的一致性。首先從功能層面上看,重構(gòu)前后,提供給用戶的表現(xiàn)需要一致,其次從代碼層面看,每個(gè)接口,方法的輸入、輸出,在重構(gòu)的前后需要保持一致。重構(gòu)是針對接口內(nèi)部的,但必須保證接口外部是不變的。
所以,系統(tǒng)重構(gòu)的測試可以從兩個(gè)層面來進(jìn)行:系統(tǒng)測試與單元測試。系統(tǒng)測試往往是一種手工測試,單元測試是在編碼中加入相關(guān)的單元測試功能,用于自查重構(gòu)方法的輸入輸出,是否滿足需求,前后一致。
重構(gòu)的價(jià)值是為了降低維護(hù)成本,提高軟件代碼的可讀性與可擴(kuò)展性,可以更加快速地版本迭代。重構(gòu)的實(shí)現(xiàn)是每個(gè)開發(fā)人員都要參與的,貫穿著軟件的生命周期。每一次的需求變更,就是軟件重構(gòu)的契機(jī),先重構(gòu)代碼,以適應(yīng)新的需求,再完成新功能的開發(fā)。采用小步快跑的方式,加快軟件的迭代與功能的更新,保持代碼的簡潔、易用、易維護(hù)。