かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Reactive Extensiions再入門 その1

修正履歴
2011/11/04 21:36
「Reactive Extensionsで提供されている機能」の「IObserver<T>生成へのショートカット 」の「ラムダ式からIObservable<T>を内部的に生成してくれる」を「ラムダ式からIObserver<T>を内部的に生成してくれる」に修正しました。

ということで、この一年の目標で書いた目標を実現すべく第一歩として、とりあえず書いてみようと思います。書いておけば誰か間違いを指摘してくれるだろうというヨコシマな動機で書いているので、読んでくれる人がもしいるなら一緒に勉強していきましょう!

はじめに

ここでは、Reactive Extensions(下記リンク)の著者自身の理解を深めるために著者自身のReactive Extensionsの理解している内容を記載します。
Dev Lab Reactive Extensions ホームページ

前提条件

ここでは、下記の環境を前提に説明を行います。

Visual Studioは、Visual C# 2010 SP1 Express Editionでも動作可能です。

Reactive Extensionsとは

Reactive Extensionsは、公式ページに下記のように説明があります。

The Reactive Extensions (Rx)...
...is a library to compose asynchronous and event-based programs 
using observable collections and LINQ-style query operators.

拙い英語力で和訳を行うと「Reactive Extensionsは、監視可能なコレクションとLINQスタイルのオペレーションを使用して非同期とイベントベースのプログラムを合成するライブラリです。」となります。
個人的な解釈としては、Reactive Extensionsとは何かしらの値を0回以上通知するもの(C#のeventや非同期処理やタイマーなどetc…)を統一的なプログラミングモデルで扱えるようにしたものです。そして、この統一的なプログラミングモデルを提供するための要となるインターフェースがSystem名前空間の下にあるIObservableIObserverです。

Observerパターン

ObserverとObservableという名前からもわかる通り、このインターフェースはデザインパターンObserverパターンのための機構を提供します。IObserverインターフェースが、IObservableインターフェースの発行するイベントを監視するという構造になります。IObserverインターフェースには下記の3つのメソッドが定義されています。

  • void OnNext(T value)メソッド
    • IObservableから発生した通知を受け取って処理を行います
  • void OnError(Exception ex)メソッド
    • IObservableで発生した例外を受け取って処理を行います。
  • void OnCompleted()メソッド
    • IObservableからの通知が終了した時の処理を行います。

対になるIObservableには下記の1つのメソッドが定義されています。

  • IDisposable Subscribe(IObserver observer)メソッド
    • 引数で受け取ったObserverにイベントの通知を行うようにします。戻り値のIDisposableのDisposeメソッドを呼び出すと通知を取り消します。

Reactive Extensionsは、このObserverパターンを土台にして構築されたライブラリになります。

Reactive Extensionsで提供されている機能

Reactive Extensionsは、このIObservableとIObserverをベースに下記のような機能を提供しています。

  • IObservableのファクトリメソッド
    • Reactive ExtensionsにはIObservableを返すファクトリメソッドが多数用意されています。.NETの標準のイベントからIObservableを生成するメソッドや、非同期呼び出し、タイマー、シーケンス、特定のルールで生成される値の集合etc…さまざまなものが提供されています。
  • IObservableの拡張メソッド
    • IObservableとIObserverだけではイベントの発行と購読の関係にしかなりません。Reactive Extensionsでは、ここにLINQスタイルの拡張メソッドを提供することでIObservableから発行された値をフィルタリングしたり、発行された値を元に別の処理を行ったり、発行された値の変換を行ったりすることが出来ます。
  • IObserver生成へのショートカット
    • IObserverを実装しなくても、ラムダ式からIObserverを内部的に生成してくれるため実際にReactive Extensionsを使用するときにはIObserverインターフェースを実装するケースは、ほとんどありません。
  • 柔軟なスレッドの切り替え機能
    • IObservableから発行された値に対する処理を何処のスレッドで実行するのか柔軟に切り替える機能が提供されています。このためバックグラウンドで時間のかかる処理を行い、UIスレッドに切り替えて画面の更新を行うといった処理が簡単に行えるようになります。

以上が、Reactive Extensionsで提供されている機能の全体像になります。次からは、Reactive Extensionsの基本となるIObservableインターフェースとIObserverインターフェースを見ていこうと思います。