Code Review Skill
何時使用此 Skill
當需要:
- •審查新程式碼或 Pull Request(偵測 bug、安全漏洞)
- •檢查執行緒安全(Python GUI、Go 並發)
- •驗證資料庫操作(IncrementalJSONDB 使用規範)
- •審查 Python ↔ Go 整合(GoBridge、JSON 結構)
- •偵測效能問題(不當資料庫使用、重複操作)
審查原則
高信噪比 - 僅報告重要問題:
- •✅ Bug、安全漏洞、執行緒不安全、效能問題
- •❌ 風格、格式、命名(已有 linter)
Python 程式碼審查檢查清單
1. 執行緒安全 ⚠️ 最重要
❌ 常見錯誤
python
# 錯誤:直接在背景執行緒更新 GUI
def worker_thread(self):
result = long_task()
self.label.config(text="完成") # ❌ 崩潰風險!
✅ 正確做法
python
# 正確:使用 root.after() 回到主執行緒
def worker_thread(self):
result = long_task()
self.root.after(0, lambda: self.label.config(text="完成"))
檢查重點
- • 長時間操作在背景執行緒執行?
- • GUI 更新使用
root.after()? - • 共用資料使用
threading.Lock? - • 進度回報函式是執行緒安全的?
2. 資料庫操作規範
❌ 效能陷阱
python
# 錯誤:迴圈中重複寫入完整 JSON
for code in codes:
db = JSONDBManager('data/json_db') # ❌ 每次讀寫完整檔案!
db.add_video(code, info)
✅ 正確做法
python
# 正確:使用增量資料庫
db = IncrementalJSONDB('data/json_db')
for code in codes:
db.add_or_update_video(code, info) # ✅ 快 40 倍
db.compact() # 最後統一合併
檢查重點
- • 使用
IncrementalJSONDB而非JSONDBManager? - • 批次操作後呼叫
compact()? - • 沒有在迴圈中重複開啟資料庫?
3. 錯誤處理
❌ 不完整的錯誤處理
python
# 錯誤:網路請求沒有錯誤處理
def search_actress(code):
response = requests.get(url) # ❌ 可能失敗
return response.json()
✅ 正確做法
python
# 正確:完整的錯誤處理
def search_actress(code):
try:
response = requests.get(url, timeout=20)
response.raise_for_status()
return response.json()
except requests.Timeout:
logger.error(f"❌ 搜尋逾時: {code}")
return None
except Exception as e:
logger.error(f"❌ 搜尋失敗: {e}")
return None
檢查重點
- • 網路請求有 timeout?
- • 檔案操作有 try-except?
- • 使用 emoji 日誌前綴?(🚀 ✅ ❌ ⚠️ 📊)
4. 日文編碼處理
❌ 編碼問題
python
# 錯誤:假設所有網站都是 UTF-8
html = response.content.decode('utf-8') # ❌ 日文網站可能不是
✅ 正確做法
python
# 正確:自動檢測編碼 import chardet detected = chardet.detect(response.content) html = response.content.decode(detected['encoding'], errors='ignore')
檢查重點
- • 日文網站爬蟲使用 chardet?
- • HTTP 請求拒絕 Brotli 壓縮?
- • BeautifulSoup 使用正確的 parser?
Go 程式碼審查檢查清單
1. 錯誤處理 ⚠️ 最重要
❌ 常見錯誤
go
// 錯誤:忽略錯誤
file, _ := os.Open("data.json") // ❌ 危險!
defer file.Close()
✅ 正確做法
go
// 正確:檢查所有錯誤
file, err := os.Open("data.json")
if err != nil {
return fmt.Errorf("開啟檔案失敗: %w", err) // ✅ 錯誤包裝
}
defer file.Close()
檢查重點
- • 所有
error都檢查了? - • 使用
fmt.Errorf包裝錯誤? - • 錯誤訊息包含上下文資訊?
2. 並發安全
❌ 競態條件
go
// 錯誤:未保護的共用資源
type Counter struct {
count int
}
func (c *Counter) Increment() {
c.count++ // ❌ 競態條件!
}
✅ 正確做法
go
// 正確:使用 Mutex
type Counter struct {
mu sync.Mutex
count int
}
func (c *Counter) Increment() {
c.mu.Lock()
defer c.mu.Unlock()
c.count++ // ✅ 執行緒安全
}
檢查重點
- • 共用資料使用
sync.Mutex或sync.RWMutex? - • goroutine 使用
sync.WaitGroup等待? - • channel 正確關閉?
3. JSON 輸出規範
❌ 錯誤輸出到 stdout
go
// 錯誤:錯誤訊息輸出到 stdout
func main() {
if err != nil {
fmt.Println("Error:", err) // ❌ 破壞 JSON 格式!
os.Exit(1)
}
// JSON 輸出...
}
✅ 正確做法
go
// 正確:錯誤到 stderr,JSON 到 stdout
func main() {
if err != nil {
fmt.Fprintln(os.Stderr, "Error:", err) // ✅ stderr
os.Exit(1)
}
json.NewEncoder(os.Stdout).Encode(result) // ✅ stdout
}
檢查重點
- • 錯誤訊息輸出到
os.Stderr? - • JSON 輸出到
os.Stdout? - • 使用
json.NewEncoder輸出 JSON?
4. 資源管理
❌ 資源洩漏(檔案)
go
// 錯誤:沒有關閉檔案
func readFile(path string) ([]byte, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
return io.ReadAll(file) // ❌ 檔案沒關閉!
}
✅ 正確做法(檔案)
go
// 正確:使用 defer 確保關閉
func readFile(path string) ([]byte, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close() // ✅ 一定會關閉
return io.ReadAll(file)
}
❌ 資源洩漏(HTTP)
go
// 錯誤:沒有關閉 Response Body
func fetchData(url string) ([]byte, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err
}
return io.ReadAll(resp.Body) // ❌ Body 沒關閉!
}
✅ 正確做法(HTTP)
go
// 正確:必須關閉 Response Body
func fetchData(url string) ([]byte, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close() // ✅ 防止連線洩漏
return io.ReadAll(resp.Body)
}
檢查重點
- • 檔案操作使用
defer Close()? - • HTTP response body 被關閉?
- • 沒有 goroutine 洩漏?
- • 使用
go vet檢查資源洩漏?
Python ↔ Go 整合審查
1. JSON 結構一致性
檢查重點
- • Go 輸出的 JSON 結構與 Python 預期相符?
- • 欄位名稱使用 snake_case(JSON tag)?
- • 可選欄位使用
omitempty?
範例檢查
go
// Go 結構
type ScanResult struct {
Path string `json:"path"`
Code string `json:"code"`
Size int64 `json:"size"`
}
python
# Python 對應
@dataclass
class ScanResult:
path: str
code: str
size: int
2. GoBridge 錯誤處理
❌ 不完整的 fallback
python
# 錯誤:沒有 fallback
def scan_directory(self, dir):
bridge = GoBridge()
return bridge.scan(dir) # ❌ Go 不可用時崩潰
✅ 正確做法
python
# 正確:完整的 fallback
def scan_directory(self, dir):
bridge = GoBridge()
if bridge.is_available:
try:
return bridge.scan(dir) # Go 加速
except Exception as e:
logger.warning(f"Go 失敗,切換 Python: {e}")
# Fallback 到 Python
return python_scanner.scan(dir)
檢查重點
- • 檢查
bridge.is_available? - • 有 Python fallback 機制?
- • 記錄 fallback 原因?
特殊檢查項目
Windows 路徑處理
❌ 錯誤
python
path = "C:/Users/test/file.mp4" # ❌ Unix 風格
✅ 正確
python
import os
path = os.path.join("C:\\Users", "test", "file.mp4") # ✅ 跨平台
# 或使用 pathlib
from pathlib import Path
path = Path("C:/Users/test/file.mp4") # ✅ 自動轉換
級聯搜尋邏輯
檢查順序
python
# 正確的級聯順序 # 1. AV-WIKI (主要) # 2. chiba-f (備援) # 3. JAVDB (最終)
檢查重點
- • 搜尋順序正確?
- • 每層失敗才降級?
- • 記錄每次搜尋結果?
審查報告格式
當發現問題時,使用以下格式報告:
🐛 Bug 報告範本
markdown
**問題**: [簡短描述] **位置**: 檔案:行號 **嚴重性**: 🔴 高 / 🟡 中 / 🟢 低 **原因**: [為什麼這是問題] **建議修正**: [程式碼區塊]
✅ 審查通過範本
markdown
✅ **審查通過** - 執行緒安全:正確 - 錯誤處理:完整 - 效能考量:良好
審查流程
- •理解變更 - 閱讀 diff 或檔案內容
- •識別關鍵區域 - 執行緒、資料庫、網路、錯誤處理
- •檢查專案規範 - 參考本 Skill 的檢查清單
- •報告重要問題 - 使用報告範本
- •忽略小問題 - 風格、格式等
相關資源
- •
CLAUDE.md- 完整開發規範 - •
src/services/go_bridge.py- Python ↔ Go 橋接層 - •
pkg/- Go 套件原始碼 - •
.claude/skills/go-bridge-development/SKILL.md- Go 開發指引 - •
.claude/skills/gui-development/SKILL.md- GUI 執行緒安全指引
快速檢查指令
bash
# Python 語法檢查 python -m py_compile src/**/*.py # Go 語法檢查 go build ./... # Python 測試 python -m pytest tests/ -v # Go 測試 go test ./... -v # Go 競態檢測 go test -race ./...
記住:專注於真正重要的問題,保持高信噪比! 🎯