辩态?变态?不能往深里想
架构师莫子巡行于代码库,见两码农争辩,面红耳赤,问其故。
灵儿曰:“吾以为,MobX 之妙,在于随心所欲。对象即数据,赋值即响应。吾欲改 store 之属性,挥手即改,代码如行云流水,何其快哉!”
稳儿曰:“非也!吾以为,状态之变,当有法度。若人人皆可随处赋值,数据如脱缰之野马,Bug 如雨后之春笋。一旦出错,不知何人所为,排查之难,难于上青天!”
灵儿反唇相讥:“汝之言虽理,然项目已定,全局配置 enforceActions 锁死不可改,TypeScript 之盾亦未装配。汝欲禁吾随意修改,岂非空谈?”
稳儿默然,虽知其害,苦无良策,遂以此难莫子。
莫子笑曰:“此非无解之局也,吾有锦囊二策,可解此忧。”
莫子出第一策,曰“移花接木之术”(Proxy): “汝可设一代理(Proxy)**为门神,立于 Store 之前。凡外人欲行赋值(Set)之事,门神即刻斩之,喝曰:‘非 Action 均不可改!’;然若遇 Action 登门,则暗度陈仓,引其至真身,方可施为。如此,外严而内宽,法度自成。”
莫子出第二策,曰“深壁固垒之法”(Closure): “若求万全,可废 Class 之形,行闭包(Closure)**之实。将数据深藏于函数深宅之中,外人不可见,亦不可触。唯有借 Getter 窥其貌,借 Action 变其形。此时 Store 仅余空壳接口,无 Setter 之穴,纵有通天手段,亦无法强行赋值。”
灵儿、稳儿闻之,皆大悟,抚掌叹曰:“大神之技,深不可测,非吾等所能及也!”
【技术注解】
这篇短文将之前的技术方案进行了文学化隐喻:
- 灵儿(代表灵活派):主张 JS 的动态性和开发效率,对应 MobX 原生支持的可变性。
- 稳儿(代表规范派):主张数据流向的可预测性和维护性,担忧“随意修改”带来的混乱。
- 困局:对应你提出的限制条件——无法修改全局配置
enforceActions,且不借助 TSreadonly和私有属性。 - 莫子的第一策(移花接木):对应 Proxy 方案。
- 门神:
Proxy的set拦截器。 - 暗度陈仓:Action 内部通过
this绑定或Reflect操作原始对象,绕过拦截。
- 门神:
- 莫子的第二策(深壁固垒):对应 闭包/工厂模式方案。
- 深宅:函数作用域。
- 无 Setter 之穴:返回的对象只包含
get和方法,根本没有定义set,从物理上隔绝了修改。