代碼重構

這段時間一直在作系統重構的工做,記錄下重構的思想和感悟。java

什麼是代碼重構?

這裏引用維基百科的話:「對軟件代碼作任何更動以增長可讀性或者簡化結構而不影響輸出結果」編程

重構既不修正錯誤,又不增長新的功能性。反而它是用於提升代碼的可讀性或者改變代碼內部結構與設計,而且移除死代碼,使其在未來更容易被維護。重構代碼能夠是結構層面或是語意層面,不一樣的重構手段施行時,多是結構的調整或是語意的轉換,但前提是不影響代碼在轉換先後的行爲。特別是,在現有的程序的結構下,給一個程序增長一個新的行爲可能會很是困難,所以開發人員可能先重構這部分代碼,使加入新的行爲變得容易。設計模式

爲何代碼須要重構?

因爲業務的不斷變化需求不斷的增長,致使後期的代碼維護修改變得更加困難,有時候一個簡單的功能,之前作過相似的,但會有少量的改動。通過開發、測試、迴歸,上線有可能也須要幾天。微信

因爲前期爲了快速上線,沒考慮到更多的擴展,沒用到任何設計模式,針對不通的邏輯經過 if 判斷處理,致使代碼愈來愈龐大,代碼可讀性和可維護性變得愈來愈差,每次一點改動都懼怕影響到其餘功能,有的時候還不能給出印象的範圍,致使測試同窗也很是的辛苦,須要迴歸不少功能。函數

若是對現有代碼很難添加新的行爲,我的以爲就應該對現有代碼邏輯進行重構,由於重構也是須要時間來支撐的,應該選擇常常修改而且有時間的時候來重構相關代碼。那應該怎麼進行重構?重構要達到的目的是什麼?下面說說我我的的意見。性能

重構的原則

面向接口編程:意思就是對外層提供接口,定義好入參和返回值,屏蔽底層的實現細節,調用方根本不須要知道和了解這個接口方法的具體實現,全交由實現類去自定義實現。這樣設計的好處一個是解耦,一個是能夠多實現(java是一門多態的語言)。測試

單一職責:也就是一個類只作一件事情,清楚的劃分每一個類本身的任務是什麼,跟它相關的功能代碼才能夠放入該類中。這樣設計的好處是類職責清晰,一看到這個類就知道是幹什麼用的,代碼可讀性和可維護性高。spa

接口隔離原則:一個接口中的全部方法都應該是爲完成一件事情而定義的,接口中的方法不會是跟這件事情無關的。這樣的好處是接口的職責清晰,不會致使什麼方法都往裏加,從而代碼量少,後期維護和代碼可讀性變高。設計

重構的方法

封裝成員變量:變量重寫成私有成員變量,並提供訪問方法。這種重構方式能夠將與外部調用者無關的變量隱藏起來,減小代碼的耦合性,並減小意外出錯的機率。接口

提取方法:將大段代碼中的一部分提取後,構成一個新方法。這種重構可使整段程序的結構變得更清晰,從而增長可讀性。

抽象出公用的基類:將多個類/函數共用的類型抽象出能夠公用的基類,而後利用多態性追加每一個類/函數須要的特殊函數。這種重構可讓結構更加清晰,同時能夠增長代碼的可維護性。

方法上移:把公用的方法從子類移動到父類,你們都有的放入父類中,子類可重複使用。

方法下移:把子類獨有的方法從父類移動到子類,劃分好方法的邊界,子類獨有的只存在於子類。

方法改名:將方法名稱以更好的表達它的用途,俗話說見名知意。

固然,在開發中咱們也能夠適當的使用設計模式,使用設計模式的關鍵點是讓代碼可讀、可維護、可擴展。

總結

重構就是對現有代碼進行分解、抽象,定義好設計原則,找出它們的共同點,劃分好每一個類本身的職責,而後在用合適的設計模式對代碼進行從新組合的過程。

不要忘記重構的目的是爲了之後新加功能時更容易,讓新功能能夠儘快上線,代碼的結構清晰,讓代碼變得可讀、可維護、可擴展。代碼重構實際是在爲之後作準備,固然,若是代碼用一次就不用的,或者不多用的話,我以爲是沒有必要重構的,還不如用這些時間去多想一想核心功能的開發,也相似系統性能的二八原則。

PS:
清山綠水始於塵,博學多識貴於勤。
微信公衆號:「清塵閒聊」。
歡迎一塊兒談天說地,聊代碼。
169c4f6572f5216f?w=258&h=258&f=jpeg&s=27297

相關文章
相關標籤/搜索