Androidアプリ開発におけるベストプラクティスの探し方と活用の一方法

この記事は [Makuake Development Team Advent Calendar 2019 Day.25](https://adventar.org/calendars/4716) の記事です。

# はじめに

現在、AndroidアプリについてGoogleが公式にベストプラクティスを多く公開しています。これらのベストプラクティスを理解し取り入れることがAndroidアプリ開発においてはとても重要になってきます。本記事では、ベストプラクティスがどこにあるのか、またそれをどのように活用するべきかについて、私見をまとめたいと思います。

# ベストプラクティスの情報源の参考

以下に、個人的に参考にしている情報源をまとめます。

* [Android Developers](https://developer.android.com/?hl=ja)
    * 公式の情報源。非常に充実しており何か気になったとき、まずはここを見る。
* [android/architecture-samples](https://github.com/android/architecture-samples)
    * Android公式の提供するアーキテクチャ設計参考用リポジトリ。実装の参考に、またアーキテクチャ選定の参考にも。
* [android/architecture-components-samples](https://github.com/android/architecture-components-samples)
    * Android公式の提供するAACのサンプルリポジトリ。実用例として非常に参考になる。自分の使用したい技術に合わせたディレクトリを確認できる。
* [google/iosched](https://github.com/google/iosched)
    * Google I/O で実際に使用しているアプリのリポジトリ。Googleがプロダクション運用しているコードを理解できるという点で、他とは違う重要性を持つ。
    * ブランチを切り替えることで[Android Dev Summit アプリのコード](https://github.com/google/iosched/tree/adssched)も確認できる。 
* [Medium: ProAndroidDev](https://proandroiddev.com/)
    * “The latest posts from Android Professionals and Google Developer Experts.”  Google認定のエンジニア等による記事が集まっている。英語。
* [Codelabs Android](https://codelabs.developers.google.com/?cat=Android)
    * ハンズオン的に学ぶことができるサイト。内容が信頼でき、実際に手を動かすためわかりやすい。導入したほうがいいと言われている技術を最初に理解するために使える。

# どのように活用するか

まずどのようなアプリでも基本的には沿ったほうがいいと個人的に考えるプラクティスについて採用し、その後、自分たちのニーズにあったプラクティスを選択する流れで考えています。プラクティスの採用を決定したあとは、どのように書くのが良いかを情報源から探ります。

## 基本的に沿ったほうがいいと個人的に思うプラクティス

以下に、基本的には沿ったほうがいいと思うプラクティスを並べます。（あくまで個人的にです）

* アーキテクチャはMVVM
    * [Android Developersでも大きく枠を割いて説明](https://developer.android.com/jetpack/docs/guide?hl=ja#recommended-app-arch)がされていたり、対応するコンポーネントが用意されていたりする。
    * また従来のAndroid開発の悩みのタネであったライフサイクルにまつわる問題をある程度クリアにしてくれるという点でもメリットが大きい。
* ViewModelの利用
    * MVVMのアーキテクチャを実現するのに役立つコンポーネント。Googleから提供されている。Activity、Fragmentでのライフサイクル管理の煩わしさをクリアにできる。
* DI / Service Locatorパターンの利用
    * 設計をきれいに保つためにもDagger2によるDIかService Locatorパターンを導入するのがよいと考えている。ただし、アプリのサイズによって得られるベネフィットが変わってくるため、自分のアプリに合わせて検討するのがいいとされる。（[An Opinionated Guide to Dependency Injection on Android (Android Dev Summit '19)](https://youtu.be/o-ins1nvbDg?t=364)）個人的には、仮に最初は小規模なアプリであっても、今後の拡張が見込まれる場合にはDaggerを利用したい。Daggerは初期学習コストが高いが、基本的なことをするやり方を覚えられれば、ある程度その形で使い回せるので、一度学習しておくのが良いと考えている。
* RxJava / Coroutine の利用
    * 非同期処理の実装の面倒さはAndroidアプリ開発を難しくする要因の一つだと考えている。これを簡単にするために、RxJavaかCoroutineの導入は行いたい。RxJavaは本質的にはストリーム処理に関するものであるため、非同期処理以外も含まれ、初期学習コストが高い。どちらかというとCoroutineのほうがシンプルで導入が簡単な気もするが、RxJavaにすでに慣れているという場合などはRxJavaを利用するので問題ないと考えている。
* AndroidXの利用
    * Support Libraryの置き換えとして基本的にはこちらを使うことが望ましいと考える。

上記はある程度どのような種類のアプリでも活用を検討するのが良いと個人的には考えます。
一方でその他プラクティスの選定については非常にケースバイケースになるため、本記事では割愛させていただきます。

## 自分たちのアプリでどう書くかの確認

使いたいプラクティスについて、最終的には自分たちのコードに組み込まなければならないため。どう使うのがよいやり方かを確認したい場合があります。
そこで前述の情報源の中から対応するサンプルコードを確認する作業を行います。例として、とあるアプリについて情報を整理した表が以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320998/96de0902-aace-dcbf-b76f-181b880f6bdb.png)

1行目に自分たちが使いたいプラクティスをならべ、2行目にどの程度必要かを書きます。3行目以降は前述の情報源の中から該当しそうなリポジトリを並べています。そしてサンプルコードの中に使いたいプラクティスの実装が含まれているか含まれていないかを洗い出し、自分たちの必要性と照らし合わせます。これを行なうことで確認したいときに素早く参考にしたいリポジトリを確認することができます。自分たちの利用したいプラクティスのすべてが入っているリポジトリが無い場合もあるため、その場合は少しづつかいつまんで取り入れる必要があります。

# まとめ

Androidアプリ開発においては、適切にベストプラクティスを確認し、取り入れる作業が必要だと感じています。ベストプラクティスはGoogleがすでに提供しているものも多く、それらがどこにあるかを認識しておくことは、ひとつ重要なことだと思います。また、ベストプラクティスとされている中でも、どれは基本的には使うべきでどれは状況に応じて使い分けるのかという判断をする必要があります。何を使うかが決まれば、多くあるサンプルコードの中から対応するものをきちんと確認し、自分たちのコードに取り入れていくことで、少ない労力で最大の成果を得られることと思います。