# 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 = ({ cardData, ...props }) => { const { /* 共用邏輯 */ } = useReviewLogic() return (
{/* 翻卡特定邏輯 */}
) } ``` ## 📋 實施階段 ### **階段 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 組件的架構分析,旨在提升程式碼品質和維護性。*