我读过反应式编程的基本思想,即变量根据其源值表达式随时间变化。我甚至用表达式实现了这一点。但后来我看到了微软的反应式扩展(Rx),看到了完全不同的东西。随着时间的推移自我更新的变量在哪里?什么也看不见。只是列举事件参数的一种奇特方式。
所以我的问题是:Rx到底有多"反应性"?我们现在看到的功能是未来的前兆吗?还是微软漫不经心地抛出了一个时髦的词?还是我完全没有抓住要点(在这种情况下,我希望你解释一下)?
编辑:我已经通过对Rx的描述得到了一些很好的答案,此外这个问题已经结束了(但我仍然希望听到更多关于的消息
- Rx在什么意义上是"反应性的"?我认为自我更新变量是这个想法的核心,但Rx并没有提供这些。LINQ to Events似乎是Rx的一个更好的名称。我开始认为,也许微软在将其应用于Rx时滥用了"反应性"一词
- 当前Rx功能可能以何种方式成为自更新变量的前兆?我已经实现了这样的功能,但没有注意到Rx对此有任何用处
"Reactive"可能更像是一个流行词,尽管它确实很好地与另一种称为"Functional Reactive Programming"的语言概念相结合。。。
无论如何,Rx"是什么"已经得到了比我聪明得多的人的回答,但我会试一试:
-
一开始,有些事情;这些东西有形状,被称为POCOs
-
这些POCO的集合形成,因此它们被命名为
IEnumerable<T>
-
人们呻吟着哀叹道:"但事件又是怎样的呢?它们不太适合收集和分组!我们必须创建奇怪和陌生的呼叫和响应处理程序来应对它们!"
-
就在那时,TheErik、TheBart和其他人看着这些奇怪的事件,心想:"嘿,我们可以让他们表现得像POCO,因为他们只是
IEnumerable<T>
的镜像!" -
这是
IObservable<T>
的诞生,是IEnumerable<T>
(对于流"推送"信息给观察者,而不是观察者"拉出"项目)的对偶 -
然后我厌倦了用"创世纪模式"写作,那些真正聪明的人把形成
LINQ
的一元查询逻辑与ISchedulers
的"时间旅行"能力捆绑在一起,称之为"Rx"
天哪!可以我认为这里的主要问题是词汇。Rx通常被描述为Linq到"事件"或类似的东西,并用一个称为IObservable的东西来实现。
我相信每个刚开始学习Rx的人都会陷入同样的陷阱。当我们看到单词"event"时,我们会想到关键字event/event handler等。然而,在Rx的上下文中,事件比这更通用。它是异步发生的任何事情,很可能发生在另一个线程上。当然,一种类型的事件是.net事件,使用Observable.FromEventPattern工厂方法创建事件处理程序->IOobservable是有价值的,因为它们的生命周期表示为IDisposable(稍后会详细介绍)。
Rx的另一个用法是数据并行,因为它与TPL数据流有很大的重叠。我在大型数据并行工作中使用的一种典型模式是将其转换为Rx-IObservable,然后将处理/线程行为应用为monad。
关于花哨的部分,IObservable有一个Linq提供程序,它允许您使用Linq异步处理异步进程(例如,使用TPL的推测执行)。
最后,IOobservable是一个不幸的名字,因为它导致大多数人将其与INPC的概念混淆,因为它看起来类似于ObservableCollection。我向你保证不是。
反应式编程基于"数据流"one_answers"变化传播"
有多种方式来表示这一点。Rx框架基本上是在重新审视传统的基于事件的范式,将其作为事件的流式表示,并提供相关操作。