Files
cstb-next/todo/refactor-plan.md

287 lines
10 KiB
Markdown
Raw Permalink 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.
# 代码重构规划文档
## 统计结果
### 超过300行的文件列表
| 文件路径 | 行数 | 优先级 | 状态 |
|---------|------|--------|------|
| `src/components/cstb/FpsTest.tsx` | 1949 | 🔴 高 | 待重构 |
| `src/components/cstb/VideoSetting.tsx` | 579 | 🟡 中 | 待重构 |
| `src/components/cstb/SteamUsers.tsx` | 432 | 🟡 中 | 待重构 |
## 重构目标
1. **组件封装**:将大组件拆分为更小的、职责单一的组件
2. **功能复用**:提取可复用的逻辑和工具函数
3. **文件拆分**:将大文件拆分为多个小文件,提高可维护性
4. **代码组织**:按功能模块组织代码结构
---
## 1. FpsTest.tsx (1949行) - 高优先级
### 问题分析
- 文件过大,难以维护和调试
- 包含多个职责测试执行、结果读取、UI渲染、CSV导出等
- 大量状态管理和副作用逻辑混在一起
- 工具函数、常量、组件定义都在同一文件
### 重构方案
#### 1.1 文件结构拆分
```
src/components/cstb/FpsTest/
├── index.tsx # 主组件精简后约200行
├── types.ts # 类型定义
├── constants.ts # 常量定义BENCHMARK_MAPS, PRESET_RESOLUTIONS等
├── utils/
│ ├── vprof-parser.ts # VProf报告解析工具
│ ├── timestamp.ts # 时间戳处理工具
│ ├── fps-metrics.ts # FPS指标提取工具
│ └── csv-export.ts # CSV导出工具
├── hooks/
│ ├── useGameMonitor.ts # 游戏运行状态监控
│ ├── useTestMonitor.ts # 测试结果监控
│ ├── useBatchTest.ts # 批量测试逻辑
│ └── useHardwareInfo.ts # 硬件信息获取
├── components/
│ ├── TestConfigPanel.tsx # 测试配置面板
│ ├── ResolutionConfig.tsx # 分辨率配置组件
│ ├── TestResultsTable.tsx # 测试结果表格
│ ├── TestResultDisplay.tsx # 测试结果展示
│ ├── BatchTestProgress.tsx # 批量测试进度
│ └── NoteCell.tsx # 备注单元格
└── services/
├── testRunner.ts # 测试执行服务
└── resultReader.ts # 结果读取服务
```
#### 1.2 功能模块拆分
**工具函数模块 (utils/)**
- `vprof-parser.ts`: `parseVProfReport`, `extractFpsMetrics`
- `timestamp.ts`: `compareTimestamps`, 时间戳格式化
- `fps-metrics.ts`: FPS相关计算和格式化
- `csv-export.ts`: `handleExportCSV`, `handleExportAverageCSV`
**自定义Hooks (hooks/)**
- `useGameMonitor.ts`: 游戏运行状态检测和监控
- `useTestMonitor.ts`: 测试结果文件监控逻辑
- `useBatchTest.ts`: 批量测试状态管理和执行逻辑
- `useHardwareInfo.ts`: 硬件信息获取和管理
**组件拆分 (components/)**
- `TestConfigPanel.tsx`: 测试地图、批量测试次数、备注配置
- `ResolutionConfig.tsx`: 分辨率设置、全屏/窗口化、分辨率组管理
- `TestResultsTable.tsx`: 测试结果表格展示(包含删除、编辑备注)
- `TestResultDisplay.tsx`: 当前测试结果显示时间戳、avg、p1
- `BatchTestProgress.tsx`: 批量测试进度显示组件
- `NoteCell.tsx`: 备注单元格组件
**服务层 (services/)**
- `testRunner.ts`: `runSingleTest`, `startTest` 等测试执行逻辑
- `resultReader.ts`: `readResult` 结果读取逻辑
#### 1.3 预期效果
- 主组件文件从1949行减少到约200行
- 每个子文件控制在100-300行以内
- 提高代码可维护性和可测试性
- 便于功能扩展和bug修复
---
## 2. VideoSetting.tsx (579行) - 中优先级
### 问题分析
- 视频设置配置数组过长约200行
- 编辑/只读模式切换逻辑复杂
- 文件监听和自动刷新逻辑可以提取
### 重构方案
#### 2.1 文件结构拆分
```
src/components/cstb/VideoSetting/
├── index.tsx # 主组件精简后约200行
├── types.ts # 类型定义
├── config/
│ └── videoSettingsConfig.ts # 视频设置配置数组
├── hooks/
│ ├── useVideoConfig.ts # 视频配置读取/写入
│ ├── useFileWatcher.ts # 文件监听逻辑
│ └── useGameRunning.ts # 游戏运行状态检测
└── components/
├── VideoSettingsEditor.tsx # 编辑模式组件
└── VideoSettingsViewer.tsx # 只读模式组件
```
#### 2.2 功能模块拆分
**配置模块 (config/)**
- `videoSettingsConfig.ts`: 提取 `videoSettings` 函数和配置数组
**自定义Hooks (hooks/)**
- `useVideoConfig.ts`: 视频配置的读取、写入、刷新逻辑
- `useFileWatcher.ts`: 文件变动监听和自动刷新
- `useGameRunning.ts`: 游戏运行状态检测(可复用)
**组件拆分 (components/)**
- `VideoSettingsEditor.tsx`: 编辑模式下的所有控件
- `VideoSettingsViewer.tsx`: 只读模式下的展示
#### 2.3 预期效果
- 主组件文件从579行减少到约200行
- 配置数据独立管理,便于维护
- 编辑/查看逻辑分离,代码更清晰
---
## 3. SteamUsers.tsx (432行) - 中优先级
### 问题分析
- 三种视图模式的渲染逻辑重复
- 用户项渲染函数较长
- 可以提取为独立组件
### 重构方案
#### 3.1 文件结构拆分
```
src/components/cstb/SteamUsers/
├── index.tsx # 主组件精简后约150行
├── types.ts # 类型定义
├── components/
│ ├── UserCard.tsx # 卡片视图用户项
│ ├── UserListItem.tsx # 列表视图用户项
│ └── UserListLargeItem.tsx # 大列表视图用户项
└── hooks/
└── useSteamUsers.ts # 用户数据获取和管理
```
#### 3.2 功能模块拆分
**组件拆分 (components/)**
- `UserCard.tsx`: 卡片样式用户项组件
- `UserListItem.tsx`: 列表样式用户项组件
- `UserListLargeItem.tsx`: 大列表样式用户项组件
**自定义Hooks (hooks/)**
- `useSteamUsers.ts`: 用户数据获取、刷新、模拟数据逻辑
#### 3.3 预期效果
- 主组件文件从432行减少到约150行
- 每种视图模式独立组件,便于维护
- 减少代码重复
---
## 重构执行计划
### 阶段1: FpsTest.tsx 重构(最高优先级)
1. ✅ 创建目录结构和基础文件
2. ✅ 提取工具函数到 `utils/` 目录
-`vprof-parser.ts` - VProf报告解析
-`timestamp.ts` - 时间戳处理
-`fps-metrics.ts` - FPS指标提取
-`csv-export.ts` - CSV导出功能
3. ✅ 提取自定义Hooks到 `hooks/` 目录
-`useGameMonitor.ts` - 游戏运行状态监控
-`useHardwareInfo.ts` - 硬件信息获取
-`useTestMonitor.ts` - 测试结果监控(待完成)
-`useBatchTest.ts` - 批量测试逻辑(待完成)
4. ✅ 提取部分UI组件到 `components/` 目录
-`NoteCell.tsx` - 备注单元格组件
-`TestConfigPanel.tsx` - 测试配置面板(待完成)
-`ResolutionConfig.tsx` - 分辨率配置(待完成)
-`TestResultsTable.tsx` - 测试结果表格(待完成)
-`TestResultDisplay.tsx` - 测试结果展示(待完成)
-`BatchTestProgress.tsx` - 批量测试进度(待完成)
5. ⏳ 提取服务层逻辑到 `services/` 目录
-`testRunner.ts` - 测试执行服务(待完成)
-`resultReader.ts` - 结果读取服务(待完成)
6. ⏳ 重构主组件,整合所有子模块(进行中)
- ✅ 创建类型定义文件
- ⏳ 完整重构主组件(需要继续)
7. ⏳ 测试验证功能完整性(待完成)
### 阶段2: VideoSetting.tsx 重构
1. ⏳ 提取配置数据
2. ⏳ 提取自定义Hooks
3. ⏳ 拆分编辑/查看组件
4. ⏳ 重构主组件
### 阶段3: SteamUsers.tsx 重构
1. ⏳ 提取用户项组件
2. ⏳ 提取数据管理Hook
3. ⏳ 重构主组件
---
## 重构原则
1. **保持功能完整性**:重构过程中确保所有功能正常工作
2. **渐进式重构**:分步骤进行,每步完成后验证
3. **向后兼容**:不改变对外接口,保持组件使用方式不变
4. **代码复用**:提取公共逻辑,避免重复代码
5. **类型安全**保持TypeScript类型完整性
---
## 已完成的工作
### FpsTest.tsx 重构进度
#### ✅ 已完成
1. **目录结构创建**
-`src/components/cstb/FpsTest/` 目录结构已创建
2. **常量提取**
-`constants.ts` - BENCHMARK_MAPS, PRESET_RESOLUTIONS, TEST_TIMEOUT
3. **工具函数提取**
-`utils/vprof-parser.ts` - parseVProfReport函数
-`utils/timestamp.ts` - compareTimestamps, formatCurrentTimestamp, timestampToISO
-`utils/fps-metrics.ts` - extractFpsMetrics函数
-`utils/csv-export.ts` - handleExportCSV, handleExportAverageCSV, formatVideoSettingSummary
4. **自定义Hooks提取**
-`hooks/useGameMonitor.ts` - 游戏运行状态监控
-`hooks/useHardwareInfo.ts` - 硬件信息获取
5. **组件提取**
-`components/NoteCell.tsx` - 备注单元格组件
6. **类型定义**
-`types.ts` - Resolution, BatchTestProgress, FpsMetrics, ResolutionGroupInfo
#### ⏳ 待完成
1. **更多Hooks**
- `hooks/useTestMonitor.ts` - 测试结果文件监控逻辑
- `hooks/useBatchTest.ts` - 批量测试状态管理和执行逻辑
2. **更多组件**
- `components/TestConfigPanel.tsx` - 测试地图、批量测试次数、备注配置
- `components/ResolutionConfig.tsx` - 分辨率设置组件
- `components/TestResultsTable.tsx` - 测试结果表格
- `components/TestResultDisplay.tsx` - 当前测试结果显示
- `components/BatchTestProgress.tsx` - 批量测试进度显示
3. **服务层**
- `services/testRunner.ts` - 测试执行服务runSingleTest, startTest
- `services/resultReader.ts` - 结果读取服务readResult
4. **主组件重构**
- 使用提取的模块重构 `index.tsx`
- 确保所有功能正常工作
## 注意事项
1. 重构前确保有完整的测试覆盖(如果有)
2. 重构过程中注意保持状态管理的一致性
3. 提取Hook时注意依赖项的正确传递
4. 组件拆分时注意props的类型定义
5. 工具函数提取时注意副作用处理
6. **重要**: 原文件 `FpsTest.tsx` 暂时保留,待重构完成并测试通过后再删除
7. **当前状态**: 已提取基础模块,主组件重构需要继续完成