隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

我的相片
目前從事軟體相關行業,喜歡閱讀、健身、喝調酒。習慣把遇到的問題記下來,每天做一些整理方便自己以後查。 Python、Rust、Kotlin等程式語言皆為自學,目前比較著重在Rust語言,歡迎一起討論。

2026年2月22日 星期日

【讀後心得】Clean Code - 軟體工程師聖經之一


這本書讀到最後,最精華的部分莫過於作者 Uncle Bob 整理的「啟發(Heuristics)」清單。它像是一面照妖鏡,反映出我們日常開發中不經意留下的技術債。為了方便日後複習,我將書中的重點與常犯錯誤整理成這份清單。

一、 註解的藝術:程式碼應該自我解釋

註解通常是為了彌補程式碼表達能力的不足。如果程式碼夠清楚,註解往往是多餘的。

  • 避開不適當的資訊: 註解應該存放技術心得或決定理由,而不是版本紀錄或作者資訊(那是 Git 的工作)。

  • 清理廢棄與多餘的註解: 過時的註解比沒註解更危險,因為它會誤導開發者。

  • 拒絕被註解掉的程式碼: 這是最該避免的!如果程式碼不再需要,請直接刪除。Git 會幫你記得它。

  • 寫得不好的註解: 避免廢話(例如:i++; // i 加 1),要寫就寫「為什麼」這麼做,而不是「怎麼做」。

二、 函式:專注於「一件事」

函式是程式的最小邏輯單位,混亂通常從這裡開始。

  • 參數精簡化: 盡量不超過 2 個參數。**旗標參數(Flag Arguments)**是大忌,因為它明示了這個函式做了「不只一件事」。

  • 輸出型參數的陷阱: 習慣上我們預期參數是輸入。如果要改變狀態,應該改變它所屬物件的狀態(object.update() 而非 update(object))。

  • 說到做到(Do One Thing): 函式名稱如果是 renderPage(),它就不該順便 saveSession()。副作用(Side Effects)必須在名稱中體現。

  • 避免傳遞性導覽: 也就是所謂的「火車連結」。程式碼不該出現 a.getB().getC().doSomething(),這代表 A 過度了解 B 與 C 的內部結構。

三、 命名:代碼的靈魂

好的命名能省下好幾行註解。

  • 範圍與長度成正比: 區域變數(範圍小)可以用短名;全域變數或大範圍使用的變數,名稱必須夠長且具備描述性。

  • 標準命名法: 整個專案應該有一套共通語言。如果你用 fetch 拿資料,就不要在別的地方用 getretrieve 做同樣的事。

  • 描述副作用: 如果一個函式會初始化連線並回傳資料,別只叫 getData(),應該考慮 createConnectionAndFetchData()

四、 測試:程式碼的最後防線

沒有測試的程式碼就是「壞掉的程式碼」,只是你還不知道而已。

  • 邊界條件是關鍵: 測試不要只跑快樂路徑(Happy Path),要針對 0nullempty 或極大值進行測試。

  • 詳盡測試錯誤附近: 臭蟲喜歡聚在一起。如果你在某個函式發現錯誤,那它的上下游通常也藏著問題。

  • 速度必須快: 如果測試跑一次要五分鐘,開發者就不會想跑它。慢速的測試最終會被遺棄。

五、 一般性常犯錯誤 (Heuristics)

這些是開發中最容易被忽略的細節:

  • 重複程式碼(DRY): 這是萬惡之源。只要看到重複,就該考慮抽象化。

  • 不一致性: 如果你在一個類別用 req 代表 Request,另一個類別就不該用 request。保持一致能降低認知負擔。

  • 被遺棄的程式碼: 沒被呼叫的函式、永遠不會進入的 if 區塊,請果斷刪除。

  • 選擇型參數: 盡量避免在函式中使用選擇性參數,這通常代表函式邏輯可以被拆分。


結語:童子軍規則

最後,我想補充書中最重要的核心心法:「離開現場時,要比你進來時更乾淨。」 (The Boy Scout Rule)

我們不需要一次就把整份爛程式碼重構完,但每次修改 bug 或新增功能時,順手改掉一個爛命名、刪掉一個廢棄註解。持之以恆,程式碼就不會走向腐化。


0 comments:

張貼留言