如何通过函数式编程“跟踪”用户活动?

时间:2017-04-18 09:25:24

标签: functional-programming

tl; dr

在每个帧上调用函数onEnterFrame的程序中,如何存储和改变状态?例如,如果您正在制作关卡编辑器或绘画程序,其中跟踪状态并进行小的增量更改是诱人/诱人/邀请。用最小的全局状态突变处理这种事情的最有效方法是什么?

长版本:

在接受用户输入的交互式程序中,如鼠标点击和击键,我们可能需要跟踪数据模型的状态。例如:

  • 是否选择了某些元素?
  • 鼠标光标悬停在一个元素上,哪一个?
  • 按住鼠标按钮多长时间?这是点击还是拖动?

我们还有时需要对大型模型进行小的更改:

  • 在关卡编辑器中,我们可能需要在现有的大型预制件上添加一个墙。您不想重新创建该集,不是吗?

阅读Frisby教授迄今为止最充足的指南,有许多功能解决方案可以处理从某些输入源提取数据的问题,对该数据执行计算并将结果传递给某些输出。

有时,应用程序允许用户进行交互并对数据执行一系列突变。例如,如果一个程序允许用户在画布上绘制(如Paint)并且我们需要存储绘画的状态以及导致该状态的动作(用于撤消和记录/调试目的) )?

什么state可以存储,我们应该绝对避免什么? 目前我的结论是我们永远不应该存储我们只需要暂时需要的状态,我们应该将它直接传递给需要它的函数。

但是如果有几个函数需要特定的计算呢?就像我们检查鼠标光标是否悬停在特定区域上的情况一样,为什么我们要重新计算?

有没有办法进一步减少全球状态的突变?

1 个答案:

答案 0 :(得分:1)

存储状态不是问题所在。正在改变全球状态就是问题所在。有处理这个的解决方案。我想到的是State Monad。但是,我不确定这是撤消操作的理想选择。但这是一个开始的地方。

如果您只想将问题看作初始状态和一组操作,那么您可以将操作视为可以遍历的List(头部是最新操作)。撤消一组n操作可以通过遍历列表的第一个n元素和cons - 将这些操作的反转遍历到列表中来完成。

这样你根本不会修改全局状态。