
最近和一位朋友聊到軟件開(kāi)發(fā)中的代碼重構(gòu)這個(gè)話(huà)題,諸如重構(gòu)原則包括時(shí)機(jī)的考慮、間接層擴(kuò)展、投入產(chǎn)出平衡點(diǎn)等問(wèn)題。于是本人將以前買(mǎi)的《重構(gòu):改善既有代碼的設(shè)計(jì)》這本書(shū)又拿起來(lái)讀了一遍,并對(duì)部分章節(jié)做了讀書(shū)筆記。
對(duì)于這本書(shū),可能很多人已經(jīng)閱讀過(guò),總體上還是挺經(jīng)典的。這里結(jié)合自己的理解,我把其中比較重要的地方做了一些提煉,主要分析梳理重構(gòu)原則相關(guān)內(nèi)容。
1. 重構(gòu)的定義
重構(gòu)是對(duì)軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,主要是在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu),以提高軟件代碼的可理解性,并降低修改成本。
這里要注意代碼重構(gòu)中的兩頂帽子:一是添加新功能時(shí),不要修改已有代碼;二是在重構(gòu)時(shí),只管改進(jìn)程序結(jié)構(gòu),不去添加新功能。
簡(jiǎn)單來(lái)說(shuō),就是將添加新功能與代碼重構(gòu)這兩項(xiàng)工作分開(kāi)處理、不混在一起。因?yàn)橹貥?gòu)的基本前提就是不影響軟件的功能特性,而且分開(kāi)處理,也可以降低重構(gòu)難度。
2. 重構(gòu)的時(shí)機(jī)
我們對(duì)軟件代碼進(jìn)行重構(gòu),可能是為了改進(jìn)軟件設(shè)計(jì),也可能是試圖讓代碼更容易理解,或是為了幫助發(fā)現(xiàn)潛在bug,那么,什么時(shí)候應(yīng)該考慮重構(gòu)?也即重構(gòu)時(shí)機(jī)問(wèn)題。
作者M(jìn)artin Fowler認(rèn)為,應(yīng)該考慮重構(gòu)的時(shí)機(jī),有三個(gè):添加功能時(shí)、修補(bǔ)錯(cuò)誤時(shí)、復(fù)審代碼時(shí)。
在添加新功能時(shí),是否需要重構(gòu),還有一個(gè)輔助的參考判斷,就是改用其他設(shè)計(jì)方式,是否可以簡(jiǎn)化我們的工作,或者說(shuō),重構(gòu)之后是否可以更快、更方便地添加新功能。
與之對(duì)應(yīng)地,不應(yīng)該重構(gòu)的時(shí)機(jī),又分別包括:現(xiàn)有代碼根本不能正常運(yùn)行時(shí)、項(xiàng)目進(jìn)度不允許時(shí)。
因?yàn)榇a重構(gòu)工作一般都需要足夠的時(shí)間,這里就需要我們結(jié)合當(dāng)前項(xiàng)目狀態(tài)和軟件版本計(jì)劃綜合評(píng)估。例如在項(xiàng)目后期,產(chǎn)品即將發(fā)貨時(shí),軟件版本的穩(wěn)定性和發(fā)貨時(shí)間更為重要。這時(shí)候就不太適合啟動(dòng)代碼重構(gòu)了。
3. 間接層
除了重構(gòu)時(shí)機(jī)之外,還有一個(gè)問(wèn)題也是需要關(guān)注的,就是間接層的增加與刪除。
間接層也可以叫中間層或者適配層,主要是用來(lái)減少耦合、隔離變化、復(fù)用邏輯,這里還是根據(jù)使用場(chǎng)景,評(píng)估投入產(chǎn)出,預(yù)期收益大于重構(gòu)的付出時(shí),考慮引入中間層。
例如,移動(dòng)終端上,我們需要讓一套應(yīng)用代碼運(yùn)行在多個(gè)平臺(tái),減少代碼維護(hù)工作量。典型的場(chǎng)景是:不同芯片廠家或者不同的芯片系列往往分別對(duì)應(yīng)一個(gè)平臺(tái)。這時(shí)候可以在各個(gè)平臺(tái)框架層與應(yīng)用層之間增加一個(gè)間接層,來(lái)適配不同平臺(tái)框架接口的差異對(duì)應(yīng)用層代碼的影響。
這個(gè)間接層可以考慮放在應(yīng)用層里面,也可以放在平臺(tái)框架層擴(kuò)展,更多的時(shí)候,在應(yīng)用層和平臺(tái)框架層都需要擴(kuò)展修改,還看這個(gè)應(yīng)用所依賴(lài)的框架層接口,在不同平臺(tái)間的差異有哪些。
關(guān)于代碼重構(gòu),暫時(shí)先到這里,后面繼續(xù)探討,歡迎關(guān)注。