Arquitetura escalável para grandes aplicativos móveis

Neste artigo, não analisaremos o MVP, MVVM, MVI ou algo parecido. Hoje falaremos sobre algo mais global do que apenas uma arquitetura em nível de apresentação. Como projetar um aplicativo realmente grande no qual dezenas ou centenas de desenvolvedores possam trabalhar confortavelmente? Um aplicativo fácil de estender, independentemente do código que escrevemos.


Requisitos para grandes projetos:


  1. Conectividade de código fraca. Quaisquer alterações devem afetar o mínimo de código possível.
  2. Reutilizando código. Coisas idênticas devem ser fáceis de reutilizar sem copiar o passado.
  3. Facilidade de expansão. Deve ser fácil para um desenvolvedor adicionar novas funcionalidades ao código existente.
  4. Estabilidade. Qualquer novo código pode ser facilmente desabilitado usando as alternâncias de recursos , especialmente se você estiver usando o desenvolvimento baseado em tronco .
  5. Propriedade do código. O projeto deve ser dividido em módulos, para que seja fácil atribuir um proprietário para cada módulo. Isso nos ajudará na fase de revisão de código. E aqui não apenas sobre coisas grandes, como módulos Gradle / Pods, mas também recursos comuns, que também podem ter proprietários diferentes .

Componente


imagem


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


, . .


imagem



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


imagem


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


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


imagem


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



 —  , , , , .


:


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

imagem


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


Server Drive UI


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


imagem


Do servidor, podemos receber uma lista de componentes na tela, indicando seu tipo, posição na tela, versão e dados necessários para operação e exibição.


{
  "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"
      }
    }
  ]
}

Questões?


Participei do desenvolvimento de vários grandes projetos usando essa arquitetura e estou aberto a perguntas sobre arquitetura em geral e aos detalhes técnicos da implementação do Android.


All Articles