クリーンアーキテクチャとMVPに関する考察


もともと公開されてWahibHaq blog .
約3ヶ月前に、Androidのdevの位置を探して仕事を探していました.私は、潜在的雇用者のうちの1つから、次の状況のために建築の1ページ推薦を提出するために、タスクを与えられました:
You are an experienced developer. Can you design 1-page architecture of an app
for a financial product with 50k users base (3k daily), that can work in a
modern setup of development, e.g. Spotify squads? Once you come onboard you may have to design for 10-100x userbase. The architecture can be a generic view.

私は個人的な考えを研究し、文書化した.今日はブログ記事として公開することにしました.

Disclaimer: Detailed explanations of Clean Architecture or MVP are not provided in this post as it is only highlighting the proposed solution and outlining my reasoning behind it.


無関係のノートでは、2017年に興味を持った年だったClean Architecture といくつかの手の経験を適用したModel-View-Presenter (MVP) AndroidアプリのアーキテクチャパターンFreeletics . 一般的に、ソフトウェア・アーキテクチャは、常に私の関心領域であり、残念ながら、私は過去のAndroidプロジェクトのいずれかでそれを実装する機会がなかった.Androidの開発者は、信頼性の高いアーキテクチャなしで堅牢、生産品質、維持可能なアプリケーションを構築するの闘争を理解する.
興味深いことに、2017年は常にGoogleと同じ年として記憶されますofficially 推奨するapp architecture 初めてのAndroidアプリのためにArchitecture Components . これは基本的にライブラリのコレクションは、単純な、柔軟かつ実用的なアプローチを提供するいくつかの一般的な問題から開発者を解放するので、彼らは以下のboilerplateコードを使用してモジュラーアプリを書くと素晴らしい経験を構築することに焦点を当てることができます.

我々は現代のアプリケーションアーキテクチャから何を期待すべきですか?


私の意見では、堅牢で、安定していて、安定して、最小限の努力で簡単に伸びる必要があります.
クリーンな建築は答えだと思う.

クリーンアーキテクチャ



-コム
インClean Architecture , コードは、1つの依存関係ルールでタマネギの形で層に分けられます:内側の層は、外側の層について何も知らないべきです.内側の層はビジネスロジックを含みます、一方、外側の層は実装を含みます、そして、中間層はインタフェースアダプターを含みます.各リングは抽象化の1つの層を表す
Some key technical benefits achieved in this way are:

> Abstraction over Implementation
> Single Responsibility Principle 
> Separation of Concern
> Decoupled Code

異なる層、コンポーネント、どのようにお互いと通信する



- 1 .代理店

プレゼンテーション/ UI層

  • MVPはUI/プレゼンテーション層に適しています.
  • 見当違いPassive View パターン.これは、活動、フラグメント、アダプタやカスタムビューなどの任意のAndroidビューで実装できるインターフェイスのセットです.
  • プレゼンターは、ビュー(Android固有のコンポーネントの上の抽象化)とビジネスロジック(Interactor/ユースケース)の間の仲介として機能します.ユーザーの相互作用を処理し、適切なビジネスロジックを呼び出して、レンダリングのUIにデータを送信します.
  • プレゼンターはAndroidクラスに依存しません.したがって、テスト容易性を改善します.
  • ドメイン層

  • ユースケースの簡単な例は「1つの口座から別の口座への送金」です.各ユースケースは、特定のビジネスロジックを実行する再利用可能なコンポーネントです.リポジトリからデータを取得し、ビジネスロジックを実行し、その結果をプレゼンターに返します.
  • データ層(データベースとAPI )


  • Repository Pattern ユースケースがデータを取得するデータソースの抽象化を作成する責任があります.Doos、ORMスタッフ、レトロフィット(または他のネットワーク関連のもの)サービス、JSON構文解析など.
  • アプリケーションシームレスなネットワーク上でもシームレスに動作する必要があります.以前にフェッチされたリソースをキャッシュし再利用する能力は、パフォーマンスを最適化する重要な側面です.
  • ビジネスロジックは、データがどこから来るかを知るべきではありません.ローカルに行動しますが、世界的に同期してください.
  • デバイス層

  • デバイスは、センサー、アラーム、通知、選手、管理者のすべての種類などのgritty Androidのものの実装が含まれています.
  • 提案アーキテクチャの解析

  • きれいな建築に固執する.
  • モジュールレベル、パッケージレベル、クラスレベルできちんと分離されています.したがって、単一の責任原則と懸念の分離を満たす必要があります.
  • ビジネスロジックはAndroidに直接触れません、そして、これは切り離されたコードベースをもたらすでしょう.
  • 分離されたクラスにそれぞれの依存関係の模擬実装を注入することで、テストをより簡単にすることができます.
  • プレゼンターを使用してプレゼンロジックを処理することは強制されませんでした.クリーンなアーキテクチャは「フロントエンド」の不可知論だと言うことができました.MVP、MVVM、それ以外に何かを使うことができます.
  • プレゼンターはビューインタフェースに依存していて、活動に直接依存していません.このようにして、私たちは、プレゼンターをDSOLID 原理プレゼンターのコードを変更せずに、具体的なビューに置き換えることができます.さらに、我々は簡単に模擬表示を作成することによりプレゼンターをテストすることができます.
  • あらゆるレイヤーはそれが働く独自のモデルを持っているので、ビューのような具体的な詳細は下層の実装の特定の詳細に依存しません.
  • 層の間で通信するためにコールバックを使う代わりにRxJava データを上流に提供し、スレッドスケジューリングを処理します.内部層の各々は、外側の層がそれを理解できる方法でデータを変えることができます.
  • CodeBaseの変更を多くし、拡張性要件を満たすことなく、任意の外部層の実装を変更できます.
  • このアプローチに従うのは困難で、時間がかかるが、コードを動かして、維持するつもりである将来の開発者に好意的にしているように考えてください.
  • これは依存関係の注入フレームワークを使用していることをサポートしていることに言及する価値がありますDagger .
  • クロス機能チームとアーキテクチャ


    上で共有した問題声明も言及Spotify Squads これは、技術的な文化をspotifyから出てきた非常に興味深い概念です.製品チームは、強い、知識の開発チームを構築する素晴らしい方法であるようです.レイマンの用語では、チームは小さなクロス機能自己組織スクラムチームです.彼らはエンドツーエンドの責任を持ち、長期的な任務に向けて協力しています.Squadsではキードライブは自律です.
    雇用者のために、アジャイルであることは重要な要件であり、したがって、それをサポートするアーキテクチャからの期待です.より重要なアジャイルの原則の一つは、

    “The best architectures, requirements, and designs emerge from self-organizing teams.”


  • Benji Weber チームの建築家の役割が必要ないと主張している.それはチームの責任です.理想的なチームでは、各メンバーは重複と相補的な問題について考えています.
  • ソフトウェア・アーキテクチャは、5~9人のメンバーのチームのためにすべての方法から機能性を取る障害であるべきではありません.
  • クリーン・アーキテクチャは、開発チームに彼らの環境の複雑さと急速な変化を管理するために必要なケイデンスと敏捷性を与える懸念の分離を提供します.デザインによって、コンポーネント間のカットを作成し、同時に将来の通信の契約を確立します.これは、AndroidのDEVは他の部族のメンバーと調和して動作することができます.
  • 定義の実践MVP contract 機能の作業を開始する前に間接的に効率的に自分自身の間で責任の領域を定義するために、同じチームのAndroidのDEVを支援します.
  • 更なる読書

  • What is all this Clean Architecture jibber-jabber about?
  • Android Architecture Series
  • Converting an App to Use Clean Architecture
  • Architecting Android...The clean way?
  • A complete idiot’s guide to Clean Architecture
  • Reactive Clean Architecture with Android Architecture Components