Jetpack Compose でのクリーンアーキテクチャに関する Android 開発

皆さん、こんにちは。この投稿では、私が構築したクリーンアーキテクチャに基づいた Android アプリケーションのソースコードを共有したいと思います。

![Jetpack Compose](https://samyoney.github.io/static/images/clean/jetpack-card.png)

このソースコードは個人の GitHub に公開しています：[GitHub](https://github.com/samyoney)。

MVVM、MVC、MVP、TCA などのモデルを使用してモバイルアプリケーションの開発を行ってきましたが、MVVM がテストしやすく、維持管理が容易なため、最も実用性が高いと感じました。最も重要なのは、`use case` の概念があり、`user story` から分離して基本設計のドキュメントを作成できることです。

## Jetpack Compose とは？そしてなぜ使うべきか？

Jetpack Compose は、Google が開発した Android 向けのモダンな UI（ユーザーインターフェース）ツールキットで、柔軟かつ容易にユーザーインターフェースを作成できます。Kotlin で記述されており、XML などの従来の方法ではなく、コンポーザブル関数を通じてインターフェースを構築します。

### 利点:

- **開発の迅速化**: コードの記述と保守にかかる時間を短縮。
- **より良いユーザーインターフェースのインタラクション**: 複雑なエフェクトやトランジションを簡単に作成可能。
- **拡張性**: 既存のコードに大きな影響を与えることなく、新しい機能の追加や UI の変更が容易。

## なぜクリーンアーキテクチャを使うべきか？

クリーンアーキテクチャは多くの利点をもたらします。以下に簡単にまとめます:

1. **保守性の向上**: 簡単に保守および更新可能。
2. **拡張性の向上**: システムの他の部分に影響を与えることなく、新しい機能を簡単に追加。
3. **テスト容易性の向上**: コンポーネントが分離されているため、テストが容易。
4. **依存関係の削減**: クラス間の依存関係が少なく、管理が容易。
5. **コアビジネスロジックに集中**: ビジネスロジックと UI コンポーネントの間に明確な分離がある。

## クリーンアーキテクチャの主な構造

1. **エンティティ**: アプリケーションのビジネスオブジェクトとルールを定義。
2. **ユースケース**: ビジネスロジックを含み、データの処理と保存方法を決定。
3. **インターフェースアダプター**: ビジネスロジック層とフレームワーク層間のデータを変換。
4. **フレームワーク**: UI、データベース、および外部サービスなどの特定のフレームワークコンポーネントを含む。

クリーンアーキテクチャは、柔軟で保守しやすく、テストが容易なアプリケーションを作成し、現在のシステムの運用を中断せずに変更や開発をサポートします。

## ソースコードの概要

私は MVP アプリケーションを、最もシンプルな機能で構築しましたが、このシンプルさが、初心者にとっては理解しやすいものになっていると信じています。可能であれば、最新の Android Studio バージョンと最低 Java バージョン 1.8 を使用してください。

## 画面フローの図

```md
+-----------+        +-----------+        +------------+
|           |        |           |        |            |
|  Splash   | ------>|   Login   | ------>|    Main    |
|  Screen   |        |   Flow    |        |    Flow    |
|           |        |           |        |            |
+-----------+        +-----------+        +------------+
```

## スクリーンショット

以下は、さまざまなモードの Android アプリのスクリーンショットです。
<table>
  <tr>
    <td align="center">
      <img src="https://samyoney.github.io/static/images/clean/splash-android.png" alt="スプラッシュ画面" width="300"/>
      **スプラッシュ画面**
    </td>
    <td align="center">
      <img src="https://samyoney.github.io/static/images/clean/login-android.png" alt="ログイン画面" width="300"/>
      **ログイン画面**
    </td>
    <td align="center">
      <img src="https://samyoney.github.io/static/images/clean/register-android.png" alt="登録画面" width="300"/>
      **登録画面**
    </td>
  </tr>
  <tr>
    <td align="center">
      <img src="https://samyoney.github.io/static/images/clean/course-android.png" alt="コース画面" width="300"/>
      **コース画面**
    </td>
    <td align="center">
      <img src="https://samyoney.github.io/static/images/clean/student-android.png" alt="学生画面" width="300"/>
      **学生画面**
    </td>
  </tr>
</table>

*Android*

## アプリの構造

アプリの構造は、主に以下の 3 つの部分に分かれています:

- **アプリ**: ビュー、アクティビティ、ビューモデル、ビジネスロジックの処理などの UI を含む。
- **buildSrc**: 依存関係、ライブラリ、およびバージョン管理を担当する層。
- **フレームワーク**: 共通処理を含む層。

## アプリ

- **コンポーネント**: 共通ビューを含む。
- **コントローラー**: 共通処理。
- **テーマ**: スタイルを管理。
- **データ**: リポジトリ、API、データベース、ユースケースなど、アプリ全体のデータを管理。
- **プレゼンテーション**: 画面。
- **プロバイダー**: リソースへのアクセスを提供し、ナビゲーションを管理。

## buildSrc

アプリのすべての依存関係、バージョン、およびバージョン管理を担当。

## フレームワーク

共通処理を管理:
- **ベース**: ビューモデルと状態の共通ベース。
- **キャッシュ**: ビュー間でデータを移動する際に使用することを推奨。
- **エクステンション**: 共通のエクステンション処理。
- **プレフ**: 共有プリファレンスの処理。
- **ルーム**: データベースの処理。

## 結論

このソースコードを気に入っていただけると幸いです。フィードバックや提案があれば、GitHub で問題を開いていただくか、[LinkedIn](https://www.linkedin.com/in/sam-nguyen-204876192/) でご連絡ください。

## 完全なプロジェクト

以下のリンクからプロジェクトのソースコードにアクセスできます: [GitHub](https://github.com/samyoney/compose_clean_base).

## ライセンス

[MIT](https://github.com/samyoney/compose_clean_base/blob/develop/LICENSE) © [Yoneyama SAM](https://samyoney.github.io/)

---