tl; dr
在每个帧上调用函数onEnterFrame
的程序中,如何存储和改变状态?例如,如果您正在制作关卡编辑器或绘画程序,其中跟踪状态并进行小的增量更改是诱人/诱人/邀请。用最小的全局状态突变处理这种事情的最有效方法是什么?
长版本:
在接受用户输入的交互式程序中,如鼠标点击和击键,我们可能需要跟踪数据模型的状态。例如:
我们还有时需要对大型模型进行小的更改:
阅读Frisby教授迄今为止最充足的指南,有许多功能解决方案可以处理从某些输入源提取数据的问题,对该数据执行计算并将结果传递给某些输出。
有时,应用程序允许用户进行交互并对数据执行一系列突变。例如,如果一个程序允许用户在画布上绘制(如Paint
)并且我们需要存储绘画的状态以及导致该状态的动作(用于撤消和记录/调试目的) )?
什么state
可以存储,我们应该绝对避免什么?
目前我的结论是我们永远不应该存储我们只需要暂时需要的状态,我们应该将它直接传递给需要它的函数。
但是如果有几个函数需要特定的计算呢?就像我们检查鼠标光标是否悬停在特定区域上的情况一样,为什么我们要重新计算?
有没有办法进一步减少全球状态的突变?
答案 0 :(得分:1)
存储状态不是问题所在。正在改变全球状态就是问题所在。有处理这个的解决方案。我想到的是State Monad。但是,我不确定这是撤消操作的理想选择。但这是一个开始的地方。
如果您只想将问题看作初始状态和一组操作,那么您可以将操作视为可以遍历的List
(头部是最新操作)。撤消一组n
操作可以通过遍历列表的第一个n
元素和cons
- 将这些操作的反转遍历到列表中来完成。
这样你根本不会修改全局状态。