Skip to content

账本的自动落印

背景:模型注册表的自动保存靠构造参数 onChange 触发,命名模糊且与模块变量混淆,光照模块复制了一套同名机制。 过程:model-manager 构造函数 onChange→triggerAutoSave(18处);lighting.ts 模块变量改名 triggerAutoSave(~10处)并注入 saveCb 避免遮蔽;清理 model-ops 悬空导入。


序、两枚相同的印

模型注册表(model-manager.ts)每次变动,都要自动落盘存档。触发这件事的,是一个构造参数,名叫 onChange

光照模块(lighting.ts)也有自己的存档机制,模块里挂了个变量,也叫 _triggerAutoSave

两套机制,两个名字,语义重叠却各管一摊。更要命的是 lighting.ts 里的 _triggerAutoSave 和注入的 triggerAutoSave 撞名——若不分清,就会出现 triggerAutoSave = triggerAutoSave 的滑稽自赋值,把外部传入的回调就地吞掉。

王逸看着这两枚"同名不同源"的印:"它们该是同一枚。"

一、统一印文

第一刀落在 model-manager.ts:构造函数参数 onChange 改名为 triggerAutoSave,语义从模糊的"变了"变成明确的"触发自动保存"。18 处 this.onChange() 随之改为 this.triggerAutoSave()

改名不是洁癖,是消除歧义——当"变了"和"该存档了"被同一个词表达,后人不会再把任意状态变更误当成存档信号。

二、遮蔽的陷阱

lighting.ts 的修复杂一些。模块级变量 _triggerAutoSave 改名为 triggerAutoSave,约 10 处引用同步更新。但 initLighting 接受了一个同名的注入参数——若参数也叫 triggerAutoSave,函数体内 triggerAutoSave = triggerAutoSave 就成了自赋值,外部回调被自己覆盖成 undefined。

解法是把注入参数改名为 saveCb,在函数体里显式 triggerAutoSave = saveCb。名字错开,遮蔽消失,赋值的方向一目了然。

同名是代码里最隐蔽的雾。两个 triggerAutoSave 站在同一间屋子里,编译器分不清,人更分不清。

三、悬空的桥

改名引发了一处迟来的回归:model-ops.ts 仍从 core/config 导入两个早已删除的函数 setIsLoadingModel / setIsLoadingVmd

它们本该在更早的清理中消失,却像悬在半空的桥,两端都已拆毁,只有中间一段还挂着。构建时,这段桥轰然坠落——报错。

按 ADR-046 的意图,移除这处悬空导入与两处调用(死代码)。vite build 重新转绿。

死代码不会自己消失。它只是等你改名时,精准地砸在脚背上。

四、王的落印

验证通过,ADR-050 状态从「已提议」改为「已实施」。

模型变动、光照变动,现在共用一枚语义清晰的印:triggerAutoSave。存档不再依赖两个同名变量的默契。

王逸改了一个模型参数。存档自动落定,没有遗漏,没有自赋值陷阱。

聚合的秩序,常始于把两枚相似的印,熔成一枚公认的。


教训:注入参数与模块变量同名会导致遮蔽自赋值,命名须显式错开。