RxJavaでリアクティブプログラミング
今回はKotlinで書きます。
RxJavaでリアクティブプログラミングについて軽く触れたいとおもいます。
リアクティブプログラミングとは?
簡単にいうと逐次にフィードバックが返ってくるように処理を書くことで、ユーザに何も反応がない状態をさけるようなGUIプログラミングに主に使われるプログラミングスタイルです。
リアクティブプログラミングをするには特にRxJavaが必要というわけではありません。
ただしRxJavaを利用することでリアクティブプログラミングをする上でいくつかのメリットがあります。
たとえばRxJavaはRxBindingと合わせると、リアクティブプログラミングをやりたいときのコールバック地獄の問題を緩和してくれる。
これは非常にありがたいです。
つぎに合成的な処理や高階関数の利用が可能になるので、多少複雑なことが簡単に書けてしまう。
というメリットがまず代表的なものだと考えます。(非同期性の部分は副次的なものと考えます。)
例えばこんな感じのコードはどうでしょう?
fun onCreate() { val a = editIntTextA.textChanges() .map { s -> s.toInt() } val b = editIntTextB.textChanges() .map { s -> s.toInt() } val sum = Observables.combineLatest(a, b, {a_, b_ -> a_ + b_}) sum.map{ i -> i.string }.subscribe(output.text()) }
このコードは2つのEditTextに入力された数値を足した数字をTextViewにアウトプットするものです。
どちらかのEditTextの入力され文字列(数値)が一つでも変わるとすぐに計算結果がTextViewに反映されます。
リアクティブプログラミングを実践するコードとしては単純ですが、良い例になります。
このように、二つのイベントを組み合わせ一つのストリームとして処理したり、イベントの発火は契機にして欲しい値に高階関数をつかって置き換えをすることにたけているのがRx系のライブラリの良いところでしょう。
非同期処理用のライブラリとして使うのもよいのですが、既存のAPIがコールバック式になっている場合に、どうやってうまくデータのストリームを副作用のある終端にもっていくのかをシンプルにしてくれ、リアクティブプログラミングを簡単にしてくれるものとして捉えると、自然とライブラリの本質とその根底にある問題領域と解決にたいするアプローチがみえるようになります。
そうすると、どういう場合に使うべきで、どういう場合には向かないのか、あるいはどう書けばより保守として効果の高いコードをデザインできるのかが見えてくるようになると思います。
すなわちRxは本質的にはスタイルを提供するもので、非同期的な処理に関するものは、スタイルを維持するうえで必要だったのです。そしてそのスタイルについて知るには、ちゃんと使ってみるのが大事ですという話でした。
もっと別の例を見てみたいという方はこちらのリポジトリが多少参考になるかもしれません。