耦合性 V2

07/092 浏览
目前耦合性已经从“偏高”降到了 中等偏低、可控
简单评价:
大问题已经收口,剩下的是结构继续细分的问题。
当前不会再出现明显的全局入口乱写、页面直接抢 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
页面层已经不再直接依赖:
lua
require("Data.纸上存档服务")
也清掉了页面层的泛用:
  • Save.SaveData
  • Save.LoadData
  • Save.SaveProgress
这比之前页面直接知道存档 key、直接调用底层保存要好很多。

5. Network 客户端回调已去全局化

Network 里的字符串回调和全局 Handle* 基本清掉了。
现在全局 Handle* 只剩 main.lua 中的引擎入口转发:
  • scripts/main.lua:25
  • scripts/main.lua:31
这属于合理的入口层全局函数。
horizontal linehorizontal line

当前主要剩余耦合

P1. Pages.纸上状态 仍然是最大耦合点

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

P1. App 层仍偏重

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

P1. 投资/持仓/分析页面仍直接依赖 Data.Store

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

P2. 怪物工坊内部仍是大模块协作

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

当前耦合等级判断

维度当前情况评价
全局 UI Root已完全收口良好
全局函数污染基本清理,只剩入口层良好
Network 事件回调已局部化良好
页面直连 Network已基本消除良好
纸上存档底层依赖已加 App 用例层良好
State 共享状态仍偏大中等风险
App 启动层职责偏多中等风险
投资系统 Store 直连仍较多中等风险
怪物工坊玩法模块复杂但可控中等

结论

现在项目耦合性可以评价为:
从“高耦合、全局入口多、页面可直接抢控制权”下降到了“中等偏低耦合、关键边界已收口、剩余主要是模块继续细分问题”。
如果继续治理,优先级建议是:
  1. Pages.纸上状态 的领域状态。
  2. App/客户端启动.luaApp/Update调度.lua
  3. 给投资/持仓/记录系统加 UseCase / ViewModel。
  4. 给纸上谈兵加 PaperWarScene,收口光标、overlay、battleActive 等场景副作用。
4