天天看點

為什麼要進行重構?----《重構》節選

我不想把重構說成治百病的萬靈丹,它絕對不是所謂的“銀彈”。不過它的确很有價值,雖不是一顆銀子彈,卻是一把“銀鉗子”,可以幫助你始終良好地控制自己的代碼。重構是個工具,它可以(并且應該)為了以下數個目的而被運用:   重構改進軟體設計 如果沒有重構,程式的設計會逐漸腐敗變質。當人們隻為短期目的,或是在完全了解整體設計之前,就貿然修改代碼,程式将逐漸失去自己的結構,程式員愈來愈難通過閱讀源碼而了解原本設計。重構很像是在整理代碼,你所做的就是讓所有東西回到應該的位置上。代碼結構的流逝是累積性的。愈難看出代碼所代表的設計意涵,就愈難保護其中設計,于是該設計就腐敗得愈快。經常性的重構可以幫助代碼維持自己該有的形态。 同樣完成一件事,設計不良的程式往往需要更多代碼,這常常是因為代碼在不同的地方完全使用相同的語句做同樣的事。是以改進設計的一個重要方向就是消除重複代碼。這個動作的重要性着眼于未來。代碼數量減少并不會使系統運作更快,因為這對程式的運作軌迹幾乎沒有明顯影響。然而代碼數量減少将使未來可能的程式修改動作容易得多。代碼愈多,正确的修改就愈困難,因為将有更多的代碼需要了解。你在這兒做了點修改,系統卻不如預期那樣工作,因為你未曾修改另一處--那兒的代碼做着幾乎完全一樣的事情,隻是所處環境略有不同。如果消除重複代碼, 你就可以确定代碼将所有事物和行為都隻表述一次,唯一一次,這正是優秀設計的根本。 重構使軟體更易被了解 從許多角度來說,所謂程式設計,便是與計算機交談。你編寫代碼告訴計算機做什麼事,它的響應則是精确按照你的訓示行動。你得及時填補“想要它做什麼”和“告訴它做什麼”之間的縫隙。這種程式設計模式的核心就是“準确說出吾人所欲”。除了計算機外,你的源碼還有其他讀者:數個月之後可能會有另外一位程式員嘗試讀懂你的代碼并做一些修改。我們很容易忘記這第二位讀者,但他才是最重要的。計算機是否多花了數個鐘頭進行編譯,又有什麼關系呢?如果一個程式員花費一周時間來修改某段代碼,那才關系重大---如果他了解你的代碼,這個修改原本隻需一小時。 問題在于,當你努力讓程式運轉的時候,你不會想到未來出現的那個開發者。是的,是應該改變一下我們的開發節奏,對代碼做适當修改,讓代碼變得更易了解。重構可以幫助我們讓代碼更易讀。一開始進行重構時,你的代碼可以正常運作,但結構不夠理想。在重構上花一點點時間,就可以讓代碼更好地表達自己的用途。這種程式設計模式的核心就是“準确說出你的意思”。  關于這一點,我沒必要表現得如此無私。很多時候那個“未來的開發者”就是我自己。此時重構就顯得尤其重要了。 這種可了解性還有另一方面的作用。我利用重構來協助我了解不熟悉的代碼。當我看到不熟悉的代碼,我必須試着了解其用途,我先看兩行代碼,然後對自己說:“哦,是的,他做了這些,那些……”。有了重構這個強大武器在手,我不會滿足這麼一點腦中體會。我會真正動手修改代碼,讓它更好地反映出我的了解,然後重新執行,看它是否仍然正常工作,以此檢驗我的了解是否正确。 一開始我所做的重構都像這樣停留在細枝末節上。随着代碼逐漸簡潔,我發現自己可以看到一些以前看不到的設計層面的東西。如果不對代碼做這些修改,也許我永遠看不見他們,因為我的聰明才智不足以在腦子裡把這一切都想象出來。Ralph Johnson把這種“早期重構”描述為“擦掉窗戶上的污垢,使你看得更遠”。研究代碼時我發現,重構把我帶到更高的了解層次上。如果沒有重構,我達不到這種層次。   重構助你找到臭蟲 對代碼的了解,可以幫助我找到臭蟲。……重構能夠幫助我更有效地寫出強固穩健的代碼。

重構助你提高程式設計速度  終于,前面的一切都歸結到了這最後一點:重構幫助你更快速地開發程式。 聽起來有點違反直覺。當我談到重構,人們很容易看出它能提高品質。改善設計、提升可讀性、減少錯誤,這些都是提高品質。但這難道不會降低開發速度嗎? 我強烈相信: 良好設計是快速軟體開發的根本。事實上擁有良好設計才可能達成快速的開發。如果沒有良好設計,或許某一段時間内你的進展迅速,但惡劣設計很快就讓你的速度慢下來。你會把時間花在調試上面,無法添加新功能。修改時間愈來愈長,因為你必須花愈來愈多的時間去了解系統、尋找重複代碼。随着你給最初程式打上一個又一個的更新檔,新特性需要更多代碼才能實作。真是個惡性循環。 良好設計是維持軟體開發速度的根本。重構可以幫助你更快速地開發軟體,因為它阻止系統腐敗變質,它甚至還可以提高設計品質。

繼續閱讀