如何使用函数式编程“追踪”用户活动?

20 浏览
0 Comments

如何使用函数式编程“追踪”用户活动?

tl;dr

每帧调用一个名为onEnterFrame的函数的程序,在这种情况下,如何存储和改变状态?例如,如果您正在制作一个层级编辑器或绘图程序,其中跟踪状态并进行小的增量更改非常有吸引力。使用最小的全局状态变化处理这种情况的最高效的方式是什么?

长版本:

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

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

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

  • 在层级编辑器中,我们可能需要向现有大量prefab中添加一个墙。您不希望重新创建该集合,对吧?

阅读Frisby教授的“大多数合适的指南”,到目前为止,有许多解决从某个输入源中提取数据片段、在该数据上执行计算并将结果传递给某个输出的问题的功能性解决方案。

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

存储哪些state是可接受的,而我们绝对要避免哪些呢?我目前的结论是,我们绝不能存储我们仅需要临时使用的状态,而应该直接将其传递给需要它的函数。

但如果有多个函数需要进行特定的计算怎么办?比如检查鼠标光标是否悬停在特定区域,为什么要重新计算?

有没有进一步最小化全局状态突变的方法?

admin 更改状态以发布 2023年5月21日
0
0 Comments

存储状态不是问题,问题在于改变全局状态。有解决方案来处理这个问题。其中一个是状态单子。但我不确定这是否适用于撤销操作。但这是一个起点。

如果你只是想将问题看作一个初始状态和一组操作,那么可以将操作看作一个可以被遍历的List(其中头部是最新的操作)。撤销一组n个操作可以通过遍历列表的前n个元素并将这些操作的相反值cons到列表中来实现。

这样你就不会修改全局状态了。

0