耦合性 V2
目前耦合性已经从“偏高”降到了 中等偏低、可控。
简单评价:
大问题已经收口,剩下的是结构继续细分的问题。
当前不会再出现明显的全局入口乱写、页面直接抢 UI Root、Network 回调污染全局这类高风险耦合。但 State、App 启动层、投资数据页面仍有进一步拆分空间。
已明显改善的部分
1. 全局 UI Root 已收口
现在 UI.SetRoot 只剩一处:
- scripts/App/RootView.lua:14
业务页面不再直接 UI.SetRoot(...),而是通过 RootView / WorkshopContext.ShowFullscreen(...) 间接切换。
这解决了之前的问题:
- 页面随意替换全局 UI 树
- 返回路径不统一
- App 层无法控制全屏页面生命周期
2. 高风险 State 写入口已收口
外部模块不再直接写:
- State.currentPage
- State.gameOver
- State.soldier
- State.modalOpen
这些写入现在集中在 scripts/Pages/纸上状态.lua 内部,通过方法间接修改,例如:
- State.SetCurrentPage
- State.ResetProgress
- State.SetSoldier
- State.SetGameOver
- State.ClearGameOver
当前状态是:
写入口已经收口,但 State 仍然是共享大状态表。
3. Pages.纸上流程 双向依赖已缓解
Pages.纸上流程.lua 已经变成纯 action dispatcher,不再直接 require 关卡、建家、背包、翻页模块。
具体处理器统一在:
- scripts/Pages/怪物工坊/init.lua:285
通过 Flow.Bind(...) 注入。
这让之前的结构:
text纸上流程 <-> 纸上关卡 纸上流程 <-> 纸上建家 纸上流程 <-> 纸上背包 纸上流程 <-> 纸上翻页
变成了:
text业务模块 -> Flow -> 入口注册的 handler
循环依赖风险显著下降。
4. 纸上谈兵存档已加用例层
新增:
- scripts/App/纸上存档用例.lua
页面层已经不再直接依赖:
luarequire("Data.纸上存档服务")
也清掉了页面层的泛用:
- Save.SaveData
- Save.LoadData
- Save.SaveProgress
这比之前页面直接知道存档 key、直接调用底层保存要好很多。
5. Network 客户端回调已去全局化
Network 里的字符串回调和全局 Handle* 基本清掉了。
现在全局 Handle* 只剩 main.lua 中的引擎入口转发:
- scripts/main.lua:25
- scripts/main.lua:31
这属于合理的入口层全局函数。


当前主要剩余耦合
P1. Pages.纸上状态 仍然是最大耦合点
虽然写入口已经收口,但 State 仍然承担太多领域:
- 战斗状态
- 关卡状态
- 背包状态
- 安全屋状态
- 绘制状态
- UI modal 状态
- 财务能力状态
- 公开安全屋挑战状态
所以现在的问题不是“乱写”,而是:
很多模块仍然共同读取同一个大状态对象。
这是当前最大的剩余耦合源。
建议后续拆成:
textPaperCombatState PaperProgressState PaperInventoryState PaperHomeState PaperUiState
或者先不拆文件,只先按 API 分区,减少直接读字段。


P1. App 层仍偏重
main.lua 已经很轻,但职责转移到了:
- scripts/App/客户端启动.lua
- scripts/App/Update调度.lua
它们仍然承担:
- UI 初始化
- 主题设置
- UI 音效 patch
- 全局事件订阅
- 登录流程绑定
- 页面注册
- 纸上谈兵插件绑定
- Update 分发
- Store 同步
- UserDataProxy 超时检查
这类文件属于 composition root,耦合高一点可以接受,但当前已经接近需要再拆的程度。
建议后续拆成:
textApp.UiBootstrap App.EventBootstrap App.PluginRegistry App.UpdateLoop App.Session


P1. 投资/持仓/分析页面仍直接依赖 Data.Store
纸上谈兵存档已经收口,但投资记录系统页面仍然大量直接使用:
luaData.Store
典型模块:
- scripts/Pages/设置.lua
- scripts/Pages/记录/保存逻辑.lua
- scripts/Pages/持仓/init.lua
- scripts/Pages/分析/组合概览.lua
- scripts/Pages/分析/指数对比.lua
这部分目前是“传统 MVC 直连 Store”的结构。
短期能跑,问题不大;长期建议加:
textInvestmentUseCases HoldingsViewModel AnalysisViewModel RecordUseCases


P2. 怪物工坊内部仍是大模块协作
现在 _W、_gameOver、全局渲染回调已经清掉了,但怪物工坊内部仍有较多模块互相协作:
- init.lua
- 游戏循环.lua
- 战斗机制.lua
- 合成面板.lua
- 渲染.lua
- 纸上关卡.lua
- 纸上建家.lua
- 纸上背包.lua
这属于复杂玩法模块常见状态。当前已经比之前健康很多。
下一步如果继续拆,可以引入:
textPaperWarController PaperWarScene PaperWarCombatUseCases PaperWarHomeUseCases
把 CursorService.SetStyle(...)、WorkshopContext.Show(...)、State.SetBattleActive(...) 这类场景副作用再集中一些。


当前耦合等级判断
| 维度 | 当前情况 | 评价 |
| 全局 UI Root | 已完全收口 | 良好 |
| 全局函数污染 | 基本清理,只剩入口层 | 良好 |
| Network 事件回调 | 已局部化 | 良好 |
| 页面直连 Network | 已基本消除 | 良好 |
| 纸上存档底层依赖 | 已加 App 用例层 | 良好 |
| State 共享状态 | 仍偏大 | 中等风险 |
| App 启动层 | 职责偏多 | 中等风险 |
| 投资系统 Store 直连 | 仍较多 | 中等风险 |
| 怪物工坊玩法模块 | 复杂但可控 | 中等 |
结论
现在项目耦合性可以评价为:
从“高耦合、全局入口多、页面可直接抢控制权”下降到了“中等偏低耦合、关键边界已收口、剩余主要是模块继续细分问题”。
如果继续治理,优先级建议是:
- 拆 Pages.纸上状态 的领域状态。
- 拆 App/客户端启动.lua 和 App/Update调度.lua。
- 给投资/持仓/记录系统加 UseCase / ViewModel。
- 给纸上谈兵加 PaperWarScene,收口光标、overlay、battleActive 等场景副作用。

