FP:在没有实际状态变化的情况下反映状态
FP: Reflecting state in absence of actual state change?
我对一些高级函数式编程思想不熟悉,特别是:如何处理不可变数据。数据结构通常是复合的,由更小的数据结构组成。例如,如果我们有一个家庭集合,它由一个家庭的所有成员组成。我们可以构造这个家族:
var flintstones = new Family().
add(new Member({name: 'Fred'})). //returns new instance of family
add(new Member({name: 'Wilma'}). // "
add(new Member({name: 'Pebbles'})); // "
var fred = flintstones.get({name: 'Fred'}).set({lname: 'Flintstone'});
flintstones = fred.family(); //new instance of family with latest fred.
注意改变fred
实际上并没有改变flintstones
。我可以抓取一个新的参考flintstones
,但为了什么目的?因为所有对象都只是快照,所以我看不到保留引用的意义。状态变化已经被抽象掉了,所以我们不打算使用观察者模式。因此,像gui这样的依赖于状态变化的东西是如何处理的呢?为了保持同步,除了观察之外,还有什么功能上的替代方法?我不认为物体本身有任何渲染它们自己的业务。函数式程序如何处理保持单页web应用GUI同步的状态?
在您的示例中,Family
应该是不可变的。因此,每次调用add
都必须返回一个全新的对象,该对象基于现有对象的内容(它们本身是不可变的,因此复制它们不是问题)加上新对象。同样,你在Fred
上调用的set
必须返回一个基于Fred但具有不同姓氏的全新家庭成员。(因此,Flintstones
内部的原始Fred根本没有改变。)
这种函数式风格的优点是,一旦你得到了一个对象的引用,你就知道它不会改变。如果它在构造时是有效的,那么就不必一直检查它是否仍然有效。因此,您可以将对象从代码中传递出去,而不必先克隆它,以保护内部副本不被更改。
如果你想学习更多关于函数式编程的知识,你最好尝试一下纯粹的函数式语言,比如Haskell或f#;尝试在JavaScript中进行函数式编程很可能会令人困惑。
相关文章:
- React redux初始化功能,无论状态变化如何
- 检测Ionic中特定的应用程序状态变化
- ReactJS-这个状态中的数组在删除时被正确更新,但结果是't,直到以后的状态发生变化
- 消除淘汰中引导程序开关状态变化的歧义
- 反应组件交互和全局状态变化
- 根据单选按钮的状态变化使儿童内容出现/消失
- 观察angular ui路由器的状态变化
- 如何与Redux沟通React组件之间的UI状态变化
- html5事件监听器详细节点状态变化
- 角度/离子谷歌地图的状态变化
- ReactJS -检测状态变化的问题
- 处理ReactJs中的状态变化
- 按钮循环3个状态变化
- 每次状态变化时的离子运行函数
- FP:在没有实际状态变化的情况下反映状态
- ReactJS:如何测试状态变化
- 发生状态变化时不应用ng类
- 动态jQuery CSS具有三状态滚动背景位置根据状态变化
- 承诺后的角度状态变化
- 是否有管理事件的“量子状态变化”的有用模式?(特别是在JavaScript中)