05.31 編程——如何編寫一段好的代碼:重構

關於重構,很多人可能都有慘痛的經驗,

就不說去閱讀別人的代碼了,

有時候自己寫的代碼過半年,可能自己都看不明白,

這時候再來重構代碼是一件很痛苦的事情。

其實很多時候面試時會聊到重構的問題,

我自己的看法是重構是軟件開發中不可缺少的一個環節,

並不是說需要重構的代碼都是壞代碼,

有時候是舊的代碼架構不能適應新的需求,

而有時候是為了新技術的使用。

今天來說一下在代碼重構中的一個技巧,

如何編寫一段好的代碼。

其實不止是重構,在平時開發中如果可以的話也儘量用下面這種方式寫代碼。

一段糟糕的代碼是怎樣的

舉個例子,

在代碼中需要啟動某個組件,而啟動組件可以帶啟動模式作為參數,

一般開發都會這麼寫這個接口方法

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);

是不是變的一目瞭然。

這種寫法還有另外的好處,

如果將來需要擴展啟動模式,也不需要修改接口,

只需要在枚舉類中增加對應的類型就可以。

總結

重構其實是在於代碼的細節,

在提高代碼架構的健壯性的時候也不要忘了提高代碼的可閱讀性。

在代碼編寫中有這麼個格言,

如果代碼寫得好可以自述其身,

誰還需要註釋?

編程——如何編寫一段好的代碼:重構


分享到:


相關文章: