226 lines
7.6 KiB
Markdown
226 lines
7.6 KiB
Markdown
# 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 組件的架構分析,旨在提升程式碼品質和維護性。* |