在实际应用程序中,您可以在许多情况下发现可能的时变变量—例如,GPS位置、温度、鼠标坐标,甚至文本框的内容。所有这些都有一个随时间变化的值应用程序会发生反应,因此是时变的。还有一点值得一提时间本身就是一个时变;它的值一直在变化。在c#这样的命令式编程模型中,您将使用事件来创建响应机制更改,但这可能导致难以维护的代码,因为事件是分散的在各种代码片段之间。
想象一下,一个移动应用程序可以帮助用户在商店中找到折扣和特价商品位于他们的周边地区。我们就叫它Shoppy吧。图1.2描述了Shoppy体系结构。
图1.2 Shoppy应用程序架构。手机应用程序接收电流并可以通过应用程序服务查询商店和交易。
当有新的交易可用时,应用程序服务将发送推送通知推送通知服务器。
你想从Shoppy中获得的一个重要功能是设置商店图标的大小用户越靠近(从某个最小半径开始),地图上的距离越大,如图图1.3。您还希望系统在更新时将新交易推送到应用程序是可用的。
图1.3 Shoppy应用程序地图视图。当用户远时从Rx商店,图标是小的(上)左边),当用户靠近时,
图标变大了(在右边)。
在这个场景中,您可以说store.Location、myLocation和iconSize变量是时变的。对于每个商店,图标大小可以写成:
distance = store.Location – myLocation;
iconSize = (MINIMAL_RADIUS / distance)*MinIconSize
因为您使用了时变变量,所以每次在myLocation变量,则在距离变量中触发更改。应用程序最终会根据距离商店的远近做出反应,使商店图标显得更大或更小。注意,为简单起见,我没有处理边界检查允许的最小图标大小,该距离可能为0或差不多了。
这是一个简单的例子,但正如您将看到的,使用反应的强大功能编程模型在于其组合和连接以及划分和连接的能力拆分每个时变变量所推入的值流。这是因为响应式编程让你专注于你想要实现的东西,而不是你自己让它工作的技术细节。这导致了简单易读的代码和消除了大多数的样板代码(如变更跟踪或状态管理)使您偏离代码逻辑的意图。当代码短小精悍时,它的bug更少,更容易掌握。
我们现在可以停止讨论理论上的内容了,这样你就可以看到如何在.NET中借助Rx将响应式编程付诸实践。
——未完待续
译者:重庆教主 20240513
网站:WPF中文网 wpfsoft.com