Files
frontend/ARCHITECTURE_REFACTOR_PLAN.md
lafay a6cdb97e24 refactor: 架构重构 - 解耦过度耦合模块
主要改动:
1. 创建乐观更新工具函数 (optimisticUpdate.ts)
   - 消除 userStore.ts 中的重复代码

2. 拆分 useResponsive.ts (485行 -> 12个专注模块)
   - useBreakpoint: 断点检测
   - useOrientation: 方向检测
   - usePlatform: 平台检测
   - useScreenSize: 屏幕尺寸
   - useResponsiveValue: 响应式值
   - useResponsiveStyle: 响应式样式
   - useMediaQuery: 媒体查询
   - useColumnCount: 列数计算
   - useResponsiveSpacing: 响应式间距

3. 整理数据层 (Repository 层)
   - ApiDataSource: API数据源
   - LocalDataSource: 本地数据源
   - CacheDataSource: 缓存数据源
   - MessageRepository: 消息仓库

4. 重构 messageManager.ts (2194行 -> 4个模块)
   - MessageStateManager: 状态管理
   - WebSocketMessageHandler: WebSocket处理
   - MessageSyncService: 消息同步
   - ReadReceiptManager: 已读管理

5. 导航解耦 (MainNavigator.tsx: 1118行 -> 100行)
   - 创建 NavigationService 解耦层
   - 拆分多个 Navigator 组件

架构改进:
- 单一职责原则: 每个模块职责明确
- 依赖倒置: 通过接口解耦
- 代码复用: 工具函数可被多处使用
- 可测试性: 各模块可独立测试
2026-03-18 12:11:49 +08:00

6.8 KiB
Raw Blame History

架构修复方案文档

1. 重构目标

1.1 核心原则

  • 单一职责:每个模块只负责一个明确的功能
  • 依赖倒置:高层模块不依赖低层模块,都依赖抽象
  • 开闭原则:对扩展开放,对修改关闭

1.2 目标架构

src/
├── core/                    # 核心业务逻辑(框架无关)
│   ├── entities/           # 业务实体
│   ├── repositories/       # 仓库接口
│   └── usecases/          # 业务用例
├── data/                   # 数据层
│   ├── datasources/       # 数据源实现API、DB、Cache
│   ├── repositories/      # 仓库实现
│   └── mappers/          # 数据映射
├── presentation/          # 表现层
│   ├── components/       # UI组件
│   ├── screens/         # 屏幕组件
│   ├── stores/          # 状态管理
│   └── hooks/           # 自定义hooks
└── infrastructure/      # 基础设施
    ├── navigation/      # 导航
    ├── theme/          # 主题
    └── services/       # 外部服务

2. 具体修复方案

2.1 messageManager.ts 重构方案

现状问题

  • 1500+行,上帝对象
  • 混合了 WebSocket、数据库、状态管理、UI通知
  • 与SQLite深度耦合

目标结构

src/data/
├── datasources/
│   ├── WebSocketClient.ts      # WebSocket连接管理
│   └── MessageDataSource.ts    # 消息数据源
├── repositories/
│   └── MessageRepository.ts    # 消息仓库实现
└── mappers/
    └── MessageMapper.ts        # 消息数据映射

src/core/
├── entities/
│   └── Message.ts              # 消息实体
├── repositories/
│   └── IMessageRepository.ts   # 仓库接口
└── usecases/
    ├── ProcessMessageUseCase.ts
    ├── SyncMessagesUseCase.ts
    └── UpdateReadReceiptUseCase.ts

src/presentation/stores/
└── messageStore.ts             # 简化的消息状态管理

重构步骤

  1. 提取 WebSocketClient - 纯连接管理
  2. 创建 MessageRepository - 数据访问抽象
  3. 创建 UseCases - 业务逻辑
  4. 重写 messageStore - 仅负责UI状态
  5. 删除旧的 messageManager.ts

2.2 乐观更新工具函数方案

现状问题

  • userStore.ts 中重复6+次相同模式
  • 代码冗余,难以维护

目标API

// utils/optimisticUpdate.ts
export interface OptimisticUpdateOptions<T, R> {
  store: StoreApi<any>;
  getCurrentState: () => T;
  optimisticUpdate: (current: T) => T;
  apiCall: () => Promise<R>;
  onSuccess?: (result: R, current: T) => T;
  onError?: (error: any, original: T) => void;
}

export async function optimisticUpdate<T, R>(
  options: OptimisticUpdateOptions<T, R>
): Promise<R>

使用示例

// 重构前(重复代码)
set(state => ({ posts: updatedPosts }));
try {
  const result = await postService.like(postId);
  // ...
} catch (error) {
  set(state => ({ posts: originalPosts }));
}

// 重构后(简洁)
await optimisticUpdate({
  store,
  getCurrentState: () => store.getState().posts,
  optimisticUpdate: (posts) => updatePostLikes(posts, postId, true),
  apiCall: () => postService.like(postId),
  onSuccess: (result, posts) => updatePostWithServerData(posts, result),
});

2.3 useResponsive.ts 拆分方案

现状问题

  • 485行43个导出
  • 功能混杂:断点检测、响应式值计算、平台检测

目标结构

src/presentation/hooks/responsive/
├── useBreakpoint.ts           # 断点检测
├── useResponsiveValue.ts      # 响应式值映射
├── useOrientation.ts          # 方向检测
├── usePlatform.ts            # 平台检测
├── useScreenSize.ts          # 屏幕尺寸
└── index.ts                  # 统一导出

各Hook职责

  • useBreakpoint: 返回当前断点 (mobile/tablet/desktop/wide)
  • useResponsiveValue: 根据断点返回不同值
  • useOrientation: 返回 portrait/landscape
  • usePlatform: 返回 ios/android/web
  • useScreenSize: 返回 width/height

2.4 MainNavigator 解耦方案

现状问题

  • 1118行直接依赖store
  • 混合了导航配置和业务逻辑

目标结构

src/infrastructure/navigation/
├── MainNavigator.tsx         # 简化后的导航器
├── AuthNavigator.tsx         # 认证导航
├── TabNavigator.tsx          # 标签导航
├── navigationService.ts      # 导航服务(解耦层)
├── navigationTypes.ts        # 类型定义
└── hooks/
    └── useNavigationState.ts # 导航状态hook

解耦策略

  1. 创建 NavigationService - 提供导航操作的抽象
  2. Store通过NavigationService触发导航而非直接操作
  3. MainNavigator只负责渲染不处理业务逻辑

2.5 Repository 层创建方案

现状问题

  • 服务层直接操作数据库
  • 没有明确的数据访问边界

目标结构

src/data/repositories/
├── MessageRepository.ts      # 消息数据访问
├── PostRepository.ts        # 帖子数据访问
├── UserRepository.ts        # 用户数据访问
└── interfaces/
    ├── IMessageRepository.ts
    ├── IPostRepository.ts
    └── IUserRepository.ts

职责划分

  • Repository: 数据访问抽象,定义接口
  • DataSource: 具体数据源实现API、SQLite、Cache
  • Service: 业务逻辑编排使用Repository

3. 实施计划

阶段1基础设施第1-2天

  • 创建目录结构
  • 实现乐观更新工具函数
  • 拆分 useResponsive hooks

阶段2数据层重构第3-5天

  • 创建 Repository 接口和实现
  • 创建 DataSource 层
  • 迁移数据库操作到 Repository

阶段3核心业务重构第6-10天

  • 重构 messageManager → UseCases + Store
  • 创建 WebSocketClient
  • 实现消息同步逻辑

阶段4表现层重构第11-12天

  • 解耦 MainNavigator
  • 重构 userStore 使用乐观更新工具
  • 更新所有屏幕组件

阶段5测试与优化第13-14天

  • 单元测试
  • 集成测试
  • 性能优化

4. 风险与应对

风险 影响 应对措施
重构引入bug 每个模块重构后必须测试保持API兼容
开发时间超期 分阶段交付,优先核心功能
团队成员不熟悉新架构 编写详细文档,代码审查
性能下降 添加性能监控,及时优化

5. 验收标准

  • messageManager.ts 被删除,功能拆分到多个小模块
  • userStore.ts 中无重复乐观更新代码
  • useResponsive.ts 拆分为5+个专注hook
  • MainNavigator.tsx 行数 < 300
  • 所有单元测试通过
  • 无TypeScript错误
  • 性能不劣化(启动时间、内存占用)