IObservable<IEnumerable<T>> 真的应该是 IObservable<T> 吗?
Should an IObservable<IEnumerable<T>> really be an IObservable<T>?
考虑一种方法 DoSomething()
returns:
IObservable<IEnumerable<T>> DoSomething()
IObservable<T> DoSomething()
同时考虑:
- FlatMap 方法是否应该将 IEnumerable 转换为 IObservable?
- 是否应该让消费者随心所欲?
- 哪种方式更正确?
- 这两种方式都有关系吗,您的消费者真的应该随心所欲,两者的意图是相同的吗?
考虑这个Observable.Buffer
extension method的签名:
IObservable<IList<TSource>> Buffer<TSource>(IObservable<TSource> source, int count)
显然,如果将结果展平为 IObservable<TSource>
。
就不会很有用了
正如您自己所说,IObservable<T>
和 IObservable<IEnumerable<T>>
在概念上是不同的。
返回 IObservable<IEnumerable<T>>
没有错,如果这就是您的方法的意思。 Buffer 是一个有意义的例子——任何带有批处理的东西都是有意义的。如果您有接受批量订单请求的服务,那么 IObservable<IEnumerable<Order>>
可能有效。你可以把它弄平,这也可能有效。
这取决于 batch/buffer 本身的概念是否是您的方法应该做的事情的组成部分。如果您的方法恰好使用缓冲区来实现其目的,但该方法本质上不是批处理操作,那么展平 Observable 可能会更直观。
IObservable<IEnumerable<T>>
确实与 IObservable<T>
.
在语义上有所不同
IObservable<IEnumerable<T>>
表示报告零个或多个值的零个或多个时刻。
IObservable<T>
表示报告单个值的零个或多个时刻。
前者可以用来表示时间点之间的 activity 并且返回一个空的可枚举将肯定地表示自上一个值以来的 nil activity 。后者不能明确地这样做。
因此,这两种形式可用于表示两种不同的现实世界方式或报告值。
考虑一种方法 DoSomething()
returns:
IObservable<IEnumerable<T>> DoSomething()
IObservable<T> DoSomething()
同时考虑:
- FlatMap 方法是否应该将 IEnumerable 转换为 IObservable?
- 是否应该让消费者随心所欲?
- 哪种方式更正确?
- 这两种方式都有关系吗,您的消费者真的应该随心所欲,两者的意图是相同的吗?
考虑这个Observable.Buffer
extension method的签名:
IObservable<IList<TSource>> Buffer<TSource>(IObservable<TSource> source, int count)
显然,如果将结果展平为 IObservable<TSource>
。
正如您自己所说,IObservable<T>
和 IObservable<IEnumerable<T>>
在概念上是不同的。
返回 IObservable<IEnumerable<T>>
没有错,如果这就是您的方法的意思。 Buffer 是一个有意义的例子——任何带有批处理的东西都是有意义的。如果您有接受批量订单请求的服务,那么 IObservable<IEnumerable<Order>>
可能有效。你可以把它弄平,这也可能有效。
这取决于 batch/buffer 本身的概念是否是您的方法应该做的事情的组成部分。如果您的方法恰好使用缓冲区来实现其目的,但该方法本质上不是批处理操作,那么展平 Observable 可能会更直观。
IObservable<IEnumerable<T>>
确实与 IObservable<T>
.
IObservable<IEnumerable<T>>
表示报告零个或多个值的零个或多个时刻。
IObservable<T>
表示报告单个值的零个或多个时刻。
前者可以用来表示时间点之间的 activity 并且返回一个空的可枚举将肯定地表示自上一个值以来的 nil activity 。后者不能明确地这样做。
因此,这两种形式可用于表示两种不同的现实世界方式或报告值。