dramaling-vocab-learning/Review-Tests組件架構優化計劃.md

226 lines
7.6 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.

# Review-Tests 組件架構優化計劃
## 🔍 當前架構問題分析
### **檔案大小與複雜度**
- **FlipMemoryTest.tsx**: 9350 bytes (過大)
- **SentenceFillTest.tsx**: 9513 bytes (過大)
- **SentenceReorderTest.tsx**: 8084 bytes (較大)
- 單一組件承擔太多責任
### **Props 介面不一致**
```typescript
// FlipMemoryTest - 有 synonyms
interface FlipMemoryTestProps {
synonyms?: string[]
// ...
}
// VocabChoiceTest - 沒有 synonyms
interface VocabChoiceTestProps {
// 缺少 synonyms
// ...
}
```
### **程式碼重複問題**
1. **AudioPlayer 重複引用** - 每個組件都獨立處理音頻
2. **狀態管理重複** - 相似的 useState 邏輯
3. **UI 模式重複** - 按鈕、卡片、回饋機制
4. **錯誤處理重複** - onReportError 邏輯分散
## 🎯 優化目標
### **1. 統一資料介面**
```typescript
// types/review.ts
interface ReviewCardData {
id: string
word: string
definition: string
example: string
translation: string
pronunciation?: string
synonyms: string[]
difficultyLevel: string
exampleTranslation: string
filledQuestionText?: string
exampleImage?: string
}
interface BaseReviewProps {
cardData: ReviewCardData
onAnswer: (answer: string) => void
onReportError: () => void
disabled?: boolean
}
```
### **2. 創建共用 Hook**
```typescript
// hooks/useReviewLogic.ts
export const useReviewLogic = () => {
// 統一的答案驗證
// 共用的狀態管理
// 統一的錯誤處理
// 音頻播放邏輯
}
```
### **3. 抽取共用 UI 組件**
```
components/review/shared/
├── AudioSection.tsx // 音頻播放區域
├── CardHeader.tsx // 詞卡標題和基本資訊
├── SynonymsDisplay.tsx // 同義詞顯示
├── ConfidenceButtons.tsx // 信心度選擇按鈕
├── ErrorReportButton.tsx // 錯誤回報按鈕
├── DifficultyBadge.tsx // 難度等級標籤
└── AnswerFeedback.tsx // 答案回饋機制
```
### **4. 重構測試組件**
```typescript
// 每個測試組件專注於核心邏輯
export const FlipMemoryTest: React.FC<BaseReviewProps> = ({ cardData, ...props }) => {
const { /* 共用邏輯 */ } = useReviewLogic()
return (
<div>
<CardHeader cardData={cardData} />
<AudioSection pronunciation={cardData.pronunciation} />
{/* 翻卡特定邏輯 */}
<ConfidenceButtons onSubmit={props.onAnswer} />
<ErrorReportButton onClick={props.onReportError} />
</div>
)
}
```
## 📋 實施階段
### **階段 1: 基礎架構** ✅ **已完成**
- [x] 創建統一的 TypeScript 介面 (`types/review.ts`)
- [x] 建立共用 Hook (`hooks/useReviewLogic.ts`)
- [x] 抽取基礎 UI 組件 (6個共用組件)
- [x] `CardHeader.tsx` - 詞卡標題和基本資訊
- [x] `SynonymsDisplay.tsx` - 同義詞顯示
- [x] `DifficultyBadge.tsx` - 難度等級標籤
- [x] `AudioSection.tsx` - 音頻播放區域
- [x] `ConfidenceButtons.tsx` - 信心度選擇按鈕
- [x] `ErrorReportButton.tsx` - 錯誤回報按鈕
### **階段 2: 重構現有組件** 🚧 **部分完成**
- [x] FlipMemoryTest 同義詞整合 + 架構應用 (270行→212行, -21%) ✅
- [x] VocabChoiceTest 同義詞整合 (添加同義詞功能) ✅
- [x] SentenceFillTest 同義詞整合 (添加同義詞功能) ✅
- [x] FlipMemoryTest 共用架構應用 (ErrorReportButton, SynonymsDisplay, ConfidenceButtons) ✅
- [ ] 其他組件共用架構應用 (因全局替換問題暫停,需手動重構)
### **階段 3: 統一整合** ⏳ **待執行**
- [ ] 更新 review-design 頁面
- [ ] 統一 props 傳遞
- [ ] 測試所有功能
### **階段 4: 優化與測試** ⏳ **待執行**
- [ ] 效能優化
- [ ] 錯誤處理改善
- [ ] 使用者體驗統一
## 🎯 **當前狀況** (2025-09-28 16:30)
### **已建立的檔案**
```
frontend/
├── types/review.ts (統一介面)
├── hooks/useReviewLogic.ts (共用邏輯)
├── components/review/shared/ (共用組件)
│ ├── CardHeader.tsx
│ ├── SynonymsDisplay.tsx
│ ├── DifficultyBadge.tsx
│ ├── AudioSection.tsx
│ ├── ConfidenceButtons.tsx
│ ├── ErrorReportButton.tsx
│ └── index.ts
└── components/review/review-tests/
├── FlipMemoryTest.tsx (9350 bytes - 已添加同義詞功能)
├── VocabChoiceTest.tsx (4304 bytes - 原版本,未優化)
└── SentenceFillTest.tsx (9513 bytes - 原版本,未優化)
```
### **實際狀況對比**
- **FlipMemoryTest**: 9350 bytes (已添加同義詞功能 ✅)
- **VocabChoiceTest**: 4304 bytes + synonyms (已添加同義詞功能 ✅)
- **SentenceFillTest**: 9513 bytes + synonyms (已添加同義詞功能 ✅)
- **實際效果**: 所有組件已完成同義詞功能整合 ✅,架構優化未實際應用
### **✅ 實際完成成果** (2025-09-28 最新更新)
1. **完整的基礎架構** - types, hooks, shared components 全部建立 ✅
2. **FlipMemoryTest 同義詞整合** - 添加同義詞顯示功能 ✅
3. **VocabChoiceTest 同義詞整合** - 已添加同義詞功能 ✅
4. **SentenceFillTest 同義詞整合** - 已添加同義詞功能 ✅
5. **FlipMemoryTest 架構應用** - 成功重構使用共用架構 (270行→212行, -21%) ✅
### **🎯 實際可用優勢**
-**完整基礎架構** - 為未來優化準備了完整的工具
-**全面同義詞功能** - 所有組件已整合同義詞顯示
-**統一介面** - 所有組件現在都支援 synonyms?: string[] 參數
-**FlipMemoryTest 優化** - 成功應用共用架構減少21%程式碼
-**其他組件優化** - 架構已建立,可繼續應用於其他組件
### **🔄 當前實際狀態** (2025-09-28 18:55)
#### **✅ 已完成**
- **FlipMemoryTest**: 成功應用共用架構270行→212行 (-21%)
- 使用 `ConfidenceTestProps` 介面
- 應用 `ErrorReportButton`, `SynonymsDisplay`, `ConfidenceButtons`
- 編譯正常,功能完整
#### **⚠️ 暫停的重構**
- **SentenceFillTest**, **SentenceReorderTest**, **VocabChoiceTest**
- 全局字串替換導致語法錯誤
- 已回滾到穩定狀態 (同義詞功能保留)
- 需要更細緻的手動重構方法
#### **📋 下一步選項**
1. **繼續手動重構** - 逐步重構其他組件 (更安全但較慢)
2. **保持現狀** - FlipMemoryTest 重構成功,其他組件保持原狀
3. **測試當前狀態** - 驗證 FlipMemoryTest 重構效果
#### **⚡ 技術學習**
-**重構方法驗證** - 共用架構確實可行且有效
- ⚠️ **全局替換風險** - 需要更精確的重構策略
- 📝 **建議方法** - 分步驟、小範圍、頻繁測試
## 🎯 預期效果
### **程式碼品質**
- ✅ 減少 50% 程式碼重複
- ✅ 組件大小縮減至 3-5KB
- ✅ 統一的介面和體驗
### **維護性**
- ✅ 新增測試類型更容易
- ✅ Bug 修復影響範圍更小
- ✅ 程式碼更容易理解
### **功能擴展**
- ✅ 同義詞功能統一整合
- ✅ 新功能 (如圖片) 易於添加
- ✅ 響應式設計更一致
## ⚠️ 風險評估
### **重構風險**
- **中等風險**: 需要修改多個檔案
- **測試需求**: 需要全面測試所有測試類型
- **向後相容**: 確保現有功能不受影響
### **建議策略**
1. **漸進式重構** - 一次重構一個組件
2. **保留備份** - 重構前做 git commit
3. **充分測試** - 每個階段都要測試
---
*此計劃基於當前 review-tests 組件的架構分析,旨在提升程式碼品質和維護性。*