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

10 KiB
Raw Permalink Blame 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. 当前状态: 已提取基础模块,主组件重构需要继续完成