我覺得《Refactoring:Improving the Design of Existing Code》可說是軟體界兩大奇書之一 (另一本是《Design Patterns》)。設計模式講究在寫程式之前的事先設計,而重構則講究程式寫碼後對結構的重整。
軟體設計不可能像蓋房子一樣,畫好設計圖後就能建構出穩固的高樓大廈。軟體開發要經過不斷地分析、設計、寫碼、測試與修正。唯有透過漸增與反覆,才有可能建構出高品質與強固的系統。事先的設計能保障程式碼一定程度的品質,但不可能完美無瑕,即使如作者Martin Fowler,仍需驗證與回饋程式碼,再回頭修整軟體的結構。
事前的設計與事後的重構,缺一不可
在軟體工程,運用紙上藍圖的設計模式與程式碼的重構,本來都是設計的一環,「Top-down」與「Bottom-up」本來就不應該被分成兩種方法論,兩者缺一不可,唯有互相補足,才可能建構出軟體設計開發的正回饋環路。
重構的對象是程式碼,目的在於重整程式碼背後所隱含的結構,提升軟體系統的彈性與穩定,同時讓系統容易維護、程式人寫碼更有效率。因為設計不可能一開始就正確,它會隨著設計者的經驗成長而進化;程式碼被閱讀和修改的次數也遠多於它被編寫的次數。而重構就是保持程式碼易讀、易修改的關鍵。
聰明人才能寫出傻瓜看得懂的程式碼
雖然重構的對象是程式碼,但重構本質上其實就是對軟體結構的重整,給予物件明確的責任分派 (Responsibility Assign),使物件之間能具備高內聚力(High-Cohesion)與低耦合性(Low-Coupling),如此一來,程式碼就會變得簡潔、易讀。
閱讀本書前,你應該要了解Java語法、UML類別與循序圖、物件與類別的關係 (尤其是整體—局部、一般化—特殊化)、多型、介面、封裝、委派 (Delegate)等物件導向觀念,難怪能了解本書的人並不多。但是,如果你是以軟體為職志的設計/開發人員,一定要持續看完,即使花兩、三年的時間也是值得的。
第一章一定要先看,它可說是整本書的精華,第一章確實看懂後,才有可能讀懂後續章節。第一章以3個類別 (Class)的案例 (影片出租),帶出如何寫作與修正Java程式碼,藉以解釋什麼是重構。
我很喜歡書中的一段話:「任何一個傻瓜都能寫出計算機可以理解的程式碼。唯有寫出人類容易理解的程式碼,才是優秀的程式人。」
由此可知,寫出讓別人看不懂的程式,可別自豪,而是要反省,為何無法寫出簡潔易讀的程式碼。
重構是為了自己,不是別人
第二章說明為何需要重構。作者提出多個理由,但我引用的這一段就足以說明:「如果沒有重構,程式的設計會逐漸腐敗變質。當人們只為短期目的,或是在完全理解整體設計之前,就貿然修改程式碼,程式將逐漸失去自己的結構,程式人愈來愈難透過閱讀源碼而理解設計。重構就像是在整理程式碼,你所做的就是讓所有東西回到應該的位置上。」
第四章介紹如何建構測試體系。請記得,重構與測試是一體的,透過測試,你才能知道重構並沒有變動系統外部的行為,卻仍可以維繫正常的運作。如何利用 JUnit進行自動化的功能與單元測試,是本章的重點。對程式人而言,你要先認知到:編寫這些測試的目的,是為了提高生產效率,而不是為了別人。
嗅出程式碼的壞味道
第三章討論如何嗅出程式碼的壞味道,進而知道何時要進行重構。書中列出所謂的「臭味條款」,協助程式人檢測不好的程式碼。
最後,請想想,重構是為了誰?
記住,重構是為了你自己。它可以讓開發更有效率,更少機會犯錯。一開始的重構可能會停留在枝末細節上,但隨著程式碼變得簡潔,你會發現,自己開始看到一些設計層面的東西,這是重構前無法發現的。重構可以提高你對軟體設計的理解層次:擦掉窗戶上的污垢,使你看得更遠。
重構—改善既有程式的設計(Refactoring:Improving the Design of Existing Code)
Martin Fowler/著
侯捷、熊節/譯
碁峰出版
售價:720元
《作者簡介》
王克明
台北工專五專部電子科畢業。HSDc軟體設計顧問,擔任包括鋼鐵、保險、股票等多項領域系統架構開發顧問,以及軟體設計課程專職講師。
相關閱讀:
軟體設計必讀經典(1)以簡約之道介紹UML最實用的部分
軟體設計必讀經典(2)物件導向分析與設計入門
軟體設計必讀經典(3)洞悉易學難精的Use Case
軟體設計必讀經典(4)知易行難的極致軟體製程
軟體設計必讀經典(5)用科學化方式搞懂設計模式
軟體設計必讀經典(6)RUP活用,也可以是敏捷開發
軟體設計必讀經典(8)由生活出發,輕鬆領會物件導向
軟體設計必讀經典(9)優質使用者介面,源自好的狀態圖設計
軟體設計必讀經典(10)幫助SA紮穩UML底子的實務手冊
軟體設計必讀經典(11)反覆測試與修正,讓錯誤消失
熱門新聞
2024-08-14
2024-12-20
2024-12-22
2024-12-23
2024-12-24