AndroidのMVIについて勉強した時のメモ
AndroidのMVIについて勉強した時のメモです。自分用のメモなので雑です。
MVIとは
「MVCを元にして、jsのreduxやreactの思想を取り入れた何か」のようなもの。リアクティブで関数型プログラミングを採用している。
MVCだとViewを操作するのがControllerかもしれないし、Modelかもしれないが、MVIはreduxのようにデータの流れが単一方向。また、Reduxのようにいろんな部分を純粋関数で記述するのでテストも書きやすい。
詳しくは
この辺のリンクに目を通したらだいたいわかった気になれる。
雑感
Reduxと違うところ
すでにReduxが何か理解している人向けに書くと、Reduxと比べてこの辺が良さそう。
- 非同期処理というかデータの取得と整形をProcessorでやると定まっている
- Reduxだとこの辺がふわふわしている印象
- ほとんどの人はCreatorProducerがやるんだろうけど
- 初めての人でも迷わなさそう
- Reduxだとこの辺がふわふわしている印象
- ActionとIntentが別れているのが良い
- ReduxだとViewがCreatorProducer経由でAction発行するの、わかるんだけど、User観点で何をしたいのか?と実際にデータをどうするか?を分けて記述できるのがわかりやすい
- ActionとResultが別れているのが良い
- ReduxだとActionに変更したいstateのデータを詰める感じだと思うけど、それをResultという別のものとして扱うのが直感的
- ユーザの入力によって何をするべきかというのがコードで表現される
- あまり仕様を書かない文化のチームだと助かる場面があるかも
一方、Reduxと比べてこの辺つらみありそうというところもあって、
- SingleなStoreの概念がないので、一箇所で集中管理する感じではない
- ViewModel層がいかつい
- 細かく切ってる分ボイラープレート増える
- IntentとAction増えてくるとここまでする必要あるのかな〜って気分になってきそう
- 細かく切ってる分ボイラープレート増える
- まだそんなに流行ってないので知見がweb上で見つかりにくい
で、どうなの
自分の中では結局「どういうプロダクトかによる」という普通かよ〜〜〜みたいな結論になった。ユーザの入力というかIntentの種類がたくさんあって、かつ結びつけるActionがバラバラだったりすると、ActionをIntentを分ける恩恵はありそう。今Reduxを採用しているAndroidアプリの中からMVIに移行するケースがあれば話を聞いてみたい。でもStoreがないのでAndroidで採用するほどのモチベーションがありそうなケース、そんなになさそうかも?
今年のDroidKaigiでMVIのセッションがあるので今から楽しみにしている。
完全に余談になるが、AndroidでIntentというとおそらく大多数の人がandroid.content.Intent
だと思うし、Processorもio.reactivex.processors
を連想する人が多いと思う。名前の衝突が発生して、今どちらについて話しているのか?の認識合わせをしながらコミュニケーションとって行く必要があるので地味にストレス溜まるかもしれないなーと思った。チーム開発で取り入れてみないと何も言えないけれど。
おまけ:本家Circle.js
Twitterで釘宮さんに圧倒的知見をいただいた。感謝!
MVIってcycle.jsからきてるので、オリジナルのものも見てみるといいかも ( https://t.co/RtmPJx1SxG ) 。1hくらいの動画もあって手軽に学べますよ
— 有象無象 (@kgmyshin) 2018年1月25日
で、オリジナルだとReducerとかって言葉は出てこなかったはずなので、Android用に変えてるのか、ちょっとRedux混ぜてるかもですね (悪いとかではなく)
本家Cycle.jsだとかなりシンプルな構成で、DOM source(入力)とDOM sink (出力)を繋ぐのは、intentとmodelとviewだけ。面白いのはintentとか含めだいたいstreamとして扱われるところ。reactだからかな。
こんなにスッキリかけるのは羨ましい。
function main(sources) { return {DOM: view(model(intent(sources.DOM)))}; }
また、Eggheadのvideoコースもわかりやすいので、jsと英語にアレルギーがなかったらみてみると良いと思う。