forked from 77media/video-flow
4.6 KiB
4.6 KiB
🎯 各层职责与内容
1. Component (UI层)
职责:纯展示逻辑,用户交互处理 内容:
- React组件(Modal、Form、Button等)
- 样式和布局逻辑
- 用户交互事件绑定
- 通过props接收数据和回调函数
设计原则:
- 不包含业务逻辑
- 不直接操作状态
- 通过回调函数与上层通信
- 可复用和可测试
2. Hook (状态管理层)
职责:状态管理、副作用处理、业务逻辑组合 内容:
- 状态管理Hook(useState、useReducer等)
- 副作用处理(useEffect、useCallback等)
- 业务逻辑组合(调用多个UseCase)
- 提供统一的数据接口给组件
设计原则:
- 协调全局状态和本地状态
- 处理异步操作和副作用
- 组合多个UseCase的调用
- 提供响应式的数据接口
3. UseCase (业务逻辑层)
职责:核心业务规则、业务流程编排、领域逻辑验证 内容:
- 业务用例类(ImageStoryUseCase、ScriptGenerationUseCase等)
- 完整的业务流程方法
- 业务规则验证逻辑
- 业务实体构建和管理
设计原则:
- 包含完整的业务流程
- 执行业务规则验证
- 协调多个Service的调用
- 返回领域实体,而不是原始数据
- 无状态,方法调用间不依赖实例状态
4. Service (外部服务层)
职责:外部服务集成、技术实现细节、基础设施 内容:
- 外部API调用服务(ImageProcessingService、AIAnalysisService等)
- 技术实现细节(图片处理、网络请求等)
- 错误处理和重试逻辑
- 可以被多个UseCase复用的服务
设计原则:
- 专注于技术实现细节
- 处理外部API调用
- 提供统一的错误处理
- 实现接口隔离原则
5. Repository (数据访问层)
职责:数据持久化、数据查询、数据转换 内容:
- 数据访问类(ImageStoryRepository、CharacterRepository等)
- 数据持久化逻辑
- 数据查询和过滤
- 数据转换(Entity ↔ Data)
设计原则:
- 封装数据访问细节
- 提供统一的CRUD接口
- 处理数据转换
- 实现数据访问的抽象
📊 状态管理策略
状态分类与存储位置:
- 业务核心状态 → Zustand Store(currentStory、storyList等)
- UI交互状态 → 组件useState(isModalOpen、localInput等)
- 业务流程状态 → UseCase私有状态(analysisProgress等)
- 用户偏好状态 → Zustand Store(selectedCategory、theme等)
- 临时计算状态 → useMemo/useCallback(filteredStories等)
数据流向
状态流转过程: 用户操作 → 组件本地状态 → Hook协调 → UseCase业务逻辑 → 全局状态更新 → 组件重新渲染 具体流程:
- 用户在组件中触发操作
- 组件更新本地状态
- Hook协调多个UseCase调用
- UseCase执行业务逻辑和规则验证
- 更新全局状态
- 组件重新渲染显示结果
设计模式应用
核心模式:
- 依赖注入:UseCase通过构造函数注入Service依赖
- 工厂模式:创建UseCase实例,管理依赖关系
- 策略模式:可插拔的业务策略(如不同的AI分析策略)
- 观察者模式:状态变化通知,组件响应式更新
🧪 测试策略
分层测试:
- Component层:组件渲染和交互测试
- Hook层:状态管理和副作用测试
- UseCase层:业务逻辑和规则验证测试
- Service层:外部服务集成测试
- Repository层:数据访问逻辑测试
错误处理机制
错误分类:
- 领域错误:业务规则验证失败(StoryValidationError)
- 基础设施错误:外部服务调用失败(ImageUploadError)
- 应用错误:应用逻辑错误(UseCaseError)
错误处理流程:
- Service层捕获原始错误并转换为应用错误
- UseCase层抛出领域错误
- Hook层统一捕获和处理错误
- 组件层显示错误信息
性能优化策略
状态优化:
- 使用useMemo优化计算属性
- 使用useCallback优化函数引用
- 合理使用React.memo包装组件
业务逻辑优化:
- UseCase方法设计为无状态,避免实例状态维护
- Service层实现缓存和重试机制
- Repository层实现数据分页和懒加载
📋 开发检查清单
新增功能时:
- 是否在正确的层次添加代码?
- 是否遵循单一职责原则?
- 是否定义了清晰的接口?
- 是否处理了错误情况?
- 是否添加了相应的测试?
重构代码时:
- 是否保持了接口的向后兼容?
- 是否更新了相关的测试?
- 是否验证了功能完整性?