Androidアプリ設計パターン入門を読みました

昨年クラウドファンディングで応援していた「Androidアプリ設計パターン入門」をようやく読み終えたのでその感想です。

peaks.cc (ちなみに上の書籍のリンクから購入すると僕に30%紹介料が入る仕組みなのでよろしくお願いしますw)

各章の感想

1章はイントロダクションとしてAndroidアプリが抱える制約やアプリ設計にまつわる問題やよく使われる定番ライブラリ、開発言語(Kotlin)を取り上げています。

2章,3章はTodoアプリを例にMVPやMVVMパターンで実装するケースを取り上げています。MVPやMVVMのエッセンスを知るにはもってこいの教材だとおもいます。

4章(「差分開発にみる設計アプローチ」)はメルカリアプリが4年間で積み重ねた技術的な負債の話とそれを解消しようとした話ですが他の章と違ってなかなか泥臭い話でうなづかずにはいられない内容でした。 特に「理解を難しくする複雑さを生み出してまでコード量を減らすのであれば、コピペのほうがまだマシ」というのはめちゃくちゃ同意です。 エンジニアたちが良かれと思って考えた設計もビジネス環境の変化による仕様変更・拡張であっという間に開発を阻害する負債になってしまうのはなかなか辛いものがありますがその辺に立ち向かうのもエンジニアの醍醐味かもしれません。

開発をスケーラブルで戦闘力が高いものにするには技術的な負債を解消したり新しい技術的なチャレンジが必要だというのはなかなかマネジメント層には理解されないですが(説得の仕方が悪いだけかもしれないですが)、メルカリさんはそういうのに成功している企業なのかなーと感じました。

あと4.5章のstep by stepの実装がもうちょっと詳しく見たかったです。実は似たような画面(1 Fragment + 複数View)を作った時に結局1つのViewModelに全部入れちゃったのを後悔していまして(^_^;)

5章(「OSSにおける設計者の役割」)はDroidKaigi 2017のアプリ開発を取り上げ、その設計アプローチを解説しています。 OSSのアプリの設計についてここまで詳しく解説してくれるのはありがたいです。設計を決める指針で「開発者が考えることを減らす」というのは本当にその通りだなと思いました。

パッケージの構成も意外と悩みどころですが小規模なら役割ごとに分割し、中・大規模になるにつれて機能ごとにパッケージを切っていく形がよさそうですね。 あとわかりやすくするために階層を深く掘らないほうが良さそうだと感じました。

Navigatorクラスが神クラスになってしまうのはあるあるでした。もし分割するなら機能ごとにNavigatorを分けて、機能をまたぐ画面遷移は親Navigatorみたいなのを作って子のNavigatorにInjectするとかになるんでしょうか..

BaseActivityやBaseFragmentについては(別にActivity, Fragmentに限らずですが)極力作りたくない派ですが現実的に需要があるのでどんな処理ならBaseクラスに入れていいみたいなルールがあるといいですね。AndroidでもAOP流行らないかなぁ...

UseCaseについては個人的には

  • 再利用性がある
  • 複数のステップで構成されている

のいずれかの場合になったらUseCaseに置き換えればいいかなと思っています。

6章(「Fluxアーキテクチャ」)はWeb界隈で提唱されたFluxアーキテクチャAndroidアプリに適用する話です。 これを読んで今更ながら気づいたのはFluxはPresentation層のアーキテクチャでDomain層の話ではないということ。 一方向にデータが流れるので関数呼び出し時の戻り値などはないということ。処理の結果はStoreの状態変更で知ることができるということでしょうか.. 一口にFluxと言っても実装方法にバリエーションがあって個人的にはAACのViewModelとLiveDataとRxJavaを使うパターンがいいかなという感想です。 この辺は最初にチーム内で議論する必要がありそう。

7章(「チームとアーキテクチャ」)はUS版のメルカリをたった3ヶ月でフルスクラッチで書き直した話です。

フルスクラッチで3ヶ月は凄い早いなーと思って読み進めるとReact Nativeを採用することでJavaScriptやReactをよく知るWebエンジニアの力を借りれたのが高速開発の秘訣だったようです。 チーム事情を考えた技術選択って大事だよなーと感じました。またReact NativeとNativeの住み分けの考え方や両者の連携ノウハウが詳しく書いてあって今後の参考になりそう。

ただReact Nativeのアップデートが頻繁で追随していかないといけないのとTarget SDK Versionが23なのが気になりました。 11月までに26になってるとは思いますが(^_^;)

8章(「Android Architecture Components」)はGoogle I/O 2017で紹介されたAndroid Architecture Components(AAC)の紹介とMVVMやFluxアーキテクチャにどのように適用できるかというお話。 AAC便利すぎなので既存のViewModelにも是非入れていきたいです。

ところでAACのLifecycleではアプリがバックグラウンドに回った際に起こるプロセスkillについてはフォローされていません。 その辺についてはSaving UI Statesというページに

  • シンプルなデータはonSaveInstanceState()で保存
  • 複雑でサイズが大きいデータは予め永続化しておいてonSaveInsanceState()ではIDなどのデータの形で保存

というアドバイスが書いてあります。 ただ、永続化やViewModelの復元の仕方などは開発者に丸投げ状態でこの辺もAACでフォローしてくれないかなと思ったりします(^_^;)

まとめ

というわけで普段Androidアプリをいい感じに設計したいとお悩みの方にとっては道しるべになりそうな本というのが僕の感想です。 特にAndroid Frameworkの基礎知識や定番ライブラリ(Databinding, Dagger2, RxJava等)の使い方をある程度理解した上でこれを読めば非常に効果的だと思いました。(そうでない方も設計のエッセンスを学ぶことができます。)

お値段的にも買いやすくなっててありがたいです。会社用にもう1冊買って同僚にも読んでもらおうと思っています。