Skalierbare Architektur für große mobile Anwendungen

In diesem Artikel werden MVP, MVVM, MVI oder ähnliches nicht analysiert. Heute sprechen wir über eine globalere Sache als nur Architektur auf Präsentationsebene. Wie entwerfe ich eine wirklich große Anwendung, in der Dutzende oder Hunderte von Entwicklern bequem arbeiten können? Eine Anwendung, die einfach zu erweitern ist, egal wie viel Code wir geschrieben haben.


Voraussetzungen für Großprojekte:


  1. Schwache Code-Konnektivität. Änderungen sollten so wenig Code wie möglich betreffen.
  2. Code wiederverwenden. Identische Dinge sollten ohne Kopiervorgang leicht wiederzuverwenden sein.
  3. Einfache Erweiterung. Für Entwickler sollte es einfach sein, vorhandenen Code um neue Funktionen zu erweitern.
  4. Stabilität. Jeder neue Code kann mithilfe von Funktionsumschaltungen leicht deaktiviert werden , insbesondere wenn Sie eine trunkbasierte Entwicklung verwenden .
  5. Code-Besitz. Das Projekt sollte in Module unterteilt werden, damit es einfach ist, jedem Modul einen Eigentümer zuzuweisen. Dies wird uns in der Codeüberprüfungsphase helfen. Und hier nicht nur über große Dinge wie Gradle / Pods-Module, sondern auch über gewöhnliche Funktionen, die möglicherweise auch unterschiedliche Besitzer haben .

Komponente


Bild


. - (MV*) Presenter/ViewModel/Interactor/- . , - - . , , , // . , -, .


, . .


Bild



  1. . - .
  2. . .
  3. . .
  4. . , , .
  5. UI. .
  6. Unidirectional data flow . .
  7. . feature toggles.
    , , , . , - .


Bild


  1. (DomainObject).
  2. (UI State).
  3. .
  4. - ( , ), (Action) , . UI State, (Action) , Service. Service (. 1).


, , (Actions) (Service). Service (DomainObjects) . Service - : UserService, PaymentsService, CartService, : ProductDetailsService, OrderService.


Bild


, , MVP/MVC/MVVM/MVI , ().



 —  , , , , .


:


  • Middleware —  (Actions). , Middleware . .
  • Reducer —  Middleware. .

Bild


, Middleware Reducer , Middleware Reducer.
: Flux, Redux, MVI


Server Drive UI


, (DomainObject), . Play Store/App Store. , !


Bild


Vom Server können wir eine Liste der Komponenten auf dem Bildschirm erhalten, die ihren Typ, ihre Position auf dem Bildschirm, ihre Version und die für den Betrieb und die Anzeige erforderlichen Daten angeben.


{
  "components": [
    {
      "type": "toolbar",
      "version": 3,
      "position": "header",
      "data": {
        "title": "Profile",
        "showUpArrow": true
      }
    },
    {
      "type": "user_info",
      "version": 1,
      "position": "header",
      "data": {
        "id": 1234,
        "first_name": "Alexey",
        "last_name": "Glukharev"
      }
    },
    {
      "type": "user_photo",
      "position": "header",
      "version": 2,
      "data": {
        "user_photo": "https://image_url.png"
      }
    },
    {
      "type": "menu_item",
      "version": 1,
      "position": "content",
      "data": {
        "text": "open user details",
        "deeplink": "app://user/detail/1234"
      }
    },
    {
      "type": "menu_item",
      "version": 1,
      "position": "content",
      "data": {
        "text": "contact us",
        "deeplink": "app://contact_us"
      }
    },
    {
      "type": "button",
      "version": 1,
      "position": "bottom",
      "data": {
        "text": "log out",
        "action": "log_out"
      }
    }
  ]
}

Fragen?


Ich war an der Entwicklung mehrerer großer Projekte mit dieser Architektur beteiligt und bin sowohl offen für Fragen zur Architektur im Allgemeinen als auch für die technischen Details der Android-Implementierung.


All Articles