Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DroidKaigi 2024 たすけて!ViewModel

mhidaka
September 12, 2024

DroidKaigi 2024 たすけて!ViewModel

Composeを使いたい、最新のアプリ設計を学びたい、チームで開発に集中したい、そんな人のためのアーキテクチャ解説セッションです。
モダンなUIフレームワークComposeとViewModelを組み合わせたCompose時代に最適な設計ノウハウをお伝えします。

Androidアプリ開発者なら誰もがViewModelの設や実装方針に迷った経験があるはずです。初めて触れるとき、チーム開発で設計方針をディスカッションするときなどViewModelが議論の中心にいることも少なくありません。本セッションではFull-Composeなアプリの開発実務やコミュニティから集めた疑問や知見を元に絶対押さえておくべきプラクティスを紹介します。

特に陥りやすい次の状況を解決することを目的に新時代のスタンダードを提示します。

- 慣れていないため「これはどうやってハンドリングするのがベストプラクティスなんだろう?」と迷んでしまう状況
- 試行錯誤で「この実装で良いとおもったけど後から考えるとこっちのほうがよかったな」などのやりがちな失敗

例示するソースコードはGoogleのComposeサンプルから取り込みコードベースでの理解を促進し、後半では高難易度なUI仕様、ビジネス要件、複数のViewModelといったアプリが持つ複雑性との付き合い方・考え方までサポートします。これらを通じて公式ガイドラインを読むだけでは得られないノウハウ、推奨アーキテクチャの解釈など設計に必要な視点を提供します。

セッションで予定している内容(変更する可能性があります)

- ViewModelの責務とアプリ設計の基本
- ViewModelとUI Viewの責務を分割する基準
- ViewModelとUIの初期化を理解する
- Compose時代のUIStateとロジック
- ViewModelにおけるエラーハンドリングとビジネスロジック
- ViewModelのテスト戦略

mhidaka

September 12, 2024
Tweet

More Decks by mhidaka

Other Decks in Technology

Transcript

  1. アプリ設計の基本 • 今ならCompose-awareなアプリ設計がおすすめ ◦ 宣言的UI、リアクティブなデータフロー • ViewModelの責務とは ◦ 広義にはモデルをUIの形に変換すること ◦

    狭義にはAndroidのViewModelクラスの役割 ◦ ただし、これ自体が重要ではなく設計を表現する容れ物 使いこなすためにAndroidの専門知識が必要という現状がある • ViewModelだけでなく全体の設計方針が必要
  2. ViewModelと UI Viewの責務を 分割する基準 Criteria for dividing ViewModel and UI

    View responsibilities • 単方向データフローの原則 • 制御の反転 • UIとの境界を規定する 7
  3. 単方向データフローの原則 9 ViewModel Compose UI UI State UI Event •

    下方に状態が流れ、上方にイベントが流れる設計 パターン • 状態やイベントの流れる方向は変わらず双方向と しないことが特徴 • Compose UIとViewModelを繋ぐルール
  4. 初期化の戦略 UI表示に必要なデータを作りたい Flowを使ったデータストリームで実行 UsecaseやRepository、DataStore、 Usecase等の外部コンポーネントの生成 ViewModel内部で生成せず、DIするか引数として処理 ViewModelで使うだけのテスト不要な外部コ ンポーネントの生成 init初期化ブロックで実行。ただし、真にテスト不要かは、独 立性が高いかは要確認

    ViewModelクラス内部で必要な初期化 init初期化ブロックが適しているのは ViewModel に与えられ る引数に応じて状態が変わる、クラスの複数プロパティに影 響があるなど 初期化で非同期処理(コルーチン)が存在し ている・非同期処理内でオブジェクトを生成し たい 非同期処理を使うとViewModelが完全に初期化される前に アクセスされる可能性も。初期化途中のエラーはタイミング に依存し発見しにくく判断も困難
  5. Compose時代の UI Stateとロジック UI State and logic in the Compose

    era • イケてるUI State • Composeフレンドリーな利用 26
  6. ViewModelにおける エラーハンドリングとビ ジネスロジック Error handling and business logic in ViewModel

    • 多様なエラー • 複数のエラーを扱う • エラーをUI Stateとして扱う • UIロジックとエラー 33