Files
Obsidian-Main/00.00 Inbox/clean code.md
Awin Huang bb558476ce vault backup: 2025-08-04 17:10:24
Affected files:
00.00 Inbox/clean code.md
2025-08-04 17:10:25 +08:00

5.0 KiB
Raw Blame History

tags, aliases, date, time, description
tags aliases date time description
2025-08-04 16:49:36

核心設計原則

本課程遵循3Rs架構

  1. 可讀性Readability讓程式碼易於理解和維護
  2. 可重用性Reusability減少重複程式碼提高開發效率
  3. 可重構性Refactorability支援模組化設計和持續改進

第一階段:基礎理論與核心原則

  • Clean Code定義與重要性
    • 什麼是Clean Code易讀、易懂、易維護的程式碼
    • 技術債務的概念與影響
    • 童子軍規則:讓程式碼比接手時更乾淨

Good code:

def calculate_doubled_value_plus_one(input_value):
    """計算輸入值的兩倍加一"""
    OFFSET = 1
    
    if input_value <= 0:
        raise ValueError("Input value must be positive")
    
    doubled_value = input_value * 2
    result = doubled_value + OFFSET
    return result

Bad code:

def f(x):
if x > 0:
    y = x * 2
    # TODO: fix this later
    z = y + 1  # magic number
    return z
else:
    return -1
  • 有意義的命名規範
    • 使用具描述性且明確的變數名稱
    • 函式命名:動詞片語表達動作意圖
    • 類別命名:名詞表達實體概念
    • 避免縮寫和神秘數字

Good code:

// 良好的命名
let elapsedTimeInDays;
let activeUsers = [];
let calculateTotalPrice = (price, quantity) => price * quantity;
def fetch_user_profile():
    return user_profile_data

def validate_user_credentials():
    # 驗證使用者憑證
    codes.....

Bad code:

// 糟糕的命名
let d;  // 經過的天數
let u = [];  // 使用者列表
let calc = (a, b) => a * b;
def data():
    return user_info

def process():
    # 處理某些東西
    pass
  • 函式設計原則
    • 單一職責原則:一個函式只做一件事
    • 函式長度控制目標在20行以下
    • 參數管理最多3個參數的建議
    • 避免副作用與Flag參數

一個函式只做一件事

Good code:

# 遵循單一職責的函式
def validate_user_data(user_data):
    """僅負責驗證使用者資料"""
    if not user_data.get('email'):
        raise ValueError("Email required")
    return True

def save_user_to_database(user_data):
    """僅負責儲存資料"""
    database.save(user_data)

def send_welcome_notification(email):
    """僅負責發送歡迎郵件"""
    email_service.send_welcome_email(email)

def log_user_registration(username):
    """僅負責記錄日誌"""
    logger.info(f"User {username} registered successfully")

Bad code:

# 違反單一職責的函式
def process_user_data(user_data):
    # 驗證資料
    if not user_data.get('email'):
        raise ValueError("Email required")
    
    # 儲存到資料庫
    database.save(user_data)
    
    # 發送通知郵件
    email_service.send_welcome_email(user_data['email'])
    
    # 記錄日誌
    logger.info(f"User {user_data['name']} processed")
  • 程式碼組織結構

    • 降層原則:由上到下的閱讀順序
    • 錯誤處理:使用例外處理取代錯誤碼
  • 註解最佳實踐

    • 何時需要註解,何時不需要
    • 讓程式碼自我說明
    • 有效註解的撰寫技巧
  • 程式碼格式化

    • 一致性的重要性
    • 縮排與空白字元的運用
    • 程式碼區塊的邏輯分組

第二階段:進階設計原則

  • 五大SOLID原則詳解

    • S單一職責原則SRP
    • O開放封閉原則OCP
    • L里氏替換原則LSP
    • I介面隔離原則ISP
    • D依賴反轉原則DIP
  • 實務應用案例

    • 每個原則的程式碼範例
    • 違反原則的常見問題
  • 常用設計模式

    • 工廠模式:封裝物件創建
    • 策略模式:演算法替換
    • 觀察者模式:事件處理
    • 裝飾者模式:功能擴展
  • 重構基本概念

    • 重構定義:改善內部結構不影響外部行為
    • 重構時機:三次法則與預備性重構
    • 安全重構:依賴測試確保正確性
  • 常用重構手法

    • 提取方法Extract Method
    • 封裝成員變數Encapsulate Field
    • 方法更名Rename Method
    • 消除重複程式碼

第三階段:實戰應用

  • TDD基本概念與流程

    • 紅燈-綠燈-重構循環
    • 單元測試的撰寫技巧
    • 測試覆蓋率與品質指標
  • 專案案例分析

    • BMI計算機Clean Code版本實作
    • 購物車系統的Clean Code改造
    • 登錄註冊系統的重構實戰
  • 程式碼審查流程

    • 審查清單建立
    • 給予建設性回饋的技巧
    • 處理團隊中程式碼品質分歧

第四階段:進階實踐

  • 效能最佳化考量

    • 何時最佳化?
    • Clean Code與效能的權衡
    • 常見效能反模式避免
  • 建立個人程式碼品質標準

參考來源