ninjinkun's diary

ninjinkunの日記

スマートフォンアプリでリアクティブプログラミングをしているが、Promiseとデータバインディングとして使っている

このところ、複数の人からリアクティブプログラミング(RP)ってつまり何なんですかと聞かれることがあった。そのたびに非同期データストリームが…みたいな説明をしていたのだが、たいてい双方納得した感じにはならなくて、まあ難しいっすね…という感じで終わってしまっていた。

iOSAndroidでの用途

自分は理論より実践からしか考えられないタイプなので、もっと現場寄りの説明ができないか常々考えていた。そこで自分がiOSAndroidアプリを実装する際に使っているReactiveCocoaとRxJavaの用途を考えてみたところ

  • Promise(の高機能版)
    • 複数APIコールを連鎖させたい場合にコールバックヘルを避けたい
  • データバインディング(の高機能版)
    • Modelの変更とViewの変更を同期したい

の2つがメインだった。

この2つはRPライブラリを入れなくても実装できる。JavaScriptならそれぞれに独立した良いライブラリがあり*1、両方ともそこそこ普及している概念だと思う。

クライアントサイドで使うRPについての自分の理解は、この2つの概念と他の用途(イベントと時間、高階関数など)を包括した大統一理論というか、スーパーセットだというものだ。両方を1つのライブラリで実装しようとするとRPの形がしっくりくるし、なるほどストリームって必要だよねというのも感覚では理解できるようになった。

しかしやはり概念として大きすぎる気がするし、実際の仕事では使っていない機能も多い。選択肢がある場合は、小さくて普及しているものを採用した方が、現場の負荷も少なくて良いのではないかと思う。パラダイムの違うもの、怖いし。

プラットフォーム事情

ではなんで自分がRPというスーパーセットお化けを使っているかというと、スマートフォンアプリでPromiseとデータバインディングを実装するために最も完成度が高いライブラリがRPライブラリだったからという消極的な理由である。

iOSではPromiseKitなどのPromise系ライブラリは割とあるし使われていると思う。データバインディングのライブラリもあるのだが、自分の感想ではReactiveCoocaのデータバインディングが一番使いやすかった。

Androidでもライブラリは色々あるが、データバインディングもPromiseも広く使われている実装がないというのが自分の理解。RxJavaがAndroidでも人気なのは、Promiseの良い実装がないからではないかと自分は考えている。

おわりに

RPは大統一理論なので、Promiseとデータバインディングを両方実現できる上に、両方を繋いで!複雑なAPIコールとViewへの反映をObservableで接続!ということもできる。キメると実装者としては大変気持ちが良い。しかしたいていの場合そこまでやる必要は無いし、キマったコードはRPに慣れていない同僚を困らせる。

なので色々できるけど、今のところ自分はPromiseとデータバインディングをやるための便利なライブラリだよという説明を採用しているし、仕事でもその範疇の中で使っている。

RPのパラダイムがもっと普及して、RPで全部を考えるニュータイプが多勢を占めるようになるとこの状況も変わると思うので、それはそれで楽しみである*2

補足

  • サーバーサイドでの用途に言及すると混乱に拍車がかかるし、自分はやっていないので省いた
  • プラットフォームでRxをサポートしている.netの方から見ると事情は全く違うだろうと思う
  • これもよく聞かれるし、自分も前は間違えていたのだけど、React.jsはデータバインディングなどの概念での共通点はあるけど、リアクティブプログラミングの実装ではないという理解
  • 多様なリアクティブプログラミングの世界を覗き見たければReactive Pornがとても参考になる

*1:PromiseはES6で標準になるということだし、データバインディングにはAngular.js, vue.jsなどがある(らしい。使ったことはない)

*2:実のところ周りにもニュータイプは何人か居るのだが…