clean-code

clean-code

熱門

此技能體現了 Robert C. Martin(Uncle Bob)所著《Clean Code》的原則。用它將「能運作的程式碼」轉變為「整潔的程式碼」。

4.3萬星標
6826分支
更新於 2026/7/12
SKILL.md
readonlyread-only
name
clean-code
description

此技能體現了 Robert C. Martin(Uncle Bob)所著《Clean Code》的原則。用它將「能運作的程式碼」轉變為「整潔的程式碼」。

Clean Code 技能

此技能體現了 Robert C. Martin(Uncle Bob)所著《Clean Code》的原則。用它將「能運作的程式碼」轉變為「整潔的程式碼」。

🧠 核心哲學

「程式碼若能讓非原始作者的其他開發者閱讀並增強,就是整潔的。」— Grady Booch

使用時機

在以下情況使用此技能:

  • 撰寫新程式碼:確保從一開始就有高品質。
  • 審查 Pull Request:提供有建設性、基於原則的回饋。
  • 重構舊程式碼:識別並消除程式碼壞味道。
  • 提升團隊標準:對齊業界標準的最佳實務。

1. 有意義的名稱

  • 使用表達意圖的名稱:用 elapsedTimeInDays 而非 d
  • 避免誤導資訊:如果實際上是 Map,就不要用 accountList
  • 做出有意義的區別:避免 ProductDataProductInfo 並存。
  • 使用可發音/可搜尋的名稱:避免 genymdhms
  • 類別名稱:使用名詞(CustomerWikiPage)。避免 ManagerData
  • 方法名稱:使用動詞(postPaymentdeletePage)。

2. 函式

  • 小!:函式應該比你認為的還要短。
  • 只做一件事:一個函式應該只做一件事,並且做好。
  • 單一抽象層級:不要混雜高階商業邏輯與低階細節(如正規表達式)。
  • 描述性名稱isPasswordValidcheck 好。
  • 參數:0 個最理想,1-2 個還可以,3 個以上需要非常充分的理由。
  • 無副作用:函式不應偷偷改變全域狀態。

3. 註解

  • 不要為壞程式碼寫註解——重寫它:大多數註解是我們無法用程式碼表達自己的徵兆。
  • 用程式碼解釋自己
    # 檢查員工是否符合全額福利資格
    if employee.flags & HOURLY and employee.age > 65:
    
    對比
    if employee.isEligibleForFullBenefits():
    
  • 好的註解:法律資訊、說明性(正規表達式意圖)、澄清(外部函式庫)、TODO。
  • 壞的註解:喃喃自語、冗餘、誤導、強制、噪音、位置標記。

4. 格式

  • 報紙隱喻:高階概念在上方,細節在下方。
  • 垂直密度:相關的行應彼此靠近。
  • 距離:變數應在其使用處附近宣告。
  • 縮排:對結構可讀性至關重要。

5. 物件與資料結構

  • 資料抽象化:將實作隱藏在介面之後。
  • 德墨忒爾定律:一個模組不應知道它所操作物件的內部細節。避免 a.getB().getC().doSomething()
  • 資料傳輸物件(DTO):只有公開變數而無函式的類別。

6. 錯誤處理

  • 使用例外而非回傳碼:保持邏輯整潔。
  • 先寫 Try-Catch-Finally:定義操作的範圍。
  • 不要回傳 Null:這會強迫呼叫端每次都檢查 null。
  • 不要傳入 Null:會導致 NullPointerException

7. 單元測試

  • TDD 三定律
    1. 在寫好失敗的單元測試之前,不要寫任何正式程式碼。
    2. 不要寫超過足以失敗的單元測試。
    3. 不要寫超過足以通過失敗測試的正式程式碼。
  • F.I.R.S.T. 原則:快速(Fast)、獨立(Independent)、可重複(Repeatable)、自我驗證(Self-Validating)、及時(Timely)。

8. 類別

  • 小!:類別應只有單一職責(SRP)。
  • 階層規則:我們希望程式碼讀起來像自上而下的敘述。

9. 壞味道與啟發式

  • 僵化性:難以修改。
  • 脆弱性:在多處容易出錯。
  • 不動性:難以重複使用。
  • 黏滯性:難以做正確的事。
  • 不必要的複雜性/重複

🛠️ 實作檢查清單

  • [ ] 這個函式是否小於 20 行?
  • [ ] 這個函式是否只做一件事?
  • [ ] 所有名稱是否都可搜尋且表達意圖?
  • [ ] 我是否透過讓程式碼更清晰來避免註解?
  • [ ] 我是否傳入了太多參數?
  • [ ] 這個變更是否有失敗的測試?

限制

  • 僅在任務明確符合上述範圍時使用此技能。
  • 請勿將輸出視為環境特定驗證、測試或專家審查的替代品。
  • 如果缺少必要的輸入、權限、安全邊界或成功標準,請停止並要求釐清。