《重構-改善既有程式碼的設計》讀書筆記
重構這個詞,相信程式設計師對這個詞不陌生。不過在讀這本書之前,我對這個詞確實沒什麼概念,儘管我是一個程式設計師。讀完了這本書,我才對重構這個詞有了一個瞭解,以及程式重構的重要性。重構即是對軟體內部結構的一種調整。通過採取一系列的重構手法,在不改變軟體可觀察行為的前提下,調整軟體結構,讓軟體的內部結構得以清晰有條理,變得更加容易維護於拓展。此外,讓程式碼變得容易讓他人理解。“任何人都能夠寫出計算機可以理解的程式碼,唯有寫出人類容易理解的程式碼才是優秀的程式”,我非常喜歡並且贊同這句話,之後也會用這句話警戒自己糾正在程式碼編寫方面的壞習慣。
這本書先是對重構進行了一個介紹。為什麼要重構,什麼時候重構。重構除了能夠改善軟體內部結構,讓軟體更加容易理解之外,還能幫助找到bug,提高程式設計速度。良好設計是維護軟體開發速度的根本。也許,一開始對一個軟體進行重構的時候耗費比較長的時間,這對於大多數的程式設計師是不願意乾的事情,畢竟在短期看來這是一個浪費時間不討好的活。從長遠看,花點時間對軟體僅從重構之後,在之後的軟體開發速度上面,就能夠得到很大的提升,而且重構後的軟體的質量大大提升,變得容易理解,及其有利於自己日後的開發以及後來接收程式碼的人。那什麼時候需要重構,書中給了一個建議,三次法則:第一次大膽去做;第二次做類似的事情可能會產生反感,但是還可以去做;第三次再重複的話就要果斷的進行重構。重複的程式碼 是軟體程式碼的壞味道。那什麼是軟體程式碼的壞味道?
書中詳細的舉出了各種壞味道的程式碼。第一個也是最常見的壞味道就是重複的程式碼。此外還有過長函式、過大的類、過長的引數列表等(這裡只是舉出常見的程式碼壞味道,不一一舉出)。而後針對這些壞味道如何進行解決,作者則分了單項重構於大型重構兩方面結合例項,向讀者介紹作者遇到對應的壞味道如何一步步的去重構,在閱讀這本書的過程就猶如作者親自面授,讓人醍醐灌頂,受益良多。
說到重構,儘管我之前對這個詞沒什麼概念。但是閱讀這本書之後,對比我平常寫程式碼的一些小習慣,還是會有一些重構的下意識習慣在其中。就好比說,我平時看到程式碼多次重複了,我會將重複的程式碼拿出來獨立到一個函式中,然後對使用到這個函式塊的地方進行替換成對應的函式,這就是書中提到的Extract Method(提煉函式)重構手法;有時候我看到多個類之間有共同的或者說是類似的特徵,我會下意識的將這些類提煉出一個父類出來,然後把這些特徵放到父類中去,讓這些類繼承父類。這個就是書中提到的Extract Superclass(提煉超類)的重構手法;我相信幾乎所有的程式設計師都會和我一樣,遇到這些常見的基本壞味道,會下意識的進行重構,儘管對重構還沒有明確的概念。
但是這個我們做的這些還遠遠不夠,程式碼中以然存在很多壞味道是我們不知道或者是沒有發現的。這本書就給了我很大的幫助,讓我學習瞭解程式碼中的壞味道,然後對於程式碼中壞味道結合解決方法進行重構。
①拿程式碼註釋來說,一般大家都只知道(包括我在內),寫註釋是一個好習慣。但是卻不知道過多註釋卻恰恰相反。註釋過多則氾濫,說明我們自己寫的程式不夠讓人容易理解,需要靠註釋才能讓人家知道你的程式做了什麼。這時候就需要進行重構。在這之前,對於這種註釋,我肯定是不會想到還有對註釋進行重構的。然而,這種情況就是需要重構。當你感覺需要進行撰寫註釋的時候你就應該先嚐試對程式碼進行重構,讓你自己的程式碼變得容易理解而不需要靠過多的註釋去幫助人家理解你的程式碼。試著通過重構去掉多餘的註釋。
②結合上述的註釋問題,這裡說說書中提到的一個很基本的,但也是很多人沒有注意去做或者懶得去做的一個很容易就能做到重構手法。Rename Method(函式重新命名),一開始我讀到這裡,很是驚訝,這個重構手法可以說是舉手之勞的工作,而我在之前的程式碼編寫中卻沒有注意去做,甚至可以說是沒有那個意識。很多時候我們需要用註釋去解釋函式在做什麼的時候,很大程度是因為我們的函式名字沒有很好的解釋函式在做什麼,以至於需要靠註釋這種東西去幫我們解釋。那麼我們如果給函式一個好的命名,讓人家一看就知道函式要幹嘛了,我們還需要什麼註釋?在這裡我有get到了一句:程式碼首先是為人而寫的,其次才是為計算機寫的。
③Replace Conditional with Polymorphism(以多型取代條件表示式)。很多時候,我寫程式碼會用到條件表示式,而且很頻繁,以至於我們每次寫程式碼看到它習以為常,更別說想到重構這個問題(相信很多人也一樣)。其實我錯了,當一個函式依靠條件表示式返回多種物件的時候,這個函式就出現了壞味道,而需要我們實現多型取代條件表示式,進行重構。否則,每次需要新增一個新類時候,就需要往其中新增一個分支,日復一日,函式就會變得臃腫不堪,而且難以閱讀。
還有很多壞味道以及對應的解決方法,我這裡只是略舉幾個我之前編寫程式碼過程中沒有做到的重構。很多時候,我只是做到一些很基本的、很常見的一些重構。有很多壞味道的程式碼需要重構是我沒有發現甚至是不知道的,以至於我的程式碼編寫質量不高,有時候不容易理解。所以這本給我帶來很大幫助,讓我學到了很多壞味道的程式碼以及對應的解決方案。雖然讀過一遍,但很多壞味道程式碼需要在實戰中結合實際情況才能做出解決策略,而且讀過一遍也不能完全掌握其書中所列舉的所有壞味道的程式碼。這本書值得多讀幾遍。非常推薦這本書,寫的確實很好。同時很感謝作者,讓我認識到重構的重要性(我更想說必要性)。