Arquitectura escalable para grandes aplicaciones móviles.

En este artículo, no analizaremos MVP, MVVM, MVI o algo así. Hoy hablaremos de algo más global que solo la arquitectura a nivel de presentación. ¿Cómo diseñar una aplicación realmente grande en la que decenas o cientos de desarrolladores puedan trabajar cómodamente? Una aplicación que es fácil de extender sin importar cuánto código hayamos escrito.


Requisitos para grandes proyectos:


  1. Código de conectividad débil. Cualquier cambio debería afectar el menor código posible.
  2. Reutilizando el código. Las cosas idénticas deberían ser fáciles de reutilizar sin copiar el pasado.
  3. Facilidad de expansión. Debería ser fácil para un desarrollador agregar nueva funcionalidad al código existente.
  4. Estabilidad. Cualquier código nuevo se puede deshabilitar fácilmente utilizando las funciones de alternancia , especialmente si está utilizando un desarrollo basado en troncales .
  5. Código de propiedad. El proyecto debe dividirse en módulos, de modo que sea fácil asignar un propietario para cada módulo. Esto nos ayudará en la fase de revisión del código. Y aquí no solo se trata de cosas grandes, como los módulos Gradle / Pods, sino también características comunes, que también pueden tener diferentes propietarios .

Componente


imagen


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


, . .


imagen



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


imagen


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


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


imagen


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



 —  , , , , .


:


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

imagen


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


Server Drive UI


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


imagen


Desde el servidor podemos recibir una lista de componentes en la pantalla que indica su tipo, posición en la pantalla, versión y datos necesarios para la operación y visualización.


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

Preguntas?


Participé en el desarrollo de varios proyectos grandes utilizando esta arquitectura, y estoy abierto tanto a preguntas sobre arquitectura en general como a los detalles técnicos de la implementación de Android.


All Articles