CleanArchitecture要素のMVVMサンプル作った
サンプル 出来上がったサンプル(GitHub) アーキテクチャ図 動機 現場のプロダクトで、内部品質を高めるために定期的なリファクタリング習慣を取り入れて行きたく、リファクタリング計画を作るにあたり、目標とするアーキテクチャをはっきりさせたかった。 アーキテクチャサンプルの概要 CleanArchitecture の考え方を一部取り入れた MVVM です。構成は以下のようなレイヤーのマルチモジュール構成になっています。マルチモジュールにしている理由は依存性をシステム的に制御して人為的なミスによる間違った依存関係を生むのを減らすためです。 モジュール構成と主要ライブラリ app UI、バックグラウンド系のAndroidコンポーネントを持つモジュール 画面遷移: [Navigation Component](https://developer.android.com/guide/navigation?hl=ja) 画像取得: Coil domain ビジネスロジックを持つモジュール ViewModel、LifeCycleのための androidx.lifecycle系 repository データアクセスを持つモジュール Coroutine DB: Room HTTP通信: Retrofit2 JsonParser: Kotshi di DI機能を持つモジュール DI: Koin testlib テスト系の共通クラスを持つモジュール JUnit5: JUnit5 Mock: mockk 以下に、どのようにして上図のようになったかを解説します。(ライブラリはKotlinの言語仕様に合わせて簡単に書けるものやパフォーマンスが良いものを選んでいるつもりです。) アーキテクチャの方針 目指すところとしては、変更しやすいアーキテクチャを目指したいので、変更に特化した考え方の Clean Architecture を参考に考えます。 CleanArchitectureの基本的な考え方の1つである「関心事の分離」により、コンポーネント間、レイヤー間を切り離しを容易にすることで、柔軟性を上げます。関心事の分離の観点は以下の5つで フレームワーク非依存:システムをフレームワークに縛るのではなく、フレームワークをツールとして使う。 テスト可能:ビジネスロジックはUI、DB、外部IFなどがなくてもテストできる。 UI非依存:UIはシステムの他の部分を変更せずとも簡単に変更できる。(例えばビジネスロジック) データベース非依存:例えばOracleをMySQLに簡単に置き換えることができる。 外部エージェント非依存:ビジネスロジックは外部IFの世界を知らなくて良い。 これらを実現するために ソースコードの依存性は上位レベルの方針にだけ向かっていなければならない …