核心概念
双世界理论为复杂系统提供了一种不同于传统面向对象的建模方式。它的核心主张是:把系统理解为一个在时间中持续演化的过程,而不是一组在空间中被组织起来的对象。
面向因果
面向因果指的是在建模时,以事件、事实、因果与裁决过程作为系统组织的最小基础。
这与面向对象形成对照:
| 面向对象 | 面向因果 |
|---|---|
| 以对象、类、方法为最小单元 | 以事件、事实、因果、裁决为最小单元 |
| 自底向上:先划分对象,再处理时间 | 自顶向下:先定义事实如何形成,再派生表现 |
| 状态分散在对象私有空间中 | 状态集中在因果层,感知层只持有投影 |
面向因果尤其适用于那些需要长期运行、持续交互、不断吸收变化的系统,例如操作系统、3A 游戏、交易系统、在线协作工具。
两层模型
双世界理论把系统拆分为两个相互协作的层次:
因果层
因果层是世界事实的权威来源。它负责:
- 接收语义事件
- 根据当前世界做出裁决
- 产出新的事实
- 维护可解释的历史
它面对的是 order_submitted、payment_confirmed、attack_requested 这样的业务语义,而不是按钮、鼠标、页面控件这些外观。
因果层的核心机制是 ,也称为解释函数或裁决机制。它回答的问题是:新事件如何被纳入已有世界,并转化为新的事实结构。
其中:
- 是系统在时刻 的世界状态,由事实与因果结构共同构成
- 是进入系统的新变化
- 是时刻 的解释规则
感知层
感知层是世界事实的响应式投影。它负责:
- 消费事实并形成投影
- 检测外部变化
- 把外部变化整理成语义事件送回因果层
- 组织连续表现、局部反馈和用户体验
感知层可以有自己的局部状态,例如页面展开、动画进度、通知是否已读、摄像机补间,但这些状态本身不构成世界事实。
两层的关系
外部输入 → 感知层检测 → 翻译成语义事件 → 因果层裁决 → 产生新事实 → 感知层消费事实 → 呈现给外部
感知层不直接改写世界事实,只能通过语义事件请求因果层裁决;因果层不直接处理表现,只发布事实供感知层订阅。
最终因果一致性
任何需要形成稳定世界的过程,都不能允许事实长期悬而不决。
因果层一旦做出裁决,系统就在有限时间内收敛到该裁决所确定的事实版本。这就是最终因果一致性。它强调:
- 呈现可以滞后
- 感知可以插值
- 局部可以暂时不一致
但在有限时间内,所有参与者最终必须面对同一个事实版本。
判断该放哪一层
最实用的判断方式只有一个问题:
这件事一旦变化,会不会影响以后的世界事实?
如果会,它就属于因果层;如果不会,它就留在感知层。
| 范围 | 感知层可自治 | 必须进入因果层 |
|---|---|---|
| 视觉表现 | 动画、粒子、镜头、UI 过渡 | — |
| 局部反馈 | Hover、按下反馈、拖拽预览 | 确认、释放、真正生效时 |
| 连续物理 | 局部碰撞反馈、轨迹插值 | 命中、落地、进入区域 |
| 空间感知 | 检测候选碰撞、候选目标 | 命中确认、目标切换确认 |
| 行为决策 | — | 攻击、技能、受击、死亡、切状态 |
Headless 与 AI 友好
整个项目应该围绕因果层构建一个最小逻辑视图。通过 Headless 模式运行项目,可以天然地对 AI 和自动化测试友好:
- 因果层可以在没有渲染、没有 UI 的情况下独立运行
- 测试可以直接向因果层输入事件,验证事实输出
- AI 代理可以通过语义事件与世界交互,而不需要模拟鼠标键盘
与其他概念的关系
- 因果层不等同于 Event Sourcing:Event Sourcing 的前提是事件已经是事实,但因果层的任务是把无序、冲突、不可直接信任的外部变化解释为可追溯的事实。
- 感知层不等同于 MVC 的 View:View 通常是被动的,而感知层还负责检测输入、切割事件、组织连续反馈,在不影响世界事实的情况下可以连续自治。
- 最终因果一致性不是瞬时强一致:它允许滞后和局部不一致,但要求最终收敛到单一可叙述的事实版本,类似于分布式中的最终一致性。