🌀 纠缠原理
在严格的因果拓扑中,空间上的循环依赖是绝对的禁忌。然而,真实的业务场景(如多维单位换算、UI 物理排版、复杂表单联动)往往充满了互相拉扯的双向制约。
MeshFlow 引擎本身并不能像魔法一样直接“消灭”死循环,而是倡导用一套全新的心智模型去化解它:张开“逻辑力场 (Logic Force Field)”。
如果说 SetRule 建立的是从高到低的单向引力导轨,那么 useEntangle 的本质就是将互相牵制的节点丢进一个力场,让它们在时间轴上震荡,并最终停留在势能最低的全局平衡点。
1. 降维打击:空间循环与时间线性 (Temporal Prophecy)
解决痛点:如何在物理上避免死循环,并在逻辑上维持双向绑定?
实现逻辑: 纠缠,在拓扑空间上看似是一个首尾相连的死循环,但在系统的时间轴上,它其实是一条不断向前延伸的线性演化轨迹。
- 对未来发出预言:在力场中,节点 A 发生变化时,它不能直接越权去“篡改”节点 B(严禁直接调用赋值)。相反,A 只能通过提案向引擎发射一个关于 “B 在未来应该处于什么状态” 的预言。
- 预言重塑现在:B 也同样会对 A 发出预言。引擎会收集整个网格内所有纵横交错的预言,并根据开发者的配置进行总结与合并,自然而然地让“现在的拓扑网格”蜕变为“预言中的未来”。
2. 告别 LWW:无冲突演化与增量操作 (CRDT Philosophy)
解决痛点:当 A 预言 B 变成 10,B 预言 A 变成 15 时,必然发生冲突。如果只是简单覆盖,如何保证数据不丢失?
在传统的双向绑定中,通常遵循粗暴的“最后写入者胜 (Last-Write-Wins, LWW)”,但这会直接导致中间态被抹杀。
实现逻辑: 为了达成完美的全局平衡,对于预言的提交大有讲究。MeshFlow 在纠缠中融入了 CRDT(无冲突复制数据结构) 的思想:
- 操作符与增量 ($\Delta$):预言不必是绝对值。节点可以发射基于相对增量、集合求交、或是自定义操作符的预言。
- 代数融合:当预言发生交汇时,引擎不是让它们互相覆盖,而是进行逻辑和数学上的矢量叠加。A 和 B 的互相作用不再是互相伤害的零和博弈,而是各种作用力在网格中的和谐融合。
3. 势能坍缩:局部震荡达成全局平衡 (Global Equilibrium)
解决痛点:如何解开类似“数独”或“排版碰撞”这种牵一发而动全身的网状约束?
实现逻辑:useEntangle 赋予了节点在逻辑时间轴上进行“状态拔河”的权利。
- 每一次预言的发射与吸收,都会在力场中引发一次局部的状态震荡。
- 这些局部的波纹会向周围的关联节点扩散,引发链式反应。系统会自动推演这场震荡,合力牵引着所有的节点不断试探,直至所有拉扯力相互抵消,力场最终会稳稳地停留在势能最低的“平衡态”。此时,全局坍缩完成。
4. 阻尼衰减与熔断保护 (Damping & Circuit Breaker)
解决痛点:既然允许互相预言,系统如何确保震荡一定会停止,避免陷入永动机般的无限死循环?
实现逻辑: 没有能量损耗的系统是不存在的,MeshFlow 用两条铁律守护主线程的安全:
- 物理阻尼 (Damping):开发者在编写纠缠的
emit预言时,可以引入阻尼(如衰减系数、位置换算损耗、或极小值抹零)。只要力场中存在能量损耗,不管循环纠缠多么复杂,系统的总拓扑动能必然会在震荡中流失,并最终归零停止。 - 绝对熔断 (Circuit Breaker):作为兜底方案,引擎在底层设置了严格的“最大推演步数”。一旦检测到无阻尼的恶意死循环(震荡久久无法触底),引擎会在达到熔断阈值时强制停机,切断演化链,彻底杜绝内存溢出。
💡 核心对比
| 维度 | SetRule | useEntangle |
|---|---|---|
| 拓扑形态 | 空间上的单向有向无环图 (DAG) | 空间成环、时间线性的震荡演化网 |
| 核心动作 | 基于当前输入,直接计算下游输出 | 向目标发射未来预言 (Proposal) |
| 冲突处理 | 绝对层级覆盖(下游无条件服从上游水流) | 预言融合、增量叠加 (CRDT 思想) |
| 底层隐喻 | 精密咬合的单向齿轮传动 | 弹簧互相拉扯直至势能耗尽的力场 |
| 最佳实践 | 确定性的数据流派发、异步竞态控制 | 消除 UI 碰撞、多维单位双向对齐、约束求解 |
TIP
永远不要在 useEntangle 的闭包内直接覆写状态。请把期望的变化作为预言 return 出来,给系统赋予合适的阻尼,然后信任引擎——它会让局部的混乱在震荡中自发趋向完美的全局平衡。