RX受试者 - 他们应该避免吗?

时间:2012-02-15 19:20:28

标签: system.reactive

我在另一个帖子中有一个mini-discussion on the topic,并且想让人们在主题的“坏”方面输入。

频繁参与RX论坛的人都知道E.Meijer does not like Subjects。虽然我对RX创作者的意见表示最深切的敬意,但我已经在多个项目中广泛使用了Subjects几年,并且因为它们而没有任何架构问题或错误。

我可以命名的主题的唯一“陷阱”是它们不是“可重用的” - 在完成主题上的可观察量之后,您需要在新订阅者可以从其接收事件之前重新实例化它。

“代码味道”和“不喜欢它们”需要“实用”示例支持 - 您是否可以引起我们注意使用主题可能导致错误或问题的可能情况?或许你认为它们完全是容易和无害的 - 然后尝试定义它们将被使用的区域。

4 个答案:

答案 0 :(得分:25)

Erik Meijer正在以纯粹的功能方式思考 - 主题是Rx的可变变量。因此,在一般用法中他是对的 - 使用主题有时是一种在功能上消除思维的方法,如果你使用它们太多,你就试图排在上游。

然而!当您与.NET的非功能世界接口时,主题非常有用。包装事件或回调方法?主题很棒。试图将Rx“接口”放到某些现有代码上?使用主题!

答案 1 :(得分:6)

似乎很多评论者都在互相谈论。

上次我使用主题时,我需要在初始化调用中将委托传递给中间件,以便在发生某些事情时可以回复我。代表有熟悉的事件args签名,但我无法使用FromEvent,因为没有事件。

我并没有感到难过 - 我没有看到任何其他选择。

基本上,只有当我发起某些事件并将其放入Rx世界时,或者当我需要处理尚未到达的未来用户时,我才会使用Subjects。主题让我把我现在拥有的东西链接到后来的订阅者。

答案 2 :(得分:2)

由于惰性评估,每当反应组合器被复制时,我都会使用Subject / Publish

然而,对于临时使用我感觉主题有点沉重 - OnNext可能是潜在的瓶颈 - 在分析期间显示为热点,可能是因为在向订阅者推送价值时进行并发检查。

我觉得对于你知道根据定义很热的Observable来说它也更清晰。

答案 3 :(得分:1)

我担心使用<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> <input id="nameInput" type="text" /> <br/> <br/> <select id="select"> <option value="default" selected disabled>Select..</option> <option class="option">a</option> <option class="option">aaa</option> <option class="option">bbb</option> <option class="option">bbbbbb</option> <option class="option">my option</option> </select>作为公共API的一部分的一个原因是它混合了关注点;观察者是一个与观察者不同的关注点。

如果某些不明智的观察者在Subject<T>上调用OnNextOnCompleted或者OnError,那么它只应该是观察者

即使它不是API的一部分,并且你把它作为私人支持领域放在你的服务器中,但它具有双重角色的事实令人不安。在将其用作支持字段的情况下,您仍然只期望它执行一个角色/关注点 - 一个可观察的角色/关注点。然而,它有可能做两件事,这只是在精神上令人不安。