Konifar's ZATSU

私はのび太の味方じゃないわ、悪の敵よ

Androidでよくあるめんどくささ

最近Androidを楽に開発するためにはどういうクラス構造にすればいいかを考えている。

巷にはMVP、MVVM、MVC、REDUXなど様々な設計が溢れているが、サンプルコードを見てもなかなかイメージがつきにくい。理由はサンプルが簡単すぎるからだ。シンプルなTODOアプリではメリットよりコード量の増加や見通しの悪さといったデメリットの方が目についてしまい、どうしても『なぜ』その設計や構造が必要なのかを理解しにくい。理解できても1週間後には忘れている。

Android開発においてなぜ設計が議論されるかと立ち返ってみると、考えることを少しでも減らしたいからだと言える。わかりやすいところで言えば、複雑なライフサイクル、画面回転を考慮したデータのロードにエラーハンドリング、その状態に応じた画面表示あたり。Androidの開発をする上で、考慮しなければいけない事象はバージョンアップのたびに増しており、それをいちいち個々人で考えていては開発のスピードも品質も落ちてしまう。

設計は、それら多くの考えなければならないことを減らすためにある。指針を決めてそれに沿って開発することで、イニシャルコストは増えるがその後はあまり考えなくて済む。interfaceやパッケージスコープなどJavaの言語仕様で実装を強制することでミスを減らすこともできる。

逆に言えば、Android開発の現場において何が面倒くさいかを吐き出しておけば、その設計で何が楽になるのかがイメージしやすい。単純なTODOでは役不足。どんなケースがあるのか雑にメモしておこうと思う。

  1. 一覧のロード中に画面の向きが変更された時にそのままロードと表示させたい。
  2. 一覧のロード中に画面が閉じられた時にロードを中止したい。
  3. 一覧でいいねを押してからタップして詳細を開いた。
  4. 一覧でロードエラーが発生した時にリトライしたい。
  5. オフライン状態で一覧画面を開いた。
  6. 一覧のデータが0件の時は大きなレクタングル広告を表示、1件以上の時はフッタにバナー広告を表示したい。
  7. 一覧の上部に特集一覧を表示する時、2つのロードをいい感じにしたい。
  8. 一覧の2つ目と8つ目にネイティブ広告を表示したい。表示の速度も考慮してプリロードもしておきたい。
  9. メッセージ画面でメッセージを送信する時、リクエストが成功する前に画面に表示させたい。
  10. メッセージ画面でメッセージを送信失敗した時、リトライしたい。
  11. 低ネットワーク環境下では低画質の画像を表示したい。
  12. wi-fiにつないでいる場合のみ、プリロードして表示を高速化したい。

たぶんもっといっぱいあるけどこのへんで。