關於重構,很多人可能都有慘痛的經驗,
就不說去閱讀別人的代碼了,
有時候自己寫的代碼過半年,可能自己都看不明白,
這時候再來重構代碼是一件很痛苦的事情。
其實很多時候面試時會聊到重構的問題,
我自己的看法是重構是軟件開發中不可缺少的一個環節,
並不是說需要重構的代碼都是壞代碼,
有時候是舊的代碼架構不能適應新的需求,
而有時候是為了新技術的使用。
今天來說一下在代碼重構中的一個技巧,
如何編寫一段好的代碼。
其實不止是重構,在平時開發中如果可以的話也儘量用下面這種方式寫代碼。
一段糟糕的代碼是怎樣的
舉個例子,
在代碼中需要啟動某個組件,而啟動組件可以帶啟動模式作為參數,
一般開發都會這麼寫這個接口方法
public void startComponent(boolean arg);
這接口可以運行,
但是它是糟糕的。
因為 arg 這個名稱並不能描述參數的作用,
不誇張的說兩個星期後自己都看不懂這段代碼。
開始重構它
我們假設啟動模式有兩種,內部啟動和外部啟動,那麼從這個角度出發可以把參數修改為這樣
public void startComponent(boolean fromOutside);
看起來好些了,這樣我們在調用的時候就知道 tru是表示外部啟動,而 false是內部啟動
....
//call from Outside
startComponent(true);
//call from inside
startComponent(false);
但是這樣仍然是一段糟糕的代碼…
進一步重構
可能你聽說過這麼個段子,
優秀的程序員在寫代碼時能迅速的將自己變成傻子,
印象中好像是說 Pony Ma 的…
如果是一個傻子程序員看這段代碼有什麼問題呢?
在沒看到參數的名字之前,單看調用處是不知道 true 和 false是表達什麼目標的。
不好理解麼?
假設有一個新方法是啟動一個模塊,這裡是它的調用
....
startModule(true);
對於使用者來說,你猜這參數是什麼意思?
那麼如何進一步重構呢。
這裡可以使用 Enum的技巧,
來看一下使用 Enum 如何寫一段閱讀性良好的代碼。
public enum LaunchType {
OUTSIDE,
INSIDE
}
//interface
public void startComponent(LaunchType type);
雖然看起來代碼量變多了,不過我們來看下調用的地方變成怎樣,
....
//call from outside
startComponent(LaunchType.OUTSIDE);
//call from inside
startComponent(LaunchType.INSIDE);
是不是變的一目瞭然。
這種寫法還有另外的好處,
如果將來需要擴展啟動模式,也不需要修改接口,
只需要在枚舉類中增加對應的類型就可以。
總結
重構其實是在於代碼的細節,
在提高代碼架構的健壯性的時候也不要忘了提高代碼的可閱讀性。
在代碼編寫中有這麼個格言,
如果代碼寫得好可以自述其身,
誰還需要註釋?
閱讀更多 Java高併發框架 的文章