问题

用户调整“零线”后,会引发一连串级联反应:受影响文件要重算厚度不足段、层位段平均深度、病害深度,层位识别和病害标注模块的雷达图和列表都要同步刷新。

如果让零线模块直接去调用各模块的刷新方法,耦合就死死的——零线模块得知道谁需要刷新、调用谁的哪个方法,以后新增模块还得回来改零线代码。

事件总线

引入一个轻量事件总线,零线模块只负责“发布事件”,谁关心谁“订阅”:

// 发布方:零线模块,不关心谁来处理
eventBus.publish(ZeroLineChangedEvent(affectedFileIds))

// 订阅方:层位识别模块,自己决定怎么响应
@Subscribe
fun onZeroLineChanged(e: ZeroLineChangedEvent) = scope.launch {
recalcLayerSegments(e.affectedFileIds)
refreshChart()
}

收益:

  • 解耦:发布方和订阅方互不认识,新增模块只要订阅事件即可,零线代码不用动。
  • 异步编排:重算(耗时)和刷新(UI)分别在不同协程里跑,互不阻塞。
  • 职责清晰:零线模块只管“算零线 + 广播”,下游各自处理自己的重算和刷新。

配合增量计算

事件里带上 affectedFileIds(受影响范围),下游不是全量重算,而是只重算这个范围内的数据,避免无谓的计算量。

小结

模块间的级联联动,事件总线比直接调用优雅得多:发布方一身轻,订阅方自治,扩展时只加订阅不改发布。台账变更、参数变更这类“一处改动、多处联动”的场景都适用这套。