5000兆年ぶりにReactive Extensions再入門

あすかです。

2週間前にこういう記事を書いていたブログがあったらしいのですが、

kmycode.hatenablog.jp

ちょっと調べてみたら、
これと同じというか、もっと便利なことまでできる方法があったんです。

www.nuget.org

ReactivePropertyというライブラリに入っている
ReactiveCommandというものを使えばいけるみたいです。

・・・ところで、Reactive Extensionsってなんでしたっけ?
あすか、1年前にちょこちょこ触ったきりで使ってないんですよねRx。

というわけでいろいろ調べて、Rx再入門してみました。
話的には遠回りになっちゃいますが、まずそこからいきます。

Rx再入門

Rxとはなにか?

ここに、1~3の3つの数字があります。

f:id:kmynews:20170930170842p:plain

こいつらを川に流します。

f:id:kmynews:20170930171234p:plain

この状態をこう置きます。
※厳密には、これだけではColdなので違います。

頭の悪い人はただ見てるだけです。

f:id:kmynews:20170930171938p:plain

この状態をこう置きます。

デリゲート君が、数字たちを拾ってくれました。

f:id:kmynews:20170930172724p:plain

この状態をこう置きます。

ただし3,テメーはダメだ。

f:id:kmynews:20170930173321p:plain

この状態をこう置きます。

デリゲート君は、用が済んだら数字たちをまた川に落とします。
※厳密には、Subscribe1つあたり1つの支流ができるので違います。

f:id:kmynews:20170930174217p:plain

そうしてまた次のデリゲートが拾ってくれて、また突き落とされての繰り返しです。
これがRxです!(大嘘)

もう少し分かりやすい説明

Rxとは、川に何かを流す、よくわからない何かです。
数字だけでなくイベント、時間とか、いろんなものを川に流すことができます。

基本的に、ドSなプログラマ向けの技術です。
あすかは優しい人なのでRxやってません。

さっきSkipWhileやWhereという、Linqで見るようなメソッドを見た人は「もしや」と思うと思うんですが、
Rxは、ざっくり言うと、川の流れに対してLinqを使えるようにした技術です。
LinqはIEnumerableというデータの集合というか、連続した複数のデータに対して使うものですが、
Rxは、IObservableというものに対して使います。

IObservableとはなにか?というと、

ここのRangeメソッドが、IObservable<int>を返します。
この戻り値として返されたIObservable<int>というオブジェクトが、1、2、3の数字を出しているんですね。

IObservableなオブジェクトに、Subscribeという拡張メソッドがあります。
それを使って、さっきのデリゲート君のように、IObservableが出した数字をとって処理することができます。

さっき、数字以外も流せると言いましたが、
こうすれば数字の代わりにイベントを流すことができます。
この場合、イベントが発火されたタイミングで処理が周ります。

また、時間を流すというと一気に抽象的な感じになっちゃうのですが、
具体的にはこういうことです。
3秒に1回、処理が走ります。
この場合、川には、3秒経つごとに「0、1、2、3、・・・」といった数字が流れます。

あと、2つの川を合流させたり、分流したりすることもできます。
続きの勉強はこことかが分かりやすいです。

qiita.com

かずきさんのサイトでは、必要なことが簡潔にまとめられています。

blog.okazuki.jp

こっちのところは、自作のところがやや高度なので、初めての方はそこ読み飛ばしても大丈夫だと思います。
ていうか最初からではなく「シーケンス化」を先に読むとわかるかもしれないです。

blog.xin9le.net

また、上のサイトにもありますが、値を流すクラスを自作することもできます。
そしてその自作は、Subjectといったクラスを使うと楽です。

先週のコードをReactivePropertyを使ってまとめてみる

先週は、HasInitializedプロパティがtrueになったら実行できるコマンド、コマンドの中身はCheckInitializeメソッドの呼び出し、
そういうコマンドを作りたい!という内容でしたが、
これをReactivePropertyを使って書いてみると、こうなります。

ほんと短いですね。わざわざ拡張メソッド作らなくても、すぐ済みますね(´・ω・`)
そんなわけで、次回は何やろうかな。