Rx框架真的“响应式”吗?

3

我正在通过网络学习Rx框架的材料,发现有很多。

现在每当我在谷歌上搜索时,也会找到“响应式编程”维基百科链接。

因为响应式编程是关于a := b + c的(只要b或c更改,a就会更改), 而Rx是关于订阅源发布的可观察序列。

有人能解释一下响应式编程和Rx之间的联系吗?

4个回答

20

什么是响应式编程?

“响应式”和“交互式”程序之间的区别在于,响应式程序只会在接收到输入时执行。考虑一个非常基本的“交互式”程序——编译器。它接受文件列表,转换数据,输出结果,然后就完成了。Fin.

响应式程序并没有真正的“完成”——考虑操作系统。它何时才算“完成”?它会一直运行下去,响应来自外部世界(网络、输入设备等)的输入。或者考虑“记事本.exe”。它总是有更多的工作要做,直到用户选择“退出”菜单项。因此,你所写的每个GUI应用程序都是一个响应式程序——它基于通常没有离散终止的事件

哦,很酷。"函数式"是如何发挥作用的呢?

函数式响应式编程最重要的一个方面是,事件是一等公民。这意味着,你可以创建一个事件并将其分配给变量。在Rx中,这个变量的类型是IObservable<T>。因为事件只是变量,我们可以将它们组合在一起,以构建更有趣的事件。

我们可以进一步将这些事件组合在一起,使用它们来构建甚至更有趣的事件,或者我们可以构建操作符,封装诸如“超时”或“重试”之类的行为,而不必将自己与源的事件类型绑定在一起。


Rx不是“函数响应式编程”。 - Hailong

3

响应式扩展是一种使用传统非纯函数语言(如C#)实现函数响应编程的方式之一。但是在使用Rx时,您可以以任何风格进行编程,但需要有纯函数响应式编程风格的纪律(有时还需要无知)才能实现。

为了使用Rx实现FRP,我们必须利用提供的类型和高级函数...

var a = new BehaviorSubject<int>(10);
var b = new BehaviorSubject<int>(5);

var c = Rx.Observable.CombineLatest(a, b, (a, c) => a + b);

然而,更符合直觉的写法是这样的(但 Rx 不支持)...
behavior a = 5;
behavior b = 10;
behavior c = a + b;

Rx不是一种一阶语言。它存在于语言内部。因此,它无法对您编码的方式施加限制。它只是帮助您实现FRP的工具,因此您必须先了解FRP才能使用Rx实现它。

话虽如此,您可以使用Rx提供的可组合性,而无需以纯函数响应式风格进行编程,这通常是许多人出于方便而采用的方式。


1
考虑你的例子 a = b + c。这是一个瞬时计算,其中a仅基于bc的当前值被赋值一个值。
现在,为了实现响应式,我们希望在bc的值发生变化时更改a的值。因此,我们不再考虑瞬时计算,而是观察一系列随时间变化的bc的值,并产生一系列随时间变化的a的值。
在 Rx 中,随时间变化的系列是一个IObservable<T>
因此,如果我们从类型分别为IObervable<int>bscs序列开始,我们可以生成一系列@as,如下所示:
var @as = bs.CombineLatest(cs, (b, c) => b + c);

现在我可以这样从@as中获取最新的值:
@as.Subscribe(a =>
{
    /* do something with a */
});

这是使用Rx进行响应式编程的(示例)。


1

响应式编程是一个古老的术语,它只是另一种说“数据流编程”的方式。这是一种编程风格,其中数据控制执行,而不是流控制(在所有常见的编程语言中使用,如C#),其中开发人员使用“if”或“for”结构明确地定义执行流。

响应式编程并不总是指函数响应式编程(FRP)。据我所知,FRP是由Conal Elliott创造的术语。

响应式扩展是数据流的一种实现方式,它允许程序使用LINQ运算符而不是使用回调来对事件流做出反应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接