4日間にわたる開発と動作確認を無事完了しました。今回作り上げたこのアプリは、今やモダンなAndroidアプリ開発の必須技術をすべて網羅した、素晴らしいポートフォリオであり、今後の開発のための完璧な「雛形」であると確信しています。
その集大成として、現在のソースコード全体の構成がどうなっているのか、クラス図とフローチャートを使って解説します。
1. 全体構成:モダンAndroidアプリの「黄金パターン」
本アプリは、Googleが推奨するMVVMアーキテクチャをベースに、クリーンアーキテクチャの思想を取り入れた、非常に美しく堅牢な構成を採用しています。
層(レイヤー)の役割分担:
- UI層 (青): ユーザーが見て、触れる部分です。Jetpack Composeで構成しています。
- ViewModel層 (緑): UIからの指示を受け取り、ビジネスロジックを実行する「頭脳」として機能します。
- データ層 (オレンジ): データの管理(取得、保存、同期)にすべての責任を持つ「心臓部」です。
- Repository: データ層の唯一の窓口です。ローカルDBとAPIのどちらと通信するかなどを判断する「司令塔」の役割を果たします。
- データソース: 実際のデータを保持する場所です。Room(ローカルDB)とRetrofit/ApiService(リモートAPI)の2つを用意しています。
2. クラス図:部品同士のつながり
以下のクラス図は、アプリを構成する主要な部品(クラス)が、どのように依存し合っているかを示しています。矢印の向きは「→が、←を必要としている(依存している)」という意味です。
図の解説:
- 一方通行の流れ: UI → ViewModel → Repository → データソースという、一方向の綺麗な依存関係ができています。これにより、データソースの変更がUIに直接影響を与えることがなく、非常に変更に強い構造になっています。
-
Hiltの役割: この複雑な依存関係を、**Hilt(DIコンテナ)**がすべて裏側で自動的に解決してくれています。例えば、
MemoListScreenがhiltViewModel()を呼ぶだけで、HiltがMemoListViewModel→MemoRepository→MemoDao&ApiService...と、必要な部品をすべて遡って組み立て、完成品を渡してくれます。
3. フローチャート:アプリ起動からメモ表示までのデータの流れ
このフローチャートは、ユーザーがアプリを起動してから、自分のメモが表示されるまでのデータの動的な流れを示しています。これは、私が実装したSSOT (Single Source of Truth) パターンが、どのように機能しているかを表しています。
フローの解説:
-
起動と認証:
SplashScreenがUserRepositoryを通じてDataStoreをチェックし、ログイン済みならMemoListScreenへ遷移します。 -
即時表示 (オフラインファースト):
MemoListScreenは、まずローカルのRoom DBにあるデータを即座に表示します。これにより、ユーザーは通信を待つことなく、すぐにアプリを使い始めることができます。 -
バックグラウンド同期: 画面が表示された後、
MemoListViewModelはMemoRepositoryに「裏側でサーバーと同期しておいて」と依頼します(refreshMemos())。 -
自動更新 (SSOT):
RepositoryがAPIから取得した最新データでRoom DBを上書きすると、UIはRoom DBの変更を検知して、自動的に画面を最新の状態に再描画します。
この流れこそが、オフラインの快適さとオンラインでのデータ同期を両立させる、モダンなアプリの核心的な仕組みです。この非常に高度で実践的なアーキテクチャを、4日間で見事に作り上げることができました。