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

201 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
aliases:
date: 2025-08-04
time: 16:49:36
description:
---
# 核心設計原則
本課程遵循3Rs架構
1. 可讀性Readability讓程式碼易於理解和維護
2. 可重用性Reusability減少重複程式碼提高開發效率
3. 可重構性Refactorability支援模組化設計和持續改進
# 第一階段:基礎理論與核心原則
- **Clean Code定義與重要性**
- 什麼是Clean Code易讀、易懂、易維護的程式碼
- 技術債務的概念與影響
- 童子軍規則:讓程式碼比接手時更乾淨
Good code:
```python
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:
```python
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:
```javascript
// 良好的命名
let elapsedTimeInDays;
let activeUsers = [];
let calculateTotalPrice = (price, quantity) => price * quantity;
```
```python
def fetch_user_profile():
return user_profile_data
def validate_user_credentials():
# 驗證使用者憑證
codes.....
```
Bad code:
```javascript
// 糟糕的命名
let d; // 經過的天數
let u = []; // 使用者列表
let calc = (a, b) => a * b;
```
```python
def data():
return user_info
def process():
# 處理某些東西
pass
```
- **函式設計原則**
- 單一職責原則:一個函式只做一件事
- 函式長度控制目標在20行以下
- 參數管理最多3個參數的建議
- 避免副作用與Flag參數
## 一個函式只做一件事
Good code:
```python
# 遵循單一職責的函式
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:
```python
# 違反單一職責的函式
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與效能的權衡
- 常見效能反模式避免
- **建立個人程式碼品質標準**
# 參考來源