1. 程式人生 > 程式設計 >程式碼重構

程式碼重構

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

什麼是程式碼重構?

這裡引用維基百科的話:“對軟體程式碼做任何更動以增加可讀性或者簡化結構而不影響輸出結果”

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

為什麼程式碼需要重構?

由於業務的不斷變化需求不斷的增加,導致後期的程式碼維護修改變得更加困難,有時候一個簡單的功能,以前做過類似的,但會有少許的改動。經過開發、測試、迴歸,上線有可能也需要幾天。

由於前期為了快速上線,沒考慮到更多的擴充套件,沒用到任何設計模式,針對不通的邏輯通過 if 判斷處理,導致程式碼越來越龐大,程式碼可讀性和可維護性變得越來越差,每次一點改動都害怕影響到其他功能,有的時候還不能給出印象的範圍,導致測試同學也非常的辛苦,需要回歸很多功能。

如果對現有程式碼很難新增新的行為,個人覺得就應該對現有程式碼邏輯進行重構,因為重構也是需要時間來支撐的,應該選擇經常修改並且有時間的時候來重構相關程式碼。那應該怎麼進行重構?重構要達到的目的是什麼?下面說說我個人的意見。

重構的原則

面向介面程式設計:意思就是對外層提供介面,定義好入參和返回值,遮蔽底層的實現細節,呼叫方根本不需要知道和了解這個介面方法的具體實現,全交由實現類去自定義實現。這樣設計的好處一個是解耦,一個是可以多實現(java是一門多型的語言)。

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

介面隔離原則:一個介面中的所有方法都應該是為完成一件事情而定義的,介面中的方法不會是跟這件事情無關的。這樣的好處是介面的職責清晰,不會導致什麼方法都往裡加,從而程式碼量少,後期維護和程式碼可讀性變高。

重構的方法

封裝成員變數:變數重寫成私有成員變數,並提供訪問方法。這種重構方式可以將與外部呼叫者無關的變數隱藏起來,減少程式碼的耦合性,並減少意外出錯的概率。

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

抽象出公用的基類:將多個類/函式共用的型別抽象出可以公用的基類,然後利用多型性追加每個類/函式需要的特殊函式。這種重構可以讓結構更加清晰,同時可以增加程式碼的可維護性。

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

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

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

當然,在開發中我們也可以適當的使用設計模式,使用設計模式的關鍵點是讓程式碼可讀、可維護、可擴充套件。

總結

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

不要忘記重構的目的是為了以後新加功能時更容易,讓新功能可以儘快上線,程式碼的結構清晰,讓程式碼變得可讀、可維護、可擴充套件。程式碼重構實際是在為以後做準備,當然,如果程式碼用一次就不用的,或者很少用的話,我覺得是沒有必要重構的,還不如用這些時間去多想想核心功能的開發,也類似系統效能的二八原則。