Activity肥大化問題
Androidアプリケーション開発でユーザーインタフェースを構築する場合、その中心的な役割を担うのがActivityです。画面の描画や、ユーザーからの操作を受け付けるなど多様な処理を実装できます。具体的にはActivityクラスのサブクラスや、定義ファイルに記述します。これらをまとめ、ユーザーインタフェースを稼働できる仕組み全体を「Activity」と呼ぶこともあります。
ところで、気付くとActivityが肥大化し過ぎてしまっていた経験はありませんか? Androidアプリケーション開発エンジニアであれば、一度はその経験があるのではないでしょうか。Activityクラスにいろいろな処理が記述された結果、何千行ものコードになり、バグが多い上に保守が困難、といった問題がAndroidアプリケーション開発では起こりがちです。今回はこのActivity肥大化問題を解決するデザインパターンを提示します。
デザインパターンとは
そもそもデザインパターンとは何でしょうか? デザインパターンとは簡単にいえば「よく起こる問題と、その問題に対する良い解決策」です。有名なデザインパターンにGoFのデザインパターンがあります。オブジェクト指向で再利用性の高い設計を行うためのパターンを23個提示しています。例えばObserverパターンは「オブジェクト間の通知を実現しようとすると設計が煩雑になる」問題に対する「良い解決策」を提示しています。
デザインパターンを利用することにより得られるメリットは、大きく分けて2つあります。1つ目は、問題に対して解決する方法を自分で考える必要がないということです。Observerパターンの例だと、パターンを知らなければオブジェクト間の通知について、拡張性・保守性の高い設計をどうすれば実現できるのか悩むことになります。悩んだ挙げ句、イマイチな設計をしてしまうかもしれません。しかしパターンを知っていれば、他の方がすでに悩んで出した「良い解決策」を活用することができます。労力をかけずに良い実装ができるようになるのは大きなメリットです。
2つ目のメリットが、設計・実装の意図を開発メンバー間で共有しやすいということです。開発メンバーが共通で知っているデザインパターンが利用されていれば、なぜその設計・実装になっているのかについて詳細を話す必要がなくなります。「この部分はオブジェクト間の通信を実装しているからObserverパターンが使われているな」ということが分かると、設計・実装の意図が理解しやすくなります。
デザインパターンを活用すれば、よく起こる問題に対して良い解決を効率的に行うことができるようになるのです。
Activity肥大化問題に対するデザインパターン作成のプロセス
GoFのデザインパターンは帰納的に作成されました。問題に対して検討を重ね、演繹的に1つの解決策を導き出したのではなく、数多くのソフトウェアを調査し、共通する「良い設計」をパターンとしてまとめたのです。AndroidアプリケーションのActivity肥大化問題に対するデザインパターンを作成するにあたっても、同じアプローチを取りました。つまり、複数のAndroidアプリケーションのソースコードを解析し、その中からActivity肥大化問題を解決する良い設計を抽出します。それらの結果を元にしてパターンを探し出したのです。
まず、解析対象のAndroidアプリケーションをピックアップしました。アプリケーション開発として成功しており、かつ拡張性・保守性の高いAndroidアプリケーションを解析対象としたかったため、以下の2点を解析対象の条件としました。
- GooglePlayにアプリが公開されており、1万回以上ダウンロードされている(多くの人に使われている=アプリケーション開発として成功している、と考えました)
- 1年以上開発が継続している(長期で開発が継続している=拡張性・保守性の高いソースコードになっている可能性が高い、と考えました)
ピックアップにあたっては以下のサイトを利用しました。
こちらのサイトを利用すると、GooglePlayにアプリケーションが公開されており、かつソースコードも公開されているアプリを探すことができます。掲載されているアプリの数も非常に多いです。
選ぶにあたり、なるべくアプリケーションのジャンルが偏らないようにしました。ツールやSNS、ゲームなど、さまざまなジャンルのアプリケーションをピックアップしています。具体的には、表1のアプリケーションを解析対象としました。
No | アプリ名 | ソースコード | アプリ概要 |
---|---|---|---|
1 | K-9 Mail | https://github.com/k9mail/k-9 | メールクライアント |
2 | Cool Reader | https://sourceforge.net/p/crengine/crengine/ci/master/tree/ | 電子書籍リーダー |
3 | Offline Calendar | https://github.com/SufficientlySecure/offline-calendar | カレンダー |
4 | Droid Weight | https://github.com/yashima/droidweight | 体重管理 |
5 | DiskUsage | https://github.com/IvanVolosyuk/diskusage | ディスク使用状況管理 |
6 | kitchen timer | https://code.google.com/p/kitchentimer/source/checkout | キッチンタイマー |
7 | Open Camera | https://sourceforge.net/p/opencamera/code/ci/master/tree/ | カメラ |
8 | Calculator | https://github.com/Xlythe/Calculator | 電卓 |
9 | SlimSocial for Facebook | https://github.com/rignaneseleo/SlimSocial-for-Facebook | Facebookクライアント |
10 | Frozen Bubble | https://github.com/videogameboy76/frozenbubbleandroid | シューティングゲーム |
余談になりますが、どのアプリもユーザー評価が非常に高かったです。全てのアプリが4.0を超えており、4.5を超えているアプリも多数でした。ユーザー評価が高いことからも、これらのアプリはAndroidアプリ開発として成功した事例であると考えて間違いなさそうです。