关于 composable-architecture
The Composable Architecture (TCA) 是面向复杂、可测试功能开发者的架构参考技能,聚焦可组合 reducer、集中状态管理、副作用处理与测试模式。
主要功能
- 01可组合的 reducer 结构
- 02集中管理状态与依赖
- 03副作用处理与取消
- 04导航与呈现模式
- 05TestStore 测试指南
适用场景
- 01组织复杂的应用功能
- 02管理异步副作用与取消
- 03组合导航与界面呈现
- 04测试状态变化与依赖
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ johnrogers/ claude-swift-engineering --skill composable-architecture安装后在 Claude Code 中输入/composable-architecture确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/dependencies.mdeffects.mdnavigation-advanced.mdnavigation-basics.mdperformance.mdpresentation.mdreducer-structure.mdshared-state.mdtesting-advanced.mdtesting-fundamentals.mdtesting-patterns.mdtesting-utilities.mdviews-binding.mdviews-composition.md详细介绍
The Composable Architecture(TCA)
TCA 通过可组合的 reducer、集中式状态管理和副作用处理,为构建复杂且可测试的功能提供架构。其核心原则是:状态演进可预测,依赖关系清晰,副作用可测试。
参考资料加载指南
只要有哪怕一丝可能需要用到相关内容,就务必加载参考文件。 有上下文总比错过模式或犯错更好。
| 参考资料 | 加载时机 |
|---|---|
| Reducer 结构 | 创建新 reducer、设置 @Reducer、State、Action 或 @ViewAction 时 |
| 视图 - 绑定 | 使用 @Bindable、双向绑定、store.send() 或 .onAppear/.task 时 |
| 视图 - 组合 | 使用带有 store 的 ForEach、作用域限定到子功能,或使用可选子功能时 |
| 导航 - 基础 | 设置 NavigationStack、路径 reducer、推入/弹出页面,或以编程方式关闭页面时 |
| 导航 - 高级 | 深度链接、递归导航,或将 NavigationStack 与弹出页结合使用时 |
| 共享状态 | 使用 @Shared、.appStorage、.withLock,或在功能之间共享状态时 |
| 依赖项 | 创建 @DependencyClient、使用 @Dependency,或设置测试依赖项时 |
| 副作用 | 使用 .run、.send、.merge、定时器、副作用取消或异步工作时 |
| 呈现 | 使用 @Presents、AlertState、弹出页、弹出窗口或 Destination 模式时 |
| 测试 - 基础 | 设置测试套件、makeStore 辅助工具,或了解 Equatable 要求时 |
| 测试 - 模式 | 测试操作、状态变更、依赖项、错误或呈现时 |
| 测试 - 高级 | 使用 TestClock、keypath 匹配、exhaustivity = .off 或基于时间的测试时 |
| 测试 - 实用工具 | 使用测试数据工厂、LockIsolated、ConfirmationDialogState 测试或 @Shared 测试时 |
| 性能 | 优化状态更新、高频操作、内存或 store 作用域时 |
常见错误
-
过度拆分功能 — 将功能拆成过多小型 reducer 会增加状态管理难度和组合开销。除非确实需要复用,否则应将相关状态和操作放在一起。
-
错误管理副作用的生命周期 — 状态变化时忘记取消副作用,会导致数据过时、重复请求或竞态条件。按顺序执行副作用时使用
.concatenate,并在适当时使用.cancel。 -
导航状态放错位置 — 将导航状态放在子 reducer 而非父 reducer 中,会导致不必要的视图重新加载和状态不一致。导航状态应属于拥有导航结构的功能。
-
测试时不检查 TestStore 的穷尽性 — 跳过对“简单”副作用或“显而易见”状态变化的 TestStore 断言,就会漏掉错误。务必使用穷尽性检查;它能及早发现回归问题。
-
错误混用 async/await 和 Effects — 未妥善处理取消或错误,就将 async/await 转换为
.run副作用,会丢失隔离保证。应在.run中使用yield语句谨慎封装异步操作。
评论
支持 Markdown