问题

用户调一下”零线”,后面会牵一发动全身:受影响的文件得重算厚度不足段、层位段平均深度、病害深度,层位识别和病害标注那边的雷达图、列表也都得跟着刷新。

要是让零线模块直接去调各模块的刷新方法,耦合就焊死了——零线模块得记着谁要刷新、调谁的哪个方法,以后多加个模块还得回来改零线的代码。

事件总线

加一个轻量的事件总线,零线模块只管”发事件”,谁在意谁自己”订阅”:

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

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

好处其实就是几件事搅一块儿:发布方和订阅方互相不认识,以后加模块订阅一下就行,零线代码不用动;重算(耗时)和刷新(UI)各跑各的协程,互不卡;零线模块只操心”算零线 + 广播”这一摊,下游各管各的。

配合增量计算

事件里带上 affectedFileIds(这次影响到了哪些文件),下游别傻乎乎全量重算,就重算这个范围内的,省下一大截没必要的计算量。

总之这种”一处改动、多处联动”的场景——台账变更、参数变更都算——用事件总线比硬调方法舒服太多:发布方省心,订阅方各过各的,扩展的时候只加订阅、不用回去改发布。