BT

新しい あなたは、アーリーアダプター?それともイノベーター?そんな皆様に、InfoQの新機能をご案内しています。詳細はこちら

.NETリアクティブフレームワーク(Rx)がLINQ to Eventsを可能にする

| 作者: Abel Avram フォローする 4 人のフォロワー , 翻訳者 竹中 翔 - (株)ポータルアイランド フォローする 0 人のフォロワー 投稿日 2009年7月26日. 推定読書時間: 1分未満 |

原文(投稿日:2009/7/23)へのリンク

Erik Meijer氏とWes Dyer氏はLINQ to Eventsを使用可能にする、.NETリアクティブフレームワーク(Rx)を作成した。リアクティブフレームワークはLINQ to Objectsの(数学的な意味の)双対である。Erik氏と氏Brian Beckman氏はIObservableが継続モナドであることを実証した。

リアクティブプログラミング自体は新しいものというわけではなく、すでにCommon Lispのデータフロー拡張としてCellsで使われているし、Trellisでも高次リアクティブプログラミングサポートのためのPython拡張機能として使われている。C#では、非同期処理のコールバックやイベントハンドラとしてリアクティブプログラミングが使われている。非同期処理終了時、もしくはイベント発生時にメソッドが呼び出され、イベントへのリアクションとして実行される。

LINQ to Objectsはデータコレクションの反復処理を行うためにIEnumerableとIEnumeratorインターフェースを使用する。反復子(Enumerator)のMoveNextメソッドはある要素から次の要素へ移動するために使われ、Currentプロパティは現在の要素を取得するために使われる。反復子のメカニズムはシンプルで、よく知られ、広く利用されている“プル”プロセスを使っている。Erik氏はIEnumerableが、コレクションからデータを取り出せる時、そのコレクションにデータを追加することもできる、という双対性を持っていることを発見した。これはリアクティブプログラミングへのもうひとつのアプローチである。

理論上、IEnumerableインターフェースはコレクションへのオブジェクトの追加に使えるが、非同期処理に使うことができない。彼らのチームがIObservableとIObserverという2つの新たなインターフェースを導入したのは、これが理由である。誰でもIObserverをデータのコレクションに割り当て、それをIObserverに登録することができる。新しいデータが利用可能になったら、そのデータはIObservable経由で順にIObservableに渡され、コレクションにプッシュされる。Microsoftのプレゼンテーションプラットフォームコントロールチームの開発者であるJafar Husain氏は、どのようにIObserverパターンが使われるかを次のように説明した

IObservableを詳しく検討するために、IEnumerableの動作を逆にして考えてみましょう。まずIObserverを生成し、それにIObservableを渡します。そして、IObservableがIObserverにデータを“プッシュ”します。IObservableがObserverの“OnUpdate”メソッドを呼び出すことは、IEnumerableに情報を与えるためのyieldキーワードに相当します。同様に、IObservableがObserverの“OnCompleted”メソッドを呼び出すことは、IEnumrableでもうこれ以上データがないことを表すbreakキーワードに相当します。

これの何がよいのかというと、イベントハンドリングに役に立つようだ。例えば、IObserverをマウスイベントにアタッチし、それらをコレクションに非同期的に記録する。そして、LINQを使ってそのデータを反復処理することができる。GUIイベントのハンドリングでの威力を示すため、リアクティブフレームワークはSilverlight Toolkitの単体テストに使用され、System.Reactive.dllにパッケージされてソースコードに含まれている。リアクティブフレームワークは.NET 4.0にも含まれるだろう。

ソフトウェアアーキテクトで宇宙物理学者のBrian Beckman氏はErik Meijer氏とのビデオインタビューの中で、IObservableがIEnumerableモナドの双対の、継続モナドであることを実証した。Erik氏はIObservableインターフェースがIEnumerableの双対化によって生み出された過程についても説明している。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT