2014年9月19日金曜日

Reactive Extensions for .NET (Rx) 入門その1

いろんなサイトを見ても良く分からなかく避けていたのですが、
最近になってRxのカケラのようなものが分かってきたのでまとめておきます。
前提知識としてLinQの使い方が分かっていないと理解が難しいと思います。

・Rxについて
 まず、Rxとは何?ですが、
どのサイトでも紹介されているようにIEnumerable「Pull型」の反対がObservable「Push型」にあたります。
何をPush?Pull?かというと、これはデーターフローの事で
与えられた入力データを引っ張る、もしくは押していくかの違いになります。
 ここで出てきたPull型とPush型については以下のとおりです。

・Pull型とは
 ある空間からデータを引っ張ってくる(戻り値で受け取る)イメージです。まさにforeachがそれ。

例: 配列から1つ値を引っ張ってきて処理する。
var query = new List() { 1, 2, 3, 4, 5 }.Select(i => { return i; });
foreach(var i in query)
{
  Console.WriteLine(i); //ひっぱってきた値を処理する。
}

・Push型とは
 得られたデータを左から右へと押していく、一言で言えばメソッドチェーン。
 しかもインターフェイスがObservableが同一であれば自在に操作ができる。

例: 値を左から右へ伝播させて処理する。
var query = Observable.Range(1, 5);
query.Subscribe(i => { Console.WriteLine(i); }); //伝播されてきた値を処理する。

2つは似ていても入力データの処理方法が異なる事が分かったでしょうか。
もう1つ大きな違いは、
Pull型は値を引っ張ってきて同メソッド内で処理を行いますが、
Push型は、Observerがこんな入力データが来ましたよと、(丸投げ)通知するので、実質処理は外側にいるクラスで行います。


入力データにフィルタを書けたり加工したりするのはLinQ機能で実現できるので、
応用処理はどちらも同じくらい広がりますね。

最後に
 データと処理を一箇所にまとめてコンパクトにしたい場合はIEnumerableが得意とされ
 データと処理を分離して、1つのデータで異なる処理をまとめて実行したい場合はObserverbleが得意とされるようです。


次回はもう少し実例を使って違いを見比べてみたいと思います。

コメントを投稿

Androider