基于Scala的电子表格开发与Scala概念解析
1. 电子表格单元格值自动更新问题
在电子表格中,当单元格的值发生改变时,依赖该单元格的其他单元格的值应自动重新计算并显示。例如,若将图中单元格C1的值从20改为100,单元格C5的总和不会自动更新为166,需要手动点击C5才能看到其值的变化。因此,需要一种机制让单元格在值改变后自动重新计算。
2. 变更传播机制
- 简单方法 :每次单元格值改变后,重新计算电子表格中每个单元格的值。但随着电子表格规模增大,这种方法的扩展性不佳。
- 优化方法 :仅重新计算公式中引用了发生变更的单元格的那些单元格的值。采用基于事件的发布/订阅框架实现变更传播,具体流程如下:
- 当一个单元格被赋予公式时,它会订阅公式所引用的单元格的所有值变更通知。
- 若这些被引用单元格中的某个值发生改变,会触发订阅单元格的重新评估。
- 若重新评估导致订阅单元格的值发生改变,它会依次通知依赖它的所有单元格。
- 这个过程会持续进行,直到所有单元格的值稳定,即所有单元格的值不再发生变化。
graph TD;
A[单元格值改变] --> B[触发引用该单元格的订阅者重新评估];
B --> C{重新评估后值是否改变};
C -- 是 --> D[通知依赖该单元格的其他单元格];
D --