

このプロジェクトは、私の本「Clean Architecture for Android」に記載されているように、Clean Architectureのゆるい実装です。 Kotlinで書かれたネイティブAndroidプロジェクトです。本に示されている重要な原則と、それらが実際の生命プロジェクトにどのように適用されるかを示しています。
このプロジェクトを最新の状態に保ち、それを使用してアーキテクチャの強みを実証するために努力します。サードパーティソリューションの選択に関しては、スケーラビリティ、テスト可能性、柔軟性です。
シンプルさ
「ここで導入された複雑さは過剰です! 」
同意します。これが最終的なプロジェクトであり、新しい機能が追加されない場合、クリーンアーキテクチャはそれについて過度に複雑になるでしょう。しかし、現実には、モバイルプロジェクトが最終的なものではないということです。ユーザーのフィードバック、マーケティング要件、新しいテクノロジー - これらの要因などはすべて、ほぼすべてのプロジェクトに継続的な変更につながります。そして、変化の時が来ると、あまりにも複雑さのように見えるかもしれないものが私たちに報いるでしょう。これは、きれいなアーキテクチャが輝くときになります。
サイドノートとして:ある意味では、さまざまなテクノロジーを導入することで、このプロジェクトを意図的に過度に複雑にしました。目標は、実際のシナリオでさえ、プロジェクトが時間の経過とともに成長して複数の技術ソリューションを含める方法を示すことでした。
クラスとしてのマッパー対マッピング拡張機能
モデル間をマッピングするとき、いくつかのオプションがあります。主な決定は、マッパークラスとマッピング拡張機能の間です。
拡張機能はより簡潔ですが、マッピングにそれらを使用すると、テストフレームワークの選択肢が制限されます(たとえば、モキトは静的関数をスタブすることはできません)。
マッパー拡張機能を注入するのはどうですか?私たちはそれをすることができました。ただし、これにより、簡潔さの利点がほぼ完全に削除されます。また、実装へのナビゲーションを難しくします。
それで、私は少し冗長なコンクリートマッパークラスを選択しました。
Googleのアーキテクチャコンポーネントをスキップします
Googleのアーキテクチャコンポーネントの最大の問題は、Androidの詳細をプレゼンテーションレイヤーに漏らすことです。これにより、プレゼンテーションレイヤーが真に不可知論されるのを防ぎます。
アーキテクチャコンポーネントのもう1つの問題は、ViewModelにあまりにも多くの責任を負わせることです。彼らはそれが所有していない状態を持続させ、潜在的なデータ同期バグにつながります。
これらの理由により、MVVMに従っていますが、このプロジェクトはLivedataではなくKotlinフローに依存しており、Googleではなく純粋なビューモデルを実装しています。
モッキングフレームワーク
このプロジェクトでは、Mockito-KotlinとMockkの両方が使用されており、それぞれの使用がどのように見えるかを示しています。
私の個人的な好みはockito-kotlinのままです。コードを使用するときに読みやすく、フォローしやすいと思います。執筆時点で、各リポジトリの星の数から判断すると、業界はMockkに傾いているようです。
私は偽物の使用について尋ねられました。私は偽物を探索しましたが、それらが過度に冗長で、維持するには高すぎることがわかりました。
依存関係噴射フレームワーク
ほとんどの最新のアプリの重要な部分である依存関係噴射(DI)は、アプリを構築するオブジェクトを取得するのに役立ちます。また、範囲の管理にも役立ちます。 Androidの世界で最も人気のある選択肢は、Hilt(Top of Daggerの上に構築されています)とKoinです。
HILTは2つの主な理由で選ばれました。
XML vs JetPack Compose
なぜ両方ではないのですか?私はまだJetpackの作曲について多くの懸念を持っています。それでも、選択されたUIメカニズムに関係なく、提示されたアーキテクチャがうまく機能することを示すことは私にとって重要でした。演習として、プレゼンテーションレイヤーを更新せずに、ComposeからXMLまたはその逆にUIレイヤーを交換しようとすることをお勧めします。
AmazonのAndroid用のクリーンアーキテクチャ
Clean Coderブログのクリーンアーキテクチャ
このプロジェクトへの貢献は大歓迎です。変更を加えてプルリクエストを提起するために、問題やフォークを自由に報告してください。
このプロジェクトは、MITライセンスの条件の下で配布されます。詳細については、license.mdを参照してください。