- 公開日:2017年02月22日
- 公開日:2017年11月26日
概要
リアクティブプログラミングを日本語で説明した初めての本です。
まだRxjavaの需要は少ないと思いますが、よくぞ出版してくれたと思います。著者と出版社に感謝します。
私はRxjavaを使い始めて1年くらいで、まだ十分に使いこなせていません。
ドキュメントとコードを読みながら四苦八苦してRxjavaを使用していますが、理解が深まればと思って本書を購入しました。
Rxjavaとは
データの通知と取得に特化したプログラミング技法です。スマートフォンアプリの開発において、強力な武器になります。
しかし、リアクティブプログラミングに慣れるには、時間がかかるでしょう。
JavaとScalaの経験があり、オブジェクトプログラミングと関数プログラミングに慣れている技術者でも多くのトライアンドエラーが必要になるでしょう。
サーバーサイドでも利用できますが、必要ないと思います。WEBで使うならフロント側のjavaScriptで導入するべきです。
本書の対象者
丁寧に説明されていますが、リアクティブプログラミングの経験がないと、理解できない可能性が高いと思います。逆に、リアクティブプログラミングの経験がある人には良書です。Rxjavaを使う開発時には、側に置いておきたい本です。索引がとっても使いやすいです。
紙面の都合上仕方のないことですが、Androidのコーディングに関する情報はほとんどありません。あくまでRxjavaの説明です。
気になったこと
指摘する内容は本の問題点というより、リアクティブプログラミングの問題です。
リアクティブプログラミングは素晴らしい技術です。しかし、学習コストが高いのが気になります。
巨人の肩に乗るという格言がありますが、この巨人の肩に乗るにはかなりのプログラミングの経験値が必要になります。
リアクティブプログラミングを理解するにはデザインパターンのObserverパターン、ビルダーパターン、イテレーターパターン等の基本は押さえてるのが前提となります。 また、それなりのスレッドの知識も必要です。Producer-Consumerパターンなどの基本は知っている必要があります。でないと、リアクティブプログラミングの何が優れているか、どこで使うべきかを理解できないでしょう。
上記の知識や技術は、Javaを利用したことのないエンジニアにはわかりづらいと思います。
一方で、リアクティブプログラミングを比較的理解しやすいのは、Java、Scala、JavaScriptに長く関わってきたエンジニアでしょう。理想はこの3つの言語でWEBとアプリ開発の両方を経験したエンジニアです。であれば、理解は早いと思います。
もしくは既存のプログラミング知識のないエンジニアなら、先入観がないので逆に理解が早いかもしれないですね。。。(理解できればですが)
まとめ
リアクティブプログラミングの経験がある人が、知識と技術を深めるのに役立つ本です。Rxjava未経験の人は、購入前に手にとって中身を確認しましょう。さっぱり理解できない場合は、まだ手に取るのは早いです。ただし、良書であるのも事実なので、今後Rxjavaを必ず使うことが決まっているなら、絶版対策として購入した方が良いかもしれません。
追記
リアクティブプログラミングの理解と習得に役立つ本を紹介します。
増補改訂版Java言語で学ぶデザインパターン入門
デザインパターンを学習するならこの本です。リアクティブプログラミングをきちんと理解するならIterator、Observer、Bulderは抑えときましょう。
Java言語で学ぶデザインパターン入門 マルチスレッド編
超良書。結城さんは説明が上手でわかりやすいです。全部目を通しましょう。分厚いけど、10日もあれば読めます。
Java並行処理プログラミング ―その「基盤」と「最新API」を究める―
これは神。スレッドの本で1番良い本です。なかなか手に入らないので、見つけたら速攻買いましょう。
よく利用する実装方法まとめ
随分と扱えるようになってきたので、深く理解するために再度復習中です。せっかくなので、コードを残します。コードはjavaでなくkotlinで記載しています。
1. 流れを理解(確認)するサンプル。
private fun onClickRx() { val flowableOnSubscribe = object : FlowableOnSubscribe<String> { override fun subscribe(emitter: FlowableEmitter<String>) { val datas = mutableListOf<String>("Hello world", "こんにちわ地球のみなさん") for (data in datas) { if (emitter.isCancelled) { Log.d("Reactive2Activity", "emitter.isCancelled"); return } Log.d("Reactive2Activity", data); emitter.onNext(data) } emitter.onComplete() } } val subscriber = object : Subscriber<String> { var tempSubscription : Subscription? = null override fun onComplete() { Log.d("Reactive2 : onComplete ", Thread.currentThread().name); } override fun onNext(t: String?) { Log.d("Reactive2 onNext : ", t + " : " + Thread.currentThread().name); result.text = t tempSubscription?.request(1L) } // 最初 // 購読 override fun onSubscribe(subscription: Subscription?) { Log.d("Reactive2 onSubscribe ", Thread.currentThread().name) tempSubscription = subscription subscription?.request(1L) } override fun onError(t: Throwable?) { t?.printStackTrace() } } // つぎはsbcribe // データはバッファ val flowable = Flowable.create(flowableOnSubscribe, BackpressureStrategy.BUFFER) //flowable.subscribe(subscriber) // emitter flowable.observeOn(AndroidSchedulers.mainThread()).subscribe(subscriber) }
順番は、1. Subscriber#onSubscribe 2. FlowableEmitter#onNext(), 3. FlowableEmitter#onNext() 4. FlowableEmitter#onComplete, 5. Subscriber#onNext() 6.Subscriber#onNext() 7. Subscriber#onComplete()
0 件のコメント:
コメントを投稿