功能语言中的UI模式


11

我想开始摆弄ClojureScript,但是我对某些要点感到困惑。我的问题是,当您尝试进行功能性工作时,什么是应对来自用户交互的状态更改的好方法?

让我举几个例子。我考虑过在浏览器中运行的应用程序,但是我认为这个问题更为普遍。当然,某些事情将会改变-至少是DOM。但我想了解如何组织其余代码以使用不可变数据结构。

1)说我想将一些事件附加到某些DOM对象。这在大多数情况下都不是很难做到的:在创建节点时,将其附加有各种事件处理程序的哈希映射。但是考虑使用事件委托的情况。然后,在创建新节点时,可以将事件处理程序附加到可能已经存在的某个父节点。因此,您将不得不更改与现有节点关联的哈希。

2)说我正在为输入字段设计一个自动完成模块。每次用户按下一个键,我都可以致电服务器以获取建议。这很简单。但是现在假设我想对其进行一些优化。如果我知道所有结果都匹配,foo那就没有必要再要求所有结果匹配了foobar; 我可以过滤前者。所以我需要建立某种缓存。每当用户插入一个新单词(而不是先前输入的单词的超集)时,此缓存就会更新。再说一遍:如何为缓存建模?最合理的方法似乎是将单词映射到结果的哈希映射,但是它应该是可变的。

您能否提出一些模式,以使其更容易将由于用户交互而引起的更改合并到功能设计中?


4
查找“功能性无功编程”。
dan_waterworth 2012年

这不是完全一样的事情,但是使用(无副作用)XSLT模板来匹配用户发起的DOM事件,我们在Saxon-CE中面临着类似的问题。我喜欢看到的方式是用户触发状态更改,而不是XSLT,所以还可以。关键是要确保用于管理用户交互以及状态的后续更改的代码与其余代码非常分开。
pgfearo'3

@pgfearo您对如何组织代码有任何建议,以使用户交互与其余交互保持足够的分离?
安德里亚(Andrea)2012年

当您进行功能性工作时,没有一种处理状态变化的好方法,因为功能性编程是无状态的。
Old Pro

3
@Old Pro:这并不完全正确。在函数式编程中,您是使用函数应用程序而不是副作用来定义计算的,但最终您必须将计算的结果保存在某处。FP的重点是将状态的使用限制到最小,而在命令式编程中,逐步(通过副作用)转换状态是定义计算的基本工具。
乔治

Answers:


3

如评论中所述,您应该查找“功能性反应式编程”,还应该阅读http://prog21.dadgum.com/archives.html上的一些文章。更具体地说,您可能应该阅读“ 不要爱上您的技术 ”,“ 像刚刚学习过编程一样编写代码 ”,“ 函数式编程不起作用(以及如何做) ”,也许其他几个。

完全避免变异和副作用实际上是不可能的。即使是Haskell程序员unsafePerformIO,有时也会利用它来突破纯功能,无副作用,静态类型的范例来完成某些事情。如果您只是作为纯粹的学术活动而从事此项目,那么就继续前进,并尽可能避免变异和副作用,但是如果您试图在截止日期之前制造出可用的产品,那么没有任何模式可以拯救您。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.