初めてのアンドロイドアプリ開発振り返り

公開日: : 最終更新日:2014/01/26 Android ,

始めてのアンドロイドアプリ開発が落ち着きをみせてきた。まだ熱が冷めないうちに簡単に振り返っておく。

  1. model クラスに android 固有のクラスが含まれてしまった
  2. Controller(Activity クラス)と View の境界が曖昧になってしまった
  3. AsyncTask を継承した非同期処理を行うクラスには画面に関する要素を持ち込まない
  4. やっぱり単体テストはあったほうがいい
  5. テスト仕様書は面倒でも作成する

model クラスに android 固有のクラスが含まれてしまった

単純な仕様が多かったので、JUnit を使った単体テストは書かない方針でスタート。

とはいえ、仕様を確認する意味でも単体テストを書きたい場面がポツポツとあって、テストケースの作成を試みるのだが、android 固有のライブラリをガチガチに使っているクラスなので、テストケースが実行出来ないってことが多々あった。

(設定などに不備があって実行出来ないだけなのかもしれないが)これまでの開発経験を元に考えると model クラスには android 固有のライブラリを持ち込まないほうがいい。

android 固有のライブラリが必要な場合は、そのライブラリを扱うクラスを介して行う。直接そのライブラリには関与しない。
こうしておけば、テストケース内はモックで差し替えが効くのでライブラリに依存しなくなる。
データベースへのアクセスを行う DAO クラスをテストではモックに差し替えるイメージ。

手間が増えるのでイヤがるメンバーがいるかもしれないが、こんな感じで作ればいいんだよ的な実例を見せれば理解してもらえるかもしれない。どうせ否定的なメンバーは単体テストを書かないから、コピペで済ませられるぐらいの手間だけだよ、を見せればいい。

Controller(Activity クラス)と View の境界が曖昧になってしまった

MVC 的なことを開発当初は意識していたが、だんだんと気にしなくなってしまった。特に V と C。言い訳だがこんな背景があった。

  • 会社も開発メンバーもアンドロイドアプリ開発が始めてだった
  • 開発メンバーのスキルに差があった
  • 納期が厳しくて「そんなことより今は動くことが優先!」になった

正直なところ、落ち着いてきた今も V と C の境界は曖昧なままだ。コードを分散すると、onClickListener の実装などで「無名クラス」を使ってさらっと済ませられなくなる。「逆に面倒が増えるだけでは?」っとも思っている。
まだ自分の中で正解が出ていないので、ひとまず思っていることをメモしておく。

  • ProgressDialog の表示・非表示程度は Activity クラスに書いていいだろう
  • 例えば、データベースから取得した値を Spinner にセットする、みたいなことは View がいいだろう
    • Spinner をラップしたクラスを作って、設定するデータとイベント処理するクラスをコンストラクタなどでもらうようにすれば汎用的に使えそう
  • Activity クラスのスーパークラスを作成し、そこに Spinner や EditText などの共通処理を書いたが、これは分割して View にするべきだった
  • Activity クラスのスーパークラスには画面遷移や Intent などの処理に特化すべきだった

AsyncTask を継承した非同期処理を行うクラスには画面に関する要素を持ち込まない

WebAPI を叩くとか画像をダウンロードするといった処理は AsyncTask を継承したクラスで行うが、当初次のような処理をこのクラスがやっていた。

  • ProgressDialog の表示・非表示
  • 画面に表示されているボタンや EditText を操作出来なくする
  • Toast を使ってメッセージを表示する

AsyncTask から次の AsyncTask を呼ばなければならない部分があって「あっ、コレじゃダメだ」と気が付いた。

考えた挙句、Activity クラスに callback メソッドを持たせて AsyncTask から呼んでもらうことにした。

  • Activity#callbackSuccess → 非同期処理が成功したら AsyncTask#onPostExecute から呼んでもらう
  • Activity#callbackFailure → 非同期処理が失敗したら AsyncTask#onPostExecute から呼んでもらう

各 callback メソッドで上に挙げたような処理をやることで、AsyncTask を継承した非同期処理を行うクラスは画面に関することから解放される。

もっとスマートな実装方法があるんだろうけど、ひとまずコレで必要十分だったし、「あー、気が付けて良かったなぁ」って満足感があった。

やっぱり単体テストはあったほうがいい

動作確認を実機で行うのは手間だ。アンドロイドアプリ開発に限った話ではないが、ビジネスロジックの動作確認は単体テストで確認できたほうが効率がいい。

コアな部分だけでもいいので「壊れていないこと」がサッと確認できるようにしておきたい。

テスト仕様書は面倒でも作成する

ある理由からテスト仕様書は作成せずに、作ったものを短いサイクルでお客さんに動作確認してもらうってスタイルを取ることになった。なので、サッと動作確認はするが、「こういう動作確認はしましたよ」的なテスト仕様書は作成しなかった。

これがカオスの始まりだったんじゃないかと思う。

短納期だったり、ちゃんとした仕様書は無く、そのくせ仕様変更が多々あったりで、お客さんも含めて混乱することがあり一時的にギクシャクしたことがあった。

ドキュメント作成は確かに面倒なのだが、自分たちを守る意味でもやっておかなければならないことだと思う。

経験を積ませるために後輩がリーダーを務めたが、この経験で何かを学んでくれると嬉しい。
あと、特にアドバイスしなくてごめんなさい。

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

no image

WebView からデフォルトブラウザを開く

WebView に表示されているリンクは WebView ではなくデフォルトブラウザで開きたい、とい

記事を読む

icatch-android_6051805616_mini

Android アプリ開発で “Unable to resolve target ‘android-16′” などとエラーメッセージが表示された場合の対処法

"Unable to resolve target 'android-16'" などとエラーメッセー

記事を読む

icach-smartphone_10858946293_mini

Android アプリで “external/chromium/net/disk_cache/stat_hub.cc:216″ とエラーメッセージが表示された場合の対処法

Android アプリ開発中にとある画面を表示しようとしたら "external/chromium/

記事を読む

icatch-finished_6609228299_mini

Android アプリで特定の Activity が呼ばれたらアプリを終了させる方法

とある Activity が呼ばれたらアプリを終了させる方法です。 戻るボタンで戻りすぎることが出

記事を読む

no image

位置情報取得に関する覚え書き、その2

以前、【Androidアプリ開発】位置情報取得に関する覚え書き を書いたが、試行錯誤を続ける中で変更

記事を読む

icatch-thread_11187402315_mini

Android アプリ開発で “cannot perform this action inside of onloadfinished” とエラーメッセージが表示された場面の対処法

現在仕事で Android アプリ開発をやっていて、この "cannot perform this

記事を読む

icatch-bar_7241902618_mini

Android アプリで ActionBar の背景色を変更する方法

Android 3.x 系から追加された ActionBar。 開発中の Android アプリで

記事を読む

no image

Android アプリで Google Analytics へトラッキングするサンプルクラス

お客さまからの要望があって対応。特に難しいことはないのだが、せっかくなので Gist にスニペットを

記事を読む

no image

AlertDialog がキャンセルされたときに処理を行うスニペット

AlertDialog のスニペット。キャンセル時のリスナーを Gist に登録。 new Al

記事を読む

icatch-timezone

Android アプリでタイムゾーンを Asia/Tokyo で現在時刻を取得する

もしかしたら環境だったり、条件があるのかもしれないけど備忘録としてメモ。 Android アプ

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


四 × 3 =

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑