Files
FlowScope/docs/requirements/p0-data-r3.md
2026-05-15 15:38:40 +08:00

89 lines
2.7 KiB
Markdown

# P0-4: R3 + Data 类规范需求详细文档
## 对齐说明
本文档以 `docs/requirements/p0-requirements-set.md` 为准。P0 使用 R3 作为响应式基础,不自研响应式系统,不做 UI 自动绑定。
## 目标
建立游戏运行时 Data 的组织方式、响应式状态表达、ViewModel 访问规则和存档序列化约定。
## Data 类规范
```csharp
public sealed class PlayerData
{
public ReactiveProperty<int> Gold { get; } = new(0);
public ReactiveProperty<int> Level { get; } = new(1);
}
```
规则:
- 一个 Data 类对应一个业务域。
- Data 类注册在全局 Container 中。
- Data 类保持纯 C#,不依赖 Unity API。
- Data 类不持有 View 或 ViewModel 引用。
- Data 类不包含复杂业务流程逻辑。
- Data 类之间不互相直接引用。
- Data 类使用 `ReactiveProperty<T>``ReactiveCollection<T>` 表达可观察状态。
## ViewModel 规则
- ViewModel 可以引用 Data。
- ViewModel 负责 UI 表现逻辑和用户操作逻辑。
- ViewModel 不持有 MonoBehaviour 或具体 View 引用。
- ViewModel 订阅必须加入自己的 `CompositeDisposable`,或加入 `FeatureContext.Disposables`
## 序列化规则
- `ReactiveProperty<T>` 序列化为 `.Value`
- `ReactiveCollection<T>` 序列化为 JSON 数组。
- 反序列化到已有 Data 实例时,更新 `.Value` 或集合内容,不替换 Data 实例。
- 反序列化类型不匹配时抛异常并包含字段名。
## 事件流规则
P0 允许使用 R3 `Subject<T>` 做 Feature 内或明确归属的轻量事件流。
规则:
- Subject 生命周期必须有明确所有者。
- Feature 内 Subject 随 Feature Dispose 释放。
- 跨 Feature 持久状态优先使用 Data。
- 不建立全局 Subject 池。
- 不实现独立 EventBus。
## 暂不做
- 自研响应式系统。
- UI 自动绑定框架。
- 全局 EventBus。
- Data 类 Inspector 可视化。
- 订阅泄漏 Analyzer。
- Data 类之间的复杂关系建模。
## 验收标准
| # | 标准 | 通过条件 |
|---|------|---------|
| 1 | Data 创建 | Data 类用 ReactiveProperty 定义字段 |
| 2 | 全局共享 | 两个 ViewModel Resolve 到同一个 Data 实例 |
| 3 | 响应式同步 | 修改 Data 后订阅者收到通知 |
| 4 | ViewModel 隔离 | ViewModel 不引用 MonoBehaviour 或具体 View |
| 5 | 序列化 ReactiveProperty | JSON 只包含值,不包含内部状态 |
| 6 | 反序列化已有实例 | 已注册 Data 实例被更新而不是替换 |
| 7 | ReactiveCollection | 可序列化为数组并恢复 |
| 8 | 订阅释放 | Dispose 后订阅不再触发 |
| 9 | 纯 C# | Data 类可脱离 Unity 编译 |
## 依赖关系
```text
Data / ViewModel
├── R3
├── Container
├── ISaveService
└── JSON Converter
```