2009-07-31 11 views

答えて

33

IObservableをイベントとして使用して、イベントをタイプIObservableのプロパティで公開するコードを置き換えることができますが、それは実際のポイントではありません。

IObservableについて理解するには、2つの重要な事柄があります:非同期(一般的に単一の値を返す)の操作やイベント:

  1. は、それは我々が前に統一する方法を知りませんでした二つの概念を統合(通常は永遠に続く)。

  2. です。 CLRイベント、IAsyncResult、またはINotifyCollectionChangedとは異なり、一般的なイベントや非同期操作から特定のイベントを構築できます。

ここは、今日の午後ちょうど仕事で遭遇した例です。

Silverlightには、通常のコントロールに適用できない画像コントロールに適用できるいくつかの効果があります。コントロールのコンテンツが変更されたときにこれらの制限を回避するために、私は視覚的外観が更新されるのを待って、スクリーンショットを撮ります。次に、その視覚的表現を隠してスナップショットと置き換え、視覚効果をイメージに適用したいと思います。今では、イメージエフェクトをコントロールに適用できます(インタラクティブではないと仮定して)。

このプログラムは簡単ですが、非同期である必要があります。私は、画像にエフェクトを適用することができます前に、私が完了するまでに2つの連続で非同期操作を待たなければなりません:

コントロールの内容が変更された
  1. コントロールの外観は、ここで

は、どのように私は思います更新され

  • この問題は、Rxを使用して解決してください。この例は、シーケンスの操作が2つしか連続しないため、特に簡単です。この単純な例でも、Rxが価値を追加することがわかります。それがなければ、イベントが特定の順序で発生することを保証するために状態変数を使用しなければならなかったでしょう。私は、LayoutUpdatedイベントから抽象度を切り離すためにかなり醜いコードを書く必要もありました。

    Rxでプログラミングしているときは、「私のフレームワークが提供するイベントは何ですか?」と考えることです。それを作成して行く。私たちはイベントをシンプルな入力駆動型のもの( "mouseover"、 "mouseclick"、 "keyup"など)と考えるように訓練されています。しかし、あなたのアプリにとって非常に複雑で特定なイベント(「GoogleMsdnMashupStockDataArrived」、「DragStarting」、および「ImageContentChanged」)の理由はありません。このようにプログラムを構成すると(状態を変更してとそれに応答するが必要なイベントを正確に作成すると)、状態のバグが少なく、順序が整っていて、全体的に自己記述的です。

    これは取得できましたか?スコットを:-)

  • +0

    greateの例(したがって+1)しかし、私はむしろすべてのプログラマーがRxを理解するまでには長い時間がかかるので、私はむしろ状態マシンを見ると思います。 Rxが一歩遠すぎると、ポストプログラマーはComp Sciの学位を持っていないと決めたことはできません。 –

    3

    イベントベースのプログラミングモデルの拡張です。あなたはIObserverを実装するものを作成します。基本的には、「ここでは、コレクション内の何かが変わったときに何をしたいのですか」と言っています。そういう意味では、私たちがイベントで何をしてきたのかを標準化したものに過ぎません。

    彼らはIEnumerableパターンと比べて大きな正面らしいようにそれを押しています。 IEnumerableは「プル」ですが、IObservableは「プッシュ」です。

    私がストレートイベントで見る唯一の利点は、標準化されたインターフェイスだということです。私はここでObservableCollection(とINotifyCollectionChanged)と大きな重なりが見えます。多分、彼らは.NETでPERLのモットーを採用しようとしています。「それを行う方法は複数あります。

    +4

    添付チャレンジを完了する質問はIObservableとIObserverは、フレームワークのバージョン1で実装された場合、フレームワークがどのようになるか、それからです。 エラー処理とイベントプログラミングが可能でした。 非同期イベントと同期イベントを処理する一般的な方法。 パラレル拡張はIObservable型を使用していました。 しかし、主なことは、これが最初から構成可能であったため、現在不可能ではないにしても困難な多くの項目を大幅に簡素化するということです。 (ユニットテスト非同期UIは私の頭の上から気になるものです) – DouglasH

    +1

    @Doughlasしかし、私たちは歴史を書き換えることができないので、質問は "theOldWay or Rx"ではなく "theOldWay OR(theOldWay and Rx ) " –

    +0

    IObservableの主な利点は、その構成可能性です。 IObservable インターフェイスに依存する組み込み演算子のコレクションが豊富なため、非常に簡単な方法で非常に複雑なやりとりを作成できます。生のイベントでは、すべてのイベント呼び出しを追跡するために多くの状態を持つことに頼る必要があります。 – ionoy

    3

    私は利点のわからないんだけど、私は次の古典的な.NETのイベントとの違いを参照してください。このために別のイベントを必要とする

    エラー通知

    クラシックイベントを、またはEventArgsチェックする必要があるErrorプロパティを持つクラス。

    終了の通知通知

    クラシックのイベントがチェックする必要がありFinalプロパティを使用して、このまたはEventArgsクラスの別のイベントを必要とします。

    関連する問題