Appearance
MapEngine 数据中心重构
设计 MapEngine 数据中心(DataCenter),统一管理地图状态,替代分散在多个类中的状态变量。
背景
MapEngine 是 XMapEngine 的前身。重构前,地图的比例尺(fScale / fScaleLevel)、中心坐标、图层状态散布在至少 5 个类中。修改一个状态需要同时改多个地方,极易遗漏。
问题
- 状态分散:比例尺在 CameraController、MapService、GestureHandler 中各有自己的副本
- 不一致:不同模块对比例尺的理解不同(fScale vs fScaleLevel vs height),转换逻辑四处重复
- 订阅混乱:状态变更通知通过 UnityEvent 到处广播,调用链不可追踪
方案
单一数据源(Single Source of Truth)
MapDataCenter(状态中心)
├── Scale → fScaleLevel(唯一)
├── Center → 墨卡托坐标
├── Pitch/Roll → 相机俯仰/旋转角
├── Layer → 当前图层(SD/LD/SR)
└── CameraState → 相机状态机设计原则
- 读写分离:外部只能读 DataCenter,修改通过 Command
- 观察者模式:状态变化后通知所有订阅者(有序、可追踪)
- 类型安全:fScale / fScaleLevel / height 三种表达,内部只存 fScaleLevel,外部转换通过 Tools
数据流
Gesture → Command → DataCenter.Update() → Notify Observers → UI + Camera 更新与 XMapEngine 三层架构的关系
DataCenter 重构是三层架构的前置步骤。先用 DataCenter 统一状态,再把状态管理 + 指令分发拆分到 Services 层。
教训
- 状态管理是所有架构问题的根源——先解决状态,再谈分层
- "不急着重构"是最大的坑——越晚越不敢动