実装のバリエーションを増やすために(続)

rnitame.hatenablog.com

ライセンスページとか build.gradle 見てバリエーション増やしたいねって話を書いたがそれの続編。 変わらず Android を例にしている。

最近

日々 GitHub のトレンド眺めながら使えそうなものとか参考になりそうなものに star をつけていて、以前 star をつけていたライブラリを実戦投入する機会があった。 README とか wiki を見ながら導入はできたのだが、ライブラリが推している範囲を超えて機能を実装しようとしたときに手が止まってしまうことがあった。

そんなときに mizchi さんのとあるツイートを見た。

もう、俺じゃん!!!!!って気持ちでしかなかった (´・∀・`)

じゃあどうする?

ってなったとき、OSS を使えるようになることはそれはそれで良いと思うけれども、ちゃんと OSS のコードも読んで中で何をしているかを理解するといいと思った。 例えばこのライブラリ。

github.com

Epoxy is an Android library for building complex screens in a RecyclerView

とあるとおり、Epoxy は RecyclerView で複雑な画面を作るためのライブラリ。 Basic Usage を見ると、

f:id:rnitame:20171211103007p:plain

EpoxyModel と EpoxyController の 2 つがメインのコンポーネントらしい。 なので、EpoxyModel と EpoxyController のコードを読んでみる。

GitHub で読むのつらいし Android Studio も重いので clone したらコードジャンプと検索だけができるエディタが勝手に立ち上がってほしい

EpoxyModel

epoxy/EpoxyModel.java at master · airbnb/epoxy · GitHub

EpoxyModel は ViewType ごとのレイアウトを決める要素。っぽい。 EpoxyModel を管理するために使う id を生成するメソッドがあったり、後述の EpoxyController に対して EpoxyModel を追加するための addTo メソッドがあったり。EpoxyAdapter を使って作る場合は bind を使うのかな?

EpoxyController

epoxy/EpoxyController.java at master · airbnb/epoxy · GitHub

EpoxyModel で決定した要素に対してデータをあてて表示するために使うもの。 add で Controller に Model を追加して、requestBuildModel で追加した Model に対してデータあてたりしてる?っぽい。addInterceptor は OkHttp の Interceptor みたいな感じなんだろうか。

といった感じで理解が進む。 コードを読み進めるとどういった条件で Exception を投げているかもわかるので、そこから粗方使い方が想像できるし、テストが書かれていれば(ほとんどのライブラリで書かれていると思うので)それを見て使い方を確認することもできる。

Android 特有の書き方を深く学ぶために

冒頭に貼った記事を書いたときに比べ、ライブラリのコードを読むようになったが、Android 特有の書き方に関しても知らないことが増えてきたのでおさらいしている。 今見ているのは公式のトレーニングページ。

developer.android.com

…の横にあるこれ。

f:id:rnitame:20171211170859p:plain

(いつのまに Best Practices for ... とかできてたの…) これを見てみると、

Build a Responsive UI with ConstraintLayout | Android Developers

ConstraintLayout を使ってレスポンシブな UI を作るために、ConstraintLayout の導入方法が説明されていたり、

developer.android.com

ANR を避けるために気をつけることが説明されていたりする。100〜200ms を超えるとユーザーは遅いと感じるらしい。すごいためになることがたくさん載っている。

まとめ

ライブラリの内部実装読もうねって話と、基本に立ち返って公式のページを見てみるのもありかもって話をした。 Android、完璧に理解できるようにがんばりたい。