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

287 lines
10 KiB
Markdown
Raw Permalink Normal View History

# 代码重构规划文档
## 统计结果
### 超过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. **当前状态**: 已提取基础模块,主组件重构需要继续完成