web-dev-qa-db-ja.com

高温と低温の観測量とは何ですか?

私はビデオを見ました と私は一般原則を知っています-誰も購読していないときでもホットは起こり、コールドは「オンデマンド」で起こります。また、Publish()はコールドをホットに変換し、Defer()はホットをコールドに変換します。

しかし、それでも、私は詳細を見逃していると感じています。ここに私が答えたいと思ういくつかの質問があります:

  • これらの用語を包括的に定義できますか?
  • ホットなオブザーバブルでPublishを呼び出したり、コールドでDeferを呼び出したりしても意味がありませんか?
  • ホット/コールド変換の側面は何ですか?たとえば、メッセージを失いますか?
  • IObservableとIEnumerableのホットとコールドの定義に違いはありますか?
  • コールドまたはホットのプログラミング時に考慮すべき一般原則は何ですか?
  • 高温/低温の観測値に関するその他のヒントはありますか?
54

これがお役に立てば幸いです。

これらの用語を包括的に定義できますか?

http://leecampbell.blogspot.com/2010/08/rx-part-7-hot-and-cold-observables.html にある私のブログ投稿を参照してください。

ホットなオブザーバブルでPublishを呼び出したり、コールドでDeferを呼び出したりすることは理にかなっていますか?

いいえ、考えられないことではありません。

ホット/コールド変換の側面は何ですか?たとえば、メッセージを失いますか?

サブスクライバーに関係なく「イベント」が発生するため、Observableがホットのときにメッセージを「失う」可能性があります。

IObservableとIEnumerableのホットとコールドの定義に違いはありますか?

私は質問を本当に理解していません。この類似性が役立つことを願っています。 Hot Observableを熱心に評価されたIEnumerableと比較します。つまり、リストまたは配列はどちらも熱心に評価され、誰も列挙しなくてもデータが入力されています。ファイルまたはデータベースから値を取得するyieldステートメントは、Yieldキーワードを使用して遅延評価できます。遅延は良いことですが、2番目の列挙子が実行された場合、デフォルトで再評価されます。これらをObservableと比較すると、Hot Observableはイベント(ボタンのクリック)または温度のフィードである可能性があります。これらのイベントはサブスクリプションに関係なく発生し、同じオブザーバに対して複数のサブスクリプションが作成された場合にも共有されます。 Observable.Intervalは、コールドオブザーバブルの良い例です。サブスクリプションが作成されたときにのみ値の生成を開始します。複数のサブスクリプションが作成された場合、シーケンスが再評価され、「イベント」は(サブスクリプション間の時間に応じて)別々の時間に発生します。

コールドまたはホットのプログラミング時に考慮すべき一般原則は何ですか?

ポイント1のリンクを参照してください。また、RefCountと組み合わせて使用​​されているPublshを調べることをお勧めします。これにより、コールドオブザーバブルのレイジー評価セマンティクスを持つことができますが、ホットオブザーバブルが取得するイベントを共有できます。

高温/低温の観測値に関するその他のヒントはありますか?

手を汚して、それらをいじってください。それらについて30分以上読んだ後、それらを使ったコーディングに費やした時間は、これ以上読むよりもはるかに生産的になります。

28
Lee Campbell

ホットオブザーバブルは、オブザーバブルにサブスクライブしていない場合でもプッシュされます。マウスの動きや、タイマーの目盛りなどです。コールドオブザーバブルは、サブスクライブしたときにのみプッシュを開始し、再度サブスクライブすると最初から観測します。

19

包括的な回答をするつもりはありませんが、この質問の時から学んだことを最も単純な形でまとめたいと思います。

ホットオブザーバブルは、イベントと完全に一致します。イベントでは、サブスクライバーがリッスンしていない場合でも、通常は値がハンドラーにフィードされます。すべてのサブスクライバーは同じ値のセットを受け取ります。 「イベント」パターンに従うため、高温のオブザーバブルは低温のものより理解しやすいです。

コールドオブザーバブルもイベントに似ていますが、ひねりを加えたものです-コールドオブザーバブルのイベントは共有インスタンスのプロパティではなく、誰かがファクトリーから毎回生成するオブジェクトのプロパティです購読します。さらに、サブスクリプションは値の生成を開始します。上記のため、複数のサブスクライバーは分離され、それぞれが独自の値のセットを受け取ります。

RX初心者が犯す最も一般的な間違いは、関数内のいくつかの状態変数(つまり、累積合計)を使用し、それを.Defer()ステートメントにラップしないで、コールドオブザーバブルを作成することです(コールドオブザーバブルを作成していると考えます)。その結果、複数のサブスクライバーがこれらの変数を共有し、それらの間で副作用が発生します。

9