# Messages模块与PostService/Manager架构对比分析报告 ## 一、Messages模块架构分析 ### 1.1 架构层次结构 Messages模块采用了**清晰的分层架构**,各层职责明确: ``` ┌─────────────────────────────────────────────────────────────┐ │ 表现层 (Screens) │ │ ChatScreen, MessageListScreen, NotificationsScreen │ ├─────────────────────────────────────────────────────────────┤ │ Hooks层 │ │ useDifferentialMessages, useChatScreen │ ├─────────────────────────────────────────────────────────────┤ │ 用例层 (UseCases) │ │ ProcessMessageUseCase │ ├─────────────────────────────────────────────────────────────┤ │ 领域层 (Entities) │ │ Message, Conversation, GroupNotice │ ├─────────────────────────────────────────────────────────────┤ │ 仓库层 (Repositories) │ │ MessageRepository, IMessageRepository │ ├─────────────────────────────────────────────────────────────┤ │ 数据源层 (DataSources) │ │ SSEClient, LocalDataSource, ApiDataSource │ └─────────────────────────────────────────────────────────────┘ ``` ### 1.2 核心组件详解 #### 1.2.1 领域实体层 (Core/Entities) - **Message.ts**: 定义消息、会话、群通知等核心领域模型 - 包含工厂函数:`createMessage`, `createConversation` - 包含业务逻辑函数:`isMessageFromCurrentUser`, `shouldIncrementUnread`, `buildTextContent` #### 1.2.2 用例层 (Core/UseCases) - **ProcessMessageUseCase**: 核心业务逻辑编排器 - 订阅SSE事件(chat, group_message, read, recall, typing, group_notice等) - 消息去重处理(processedMessageIds Set) - 已读状态保护(pendingReadMap + 版本号机制) - 用户信息缓存与去重请求(pendingUserRequests Map) - 事件发布订阅模式(subscribers Set) #### 1.2.3 仓库层 (Data/Repositories) - **IMessageRepository**: 定义数据访问接口 - 消息操作:getMessages, saveMessage, updateMessageStatus, markAsRead - 会话操作:getConversations, saveConversation, updateUnreadCount - 同步操作:syncMessages, getServerLastSeq - **MessageRepository**: 实现接口 - 封装SQLite数据库操作 - 消息与CachedMessage的转换 #### 1.2.4 映射器层 (Data/Mappers) - **MessageMapper**: 数据转换 - `fromApiResponse`: API响应 → 应用模型 - `fromDbRecord`: 数据库记录 → 应用模型 - `toDbRecord`: 应用模型 → 数据库记录 - `toApiRequest`: 应用模型 → API请求 - 创建消息片段:`createTextSegment`, `createImageSegment` #### 1.2.5 差异计算基础设施 (Infrastructure/Diff) - **MessageDiffCalculator**: 消息列表差异计算 - 计算added, updated, deleted, moved, unchanged - 变化比例检测(changeRatio > 0.5 时触发重置) - 增量差异计算(基于缓存) - **MessageUpdateBatcher**: 批量更新处理器 - 16ms批量间隔(约60fps) - 去重和合并更新 - 100ms最大等待时间 - 统计信息:totalBatches, totalUpdates, averageBatchSize - **types.ts**: 完整的类型定义 - MessageUpdateType枚举:ADD, UPDATE, DELETE, MOVE, BATCH_* - DiffResult, DiffConfig等接口 #### 1.2.6 Hook层 - **useDifferentialMessages**: 差异更新Hook - 集成DiffCalculator和Batcher - 自动处理批量更新 - 提供flush, reset, forceUpdate方法 - 支持配置:enableDiff, enableBatching, maxMessageCount, changeRatioThreshold ### 1.3 数据流 ``` SSE事件 → ProcessMessageUseCase → 事件发布 → useChatScreen → useDifferentialMessages ↓ ↓ MessageRepository 差异计算 + 批量处理 ↓ ↓ SQLite数据库 优化后的消息列表 ``` ### 1.4 状态管理方式 - **发布-订阅模式**:ProcessMessageUseCase作为事件中心 - **本地SQLite缓存**:消息持久化存储 - **内存状态**:通过Hook返回,组件直接消费 - **差异更新**:通过MessageDiffCalculator + MessageUpdateBatcher减少重渲染 --- ## 二、PostService/Manager架构分析 ### 2.1 架构层次结构 Post模块采用了**扁平化架构**,Service和Manager层职责混合: ``` ┌─────────────────────────────────────────────────────────────┐ │ 表现层 (Screens) │ │ HomeScreen, PostDetailScreen, CreatePostScreen │ ├─────────────────────────────────────────────────────────────┤ │ Hooks层 │ │ useCursorPagination (通用), usePrefetch │ ├─────────────────────────────────────────────────────────────┤ │ Store层 (Zustand) │ │ useUserStore (直接操作状态), postManager (缓存管理) │ ├─────────────────────────────────────────────────────────────┤ │ Service层 │ │ postService (API调用 + 状态更新) │ ├─────────────────────────────────────────────────────────────┤ │ 数据源 │ │ API (直接调用) │ └─────────────────────────────────────────────────────────────┘ ``` ### 2.2 核心组件详解 #### 2.2.1 Service层 (Services) - **postService.ts**: 帖子服务 - CRUD操作:getPosts, getPost, createPost, updatePost, deletePost - 互动操作:likePost, unlikePost, favoritePost, unfavoritePost - 分页支持:传统分页 + 游标分页 - **问题**:直接操作useUserStore(违反分层原则) #### 2.2.2 Manager层 (Stores) - **postManager.ts**: 帖子缓存管理器 - 继承CacheBus(发布订阅基类) - 内存缓存:listCache, detailCache - 请求去重:pendingRequests Map - TTL管理:LIST_TTL=30s, DETAIL_TTL=60s - 后台刷新机制 #### 2.2.3 Store层 (Zustand) - **useUserStore**: 用户状态存储 - 直接存储posts数组 - 帖子操作副作用直接修改状态 - 混合了用户数据和帖子数据 #### 2.2.4 映射器层 (Data/Mappers) - **PostMapper**: 数据转换 - `fromApiResponse`: API响应 → 应用模型 - `fromApiResponseList`: 批量转换 - `toApiRequest`: 应用模型 → API请求 - 相比MessageMapper缺少数据库记录转换方法 ### 2.3 数据流 ``` HomeScreen → useCursorPagination → postService.getPostsCursor ↓ useUserStore.setState(posts) ↓ PostCard组件渲染 ``` ### 2.4 状态管理方式 - **Zustand Store**:集中式状态管理 - **内存缓存**:postManager提供应用级缓存 - **请求去重**:dedupe方法防止重复请求 - **直接修改**:postService直接调用useUserStore.setState --- ## 三、主要架构差异 ### 3.1 分层复杂度 | 维度 | Messages模块 | Post模块 | |------|-------------|---------| | 层次深度 | 6层(Entity→UseCase→Repository→Mapper→Hook→Screen) | 4层(Service→Store→Hook→Screen) | | 用例层 | 独立ProcessMessageUseCase | 无 | | 仓库接口 | IMessageRepository抽象接口 | 无 | | 基础设施 | Diff模块(Calculator + Batcher) | 无 | ### 3.2 数据持久化 | 维度 | Messages模块 | Post模块 | |------|-------------|---------| | 本地存储 | SQLite数据库 | 无 | | 缓存抽象 | MessageRepository封装 | postManager内存缓存 | | 离线支持 | 完整 | 不支持 | ### 3.3 实时更新 | 维度 | Messages模块 | Post模块 | |------|-------------|---------| | 推送机制 | SSE实时推送 | 轮询/下拉刷新 | | 事件订阅 | ProcessMessageUseCase发布订阅 | 无 | | 增量更新 | MessageDiffCalculator | 无 | ### 3.4 状态管理 | 维度 | Messages模块 | Post模块 | |------|-------------|---------| | 管理方式 | 发布订阅 + Hook局部状态 | Zustand全局Store | | 状态来源 | useChatScreen, useDifferentialMessages | useUserStore | | 批量更新 | MessageUpdateBatcher | 无 | | 差异检测 | MessageDiffCalculator | 无 | ### 3.5 依赖方向 **Messages模块(正确)**: ``` Hook → UseCase → Repository → DataSource ↓ Entity(不依赖外部) ``` **Post模块(问题)**: ``` Service → Store(循环依赖风险) ↓ API直接调用 ``` ### 3.6 核心问题总结 | # | 问题 | Messages | Post | |---|------|---------|------| | 1 | 违反分层原则 | 无 | postService直接操作useUserStore | | 2 | 缺少UseCase层 | ProcessMessageUseCase | 无业务逻辑编排 | | 3 | 缺少Repository抽象 | IMessageRepository | 无数据访问接口 | | 4 | 无差异更新 | useDifferentialMessages | 无 | | 5 | 无批量处理 | MessageUpdateBatcher | 无 | | 6 | 无本地持久化 | SQLite | 无 | | 7 | 无实时推送 | SSE | 无 | --- ## 四、对齐建议 ### 4.1 架构重构目标 将Post模块对齐到Messages模块的架构模式: ``` ┌─────────────────────────────────────────────────────────────┐ │ 表现层 (Screens) │ │ HomeScreen, PostDetailScreen │ ├─────────────────────────────────────────────────────────────┤ │ Hooks层 │ │ useDifferentialPosts (新增) │ ├─────────────────────────────────────────────────────────────┤ │ 用例层 (UseCases) │ │ ProcessPostUseCase (新增) │ ├─────────────────────────────────────────────────────────────┤ │ 领域层 (Entities) │ │ Post, PostComment (新增) │ ├─────────────────────────────────────────────────────────────┤ │ 仓库层 (Repositories) │ │ PostRepository, IPostRepository (新增) │ ├─────────────────────────────────────────────────────────────┤ │ Service层 │ │ postService (仅保留API调用,移除状态操作) │ └─────────────────────────────────────────────────────────────┘ ``` ### 4.2 具体改造项 #### 4.2.1 创建Post领域实体 ```typescript // src/core/entities/Post.ts export interface Post { id: string; authorId: string; title: string; content: string; images: string[]; likeCount: number; commentCount: number; // ... 其他字段 } ``` #### 4.2.2 创建ProcessPostUseCase ```typescript // src/core/usecases/ProcessPostUseCase.ts class ProcessPostUseCase { // 帖子增删改查 // 点赞/收藏逻辑 // 事件发布订阅 } ``` #### 4.2.3 创建IPostRepository接口 ```typescript // src/data/repositories/interfaces/IPostRepository.ts interface IPostRepository { getPosts(type: string, page: number, pageSize: number): Promise; savePost(post: Post): Promise; updatePost(postId: string, updates: Partial): Promise; // ... } ``` #### 4.2.4 创建PostRepository实现 ```typescript // src/data/repositories/PostRepository.ts // 封装SQLite操作,实现IPostRepository接口 ``` #### 4.2.5 创建useDifferentialPosts Hook ```typescript // src/hooks/useDifferentialPosts.ts // 类似useDifferentialMessages,处理帖子列表差异更新 ``` #### 4.2.6 改造postService - 移除对useUserStore的直接依赖 - 仅保留API调用职责 --- ## 五、架构对比图 ```mermaid graph TB subgraph "Messages模块 [理想架构]" E1[Entity
Message.ts] U1[UseCase
ProcessMessageUseCase] R1[Repository
MessageRepository] M1[Mapper
MessageMapper] H1[Hook
useDifferentialMessages] D1[Diff基础设施
DiffCalculator + Batcher] S1[(SQLite)] E1 --> U1 U1 --> R1 U1 --> D1 R1 --> S1 M1 --> R1 D1 --> H1 H1 --> S1 end subgraph "Post模块 [当前架构]" E2[PostMapper] SV2[postService
直接操作Store] ST2[useUserStore
Zustand] H2[Hook
useCursorPagination] PM2[postManager
内存缓存] E2 --> SV2 SV2 --> ST2 H2 --> SV2 PM2 --> ST2 end style E1 fill:#90EE90 style U1 fill:#90EE90 style R1 fill:#90EE90 style D1 fill:#90EE90 style H1 fill:#90EE90 style S1 fill:#90EE90 style SV2 fill:#FFB6C1 style ST2 fill:#FFB6C1 ``` --- ## 六、结论 Messages模块是一个**架构完善**的模块,具备: 1. 清晰的分层架构 2. 独立的业务逻辑编排层(UseCase) 3. 完整的数据持久化(SQLite) 4. 高效的差异更新机制 5. 实时事件推送能力 Post模块当前存在以下问题: 1. **违反分层原则**:Service直接操作Store 2. **缺少UseCase层**:业务逻辑分散 3. **无数据抽象**:缺少Repository接口 4. **无差异更新**:每次全量更新导致性能问题 5. **无本地持久化**:无法离线使用 建议按照对齐建议逐步重构Post模块,使其架构与Messages模块对齐。