【重構-改善既有程式的設計】讀後感

閱讀時間約 4 分鐘
《重構》第二版

引言

Any fool can write code that a computer can understand. Good Programmers write code that humans can understand.
                    — M. Fowler (1999)
任何一個傻瓜都能寫出電腦可以理解的程式,唯有優秀的程式設計師能寫出讓人讀懂的程式。

上述引言是個人在讀完本書後蠻喜歡的一句話。初學程式時認為寫程式是在跟機器溝通,它懂了、可以動了,我的目的達成了,結案!然而大多時候,光是連編譯器吐出來的錯誤訊息都看不懂,更別說是考慮自己寫出來的程式碼的可讀性,而且專案太小也感覺不出維護上的困難。
工作後見識到老舊專案的核心程式,疊床架屋的結果下加新功能,每一步都得小心翼翼。理解既有程式碼要花時間,更改程式碼也是一項大工程,尤其是在多人協作開發的環境下,程式碼的品質更顯重要。
接續之前的clean code演講,偶然在書店看到了演講中提到的《重構》第二版。作者為了讓更多人容易吸收書中想表達的意涵,第二版範例改用javascript呈現。老實說讀技術相關的工具書,中文翻譯常常會混淆一些名詞所表達的意思。不過比照大學啃原文書的方式,看懂了範例就成功了一大半,順便培養作為工程師必備的基本能力--推敲上下文(通靈)。

定義何謂重構

重構指在不改變程式原有行為的基礎上,對既有程式碼進行修改,以改進其內部結構。
簡單從定義上,站在管理者的角度來說,佔用了時間卻沒有任何產出!況且高機率會遇到以下情況:
  1. 原本正常運作,為什麼要改?
  2. 都是你把它改壞的!
  • 第1種狀況:最好的情形下,要有能說服長官的依據,只是過多不可控因素考量,不如不要讓長官知道你在重構!
  • 第2種狀況:必須要確保能夠安全的重構,具體的方式即:先撰寫測試。

撰寫測試

這裡帶到了測試驅動開發的概念(Test-Driven Development, TDD),在完成產品的程式碼前,應該要建立對應的測試程式碼,並且每一次的改動都要能通過原有的測試案例。一方面,這些測試案例也透露出開發程式碼應達到哪些基本的功能要求,讓需求意圖跟著被保留下來。另一方面,在重構的過程中,開發人員也會間接被要求寫出更容易被測試的程式碼,讓程式單元趨向單一職責(Single-responsibility principle, SRP )。

善用整合開發環境(IDE)

Java常用的IDE(IntelliJ, Eclipse)或是微軟Visual Studio內插件支援resharper,都可以幫助開發者進行重構,包含擷取方法、擷取類別、變數內嵌或是重新命名。
以我自己遇到的專案為例,從前輩手中接手上千行的批次程式,在沒有撰寫測試程式碼的狀況下,只能不斷擷取出方法,並且個別給予能描述其方法的命名,順便梳理整個大區段程式碼的邏輯。如此一來,就算執行後還是出現問題,也能快出推斷出是哪一個單元發生狀況,最後順利在上線前,額外多解決了幾個bug。
// 修改前示意
function main() {
  ...
  ...
  ...
}
// 修改後示意
function main() {
  doOneThing();
  doAnother();
  doTheOther();
}
function doOneThing() {
  ...
}
function doAnother() {
  ...
}
function doTheOther() {
  ...
}

結尾

The whole purpose of refactoring is to make us program faster,
producing more value with less effort.
書中後面章節大多是重構時所使用的手法,因此了解前面幾個章節作者所要表達的概念及範例後,在開發上也會有更新一層的認知。
整體而言,更適切的達到實質的clean code。
  • 無暇的程式碼
  • 清理程式碼
avatar-img
12會員
62內容數
遇到的坑、解過的題、新知識的探索、舊時代的遺毒!? 工作後我發現,文件更新往往跟不上新需求的更迭,犯錯的歷史總是不斷重演。因此,我改變了方式,蒐集從程式上、系統上的每一次異常處理過程,好讓再次遇到相同的問題時能快速應變。此專題就是我的錯題本,期待日後不管在工作上或交流上遇到難題,都能輕鬆地應答:有什麼難的,我都踩過。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Err500 的其他內容
連日下雨後得放晴,難得出外透透氣,於是找了鄰近的金面山步道走走。當然,起初我也以為頂多如圖中石梯,大不了是場登階耐力賽。殊不知入口處停了台救護車,途中也遇到兩組救難人馬台者擔架扛傷者下山,原來這路線跟我想的,不一樣!
翻閱了去年面試時候的題目,想想現在自己會用什麼方式重新完成這個題目,也正好最近在看python的typing模組及其他使用,使用物件導向的方式改寫了程式碼。
Input: head = [1,2,3,4,5] Output: [3,4,5] 單看列表只是要找中間值,不過給定的資料結構不是陣列,而是鏈結串列。
之前跳過的題目,回來補完成。 Input: nums = [1,2,3,4,5,6,7], k = 3 Output: [5,6,7,1,2,3,4]
今日題目: 把一行字內每個單字都反轉字元。 Input: s = "Let's take LeetCode contest" Output: "s'teL ekat edoCteeL tsetnoc"
連日下雨後得放晴,難得出外透透氣,於是找了鄰近的金面山步道走走。當然,起初我也以為頂多如圖中石梯,大不了是場登階耐力賽。殊不知入口處停了台救護車,途中也遇到兩組救難人馬台者擔架扛傷者下山,原來這路線跟我想的,不一樣!
翻閱了去年面試時候的題目,想想現在自己會用什麼方式重新完成這個題目,也正好最近在看python的typing模組及其他使用,使用物件導向的方式改寫了程式碼。
Input: head = [1,2,3,4,5] Output: [3,4,5] 單看列表只是要找中間值,不過給定的資料結構不是陣列,而是鏈結串列。
之前跳過的題目,回來補完成。 Input: nums = [1,2,3,4,5,6,7], k = 3 Output: [5,6,7,1,2,3,4]
今日題目: 把一行字內每個單字都反轉字元。 Input: s = "Let's take LeetCode contest" Output: "s'teL ekat edoCteeL tsetnoc"
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
【山居獨行電子報第二期】 感謝您的訂閱與耐心,僅管原訂兩星期一刊的計劃是恕難從命了。我很感激初始訂閱者冰糖雪糕、德哥、T.C.、黑糖厥餅還有我自己,有你們的支持是我繼續下去的動力。 /文藝青年的囈語 跨越2023,現在的我無意為永遠的顧此失彼掙扎,生活是永遠資源有限的複選題。睡飽了,手機滑
Thumbnail
男人困境 : 10 重構自己的生活圈   多數人看房子都知道要看風水,那麼自己的生活型態是不是也有風水?   有的,建立你的生活型態也有系統可觀測好壞,但它或許沒有風水歷史這麼悠久。   這系統來自 NLP 的邏輯層次理論,它是一個金字塔狀,由 6 個層次組成,由上到下分別為:  
Thumbnail
預定 2025. 03. 01 實體新書 正式出版發布(繁體中文/臺灣地區)
Thumbnail
自用住宅重購退稅整理-土增稅重購退稅&綜所稅重購退稅(房地合一&財產交易所得) 一、重購退稅表格整理 AFP考試知識點,CFP考試知識點,CFP實務應用
Thumbnail
對腐海而言真理為何? 娜烏西卡鍥而不捨、以科學的方式持續不斷地探究腐海(自然)的真理。這樣的娜烏西卡,對眼前的小植物、常見的蟲子們的生命,都想徹底觀察,在自己屋子的地下室裡反覆做著實驗。重點在於,娜烏西卡直覺地認為,「眼前的這個生命不管多麼小、多麼普通,都可能藏有整個世界的秘密」。
Thumbnail
其實,很多時候我們會困在問題中沒有方向打轉著,是來自於自己無法釐清問題的根本,而不知道怎麼解決。也是因為當我們在定義問題的時候,會依著社會風氣或期待的框架來解決問題;又或者是個人偏見或自我假設的先入為主想法,導致無法跳脫既有思維的我們,無法解決問題的根本。
Thumbnail
「顧問!謝謝你當初阻止我積極投資,而是建議我累積現金與積極還債,我現在終於有深刻的體會了!」  在疫情嚴峻的此時,祐偉傳了這則簡訊給我。 
Thumbnail
最近看了一些有關績效考核及員工評估相關的文章,某種比例的企業主管在回饋意見時,都免不了強調員工的缺點,因為需要列出改善的部份。 列出反饋意見不是不好,畢竟企業都希望確保團隊的績效能力,這些意見雖然可以協助下屬缺點的改善,但是不是也有可能因此把所有的注意力放在改善,甚至改變成不適合自己的模樣,你覺得這
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
【山居獨行電子報第二期】 感謝您的訂閱與耐心,僅管原訂兩星期一刊的計劃是恕難從命了。我很感激初始訂閱者冰糖雪糕、德哥、T.C.、黑糖厥餅還有我自己,有你們的支持是我繼續下去的動力。 /文藝青年的囈語 跨越2023,現在的我無意為永遠的顧此失彼掙扎,生活是永遠資源有限的複選題。睡飽了,手機滑
Thumbnail
男人困境 : 10 重構自己的生活圈   多數人看房子都知道要看風水,那麼自己的生活型態是不是也有風水?   有的,建立你的生活型態也有系統可觀測好壞,但它或許沒有風水歷史這麼悠久。   這系統來自 NLP 的邏輯層次理論,它是一個金字塔狀,由 6 個層次組成,由上到下分別為:  
Thumbnail
預定 2025. 03. 01 實體新書 正式出版發布(繁體中文/臺灣地區)
Thumbnail
自用住宅重購退稅整理-土增稅重購退稅&綜所稅重購退稅(房地合一&財產交易所得) 一、重購退稅表格整理 AFP考試知識點,CFP考試知識點,CFP實務應用
Thumbnail
對腐海而言真理為何? 娜烏西卡鍥而不捨、以科學的方式持續不斷地探究腐海(自然)的真理。這樣的娜烏西卡,對眼前的小植物、常見的蟲子們的生命,都想徹底觀察,在自己屋子的地下室裡反覆做著實驗。重點在於,娜烏西卡直覺地認為,「眼前的這個生命不管多麼小、多麼普通,都可能藏有整個世界的秘密」。
Thumbnail
其實,很多時候我們會困在問題中沒有方向打轉著,是來自於自己無法釐清問題的根本,而不知道怎麼解決。也是因為當我們在定義問題的時候,會依著社會風氣或期待的框架來解決問題;又或者是個人偏見或自我假設的先入為主想法,導致無法跳脫既有思維的我們,無法解決問題的根本。
Thumbnail
「顧問!謝謝你當初阻止我積極投資,而是建議我累積現金與積極還債,我現在終於有深刻的體會了!」  在疫情嚴峻的此時,祐偉傳了這則簡訊給我。 
Thumbnail
最近看了一些有關績效考核及員工評估相關的文章,某種比例的企業主管在回饋意見時,都免不了強調員工的缺點,因為需要列出改善的部份。 列出反饋意見不是不好,畢竟企業都希望確保團隊的績效能力,這些意見雖然可以協助下屬缺點的改善,但是不是也有可能因此把所有的注意力放在改善,甚至改變成不適合自己的模樣,你覺得這