Android‎ > ‎

ベストプラクティス

Android開発を行う上でのベストプラクティスを考えてみたいと思います。
定期的にぷちぷちと更新される予定です。

以下に書かれていることは永遠に未完成でメモです :P
もし、もっといい方法がある!という場合はコメントに書いていただくか、@vvakame@eaglesakuraまでご意見をお寄せください。

プロジェクト構成

パッケージ構成

  • root
    • android.app.Application を継承したクラス
  • activity
    • android.app.Activity を継承したクラス
  • entity
    • ModelなどのBean的な作りのもの
  • provider
    • ContentProvider
  • view
    • 自前のカスタムView
  • util
    • ユーティリティ系 staticメソッドが大半を占めるクラスとかを置く
こういう感じがいいのかなぁ、と思ってます。SQLiteOpenHelper系はまだどこに置くとよいか決めあぐねてます。
一時期、画面単位でパッケージ切ってみたりしたこともあるのですがどこに何があるか覚えられなかったのでやめました。
Activityをrootに置いた時期もあったんですが、Applicationが探しにくくなったのと、テストを行う時にApplicationのテストを実行してからその他のテストを実行して欲しかったので、(手で順番を設定するのがめんどかったので)こうなりました。

その他

可視性にprivateは利用せずpackage private にする→テスタビリティのため

テストプロジェクト構成

パッケージ構成

通常のプロジェクトと同じパッケージ構成にします。テスト対象クラスのpackage privateの要素を参照できるようにするため。
今、テスト対象プロジェクトとテストプロジェクトがもうホントにプロジェクトとして分かれているので、リファクタリングしたときに片方しか更新されなくて辛いのでなんとかしたいです…。

テストの粒度

Activityのテストはスモークテスト程度 本気で書くと死んじゃうから(受け売り)
テストを書くのが辛かったら抽象化の方法が適切じゃないことを疑うべきっぽい

定形処理

  • アプリケーションで一度だけ確実に行いたい処理はApplicationを継承したクラスで行う。
    • 自前Logクラスの初期化
    • UncaughtExceptionHandlerの設定
      • SDにログ吐いたりなんだり
      • 処理したら Thread.getDefaultUncaughtExceptionHandler() に渡してあげる
  • Logクラスは自前のクラスを作る
    • TAGの部分はアプリ内で全部同じでも困らない気がするのでTAGは固定にする(Applicationから設定)
    • getStackName()とか用意しておいてLog.d()で呼び出し箇所を出力出来るようにしてやると便利
    • アプリのdebuggableがtrueの時だけ全てのログを出力。そうじゃなければwとeとwtfだけ出力。

Comments