最近になってRxのカケラのようなものが分かってきたのでまとめておきます。
前提知識としてLinQの使い方が分かっていないと理解が難しいと思います。
・Rxについて
まず、Rxとは何?ですが、
どのサイトでも紹介されているようにIEnumerable「Pull型」の反対がObservable「Push型」にあたります。
何をPush?Pull?かというと、これはデーターフローの事で
与えられた入力データを引っ張る、もしくは押していくかの違いになります。
ここで出てきたPull型とPush型については以下のとおりです。
・Pull型とは
ある空間からデータを引っ張ってくる(戻り値で受け取る)イメージです。まさにforeachがそれ。
例: 配列から1つ値を引っ張ってきて処理する。
var query = new List
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が得意とされるようです。
次回はもう少し実例を使って違いを見比べてみたいと思います。
0 件のコメント:
コメントを投稿