Rx扩展方法的命名规范?

5
如果我正在为另一个库中的类型编写扩展方法,将该类型转换为Rx IObservable<T>,那么到底是什么约定呢?我之前认为应该使用AsObservable,但我也看到过ToObservable。我不清楚哪种用于何时,或者是否有任何真正的约定。
可能ToObservable用于将预期产生单个事件的内容转换为IObservable<T>,而AsObservable则用于将预期产生事件序列的内容转换为IObervable<T>

2个回答

6
除非你有很好的理由要编写自己的交叉二元运算符,否则在处理可枚举和可观察对象时不需要编写“To”后缀。
请注意以下事实:
- ToObservable 期望将“pull-based”序列转换为“push-based”序列。 - ToEnumerable 期望将“push-based”序列转换为“pull-based”序列。 - AsObservable 期望将“push-based”类型包装为 IObservable< T >。 - AsEnumerable 期望将“pull-based”类型包装为 IEnumerable< T >
因此,在编写切换源的二元运算符方法时应使用 To,而在结果二元运算符与源相同时应使用 As
在大多数情况下,你将使用 As 编写自己的方法,因为 ToObservableToEnumerable 的交叉二元运算符已经为你编写好了。
来源:个人经验、MSDN文档(上述内容)、Erik Meijer。

3
我想进一步概括上述内容,指出AsObservable曾经被命名为Hide。如果底层类型是ISubject,它非常有用,可以隐藏底层类型。即使通过返回IObservable`1方法返回主题,它也可以被转换回主题并被篡改。Hide/AsObservable可以防止这种篡改。考虑到这一点,我会将从非IObservable投影到IObservable的任何内容命名为'ToObservable',包括IEnumerable源。 - Lee Campbell
没错!我已更新答案,使用“wraps... as”这个句式代替“casts... to”,以便更加清晰明了。 - cwharris

5

我不知道有任何官方指导,但我会使用主要指标来查看你所做的工作量。 在大多数情况下,都需要进行一定量的工作(本身是主观的),例如将IEnumerable转换为IObservable,这时我会使用ToObservable方法。 当方法执行相当简单的任务时,如Observable.AsObservable扩展方法,AsObservable似乎更好。 这两种方法之间的另一个显着区别是,AsObservable只是一种类型转换,不会对参数的行为造成任何实质性的改变,但Observable.ToObservable(IEnumerable<T>)返回具有明显不同语义的对象。


1
好建议。我认为AsXxx应该只是一个强制转换(以便编译器选择所需的扩展方法:参见LINQ AsQueryable/AsEnumerable或C#中的"as"关键字),而任何涉及转换的内容都应该优先考虑使用ToXxx或FromXxx(例如FromAsyncPattern)。这适用于Observable.AsObservable,其唯一真正的用途是强制编译器选择IObservable(客户端)扩展方法而不是IQbservable(服务器端)等效方法。 - itowlson
1
好的观点,但是“..only real use (of AsObservable...)”并不完全正确。我认为它的主要作用是保护您免受消费者篡改底层类型的影响,即能够将您的类型转换回主题,然后在其上调用OnNext/OnError/OnComplete。 - Lee Campbell

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