HandsAppMVP: arquitectura iOS para la subcontrataci贸n de desarrollo de estudio

imagen

Un buen c贸digo comienza con la arquitectura, y las aplicaciones de iOS no son una excepci贸n. Existen muchos patrones est谩ndar, pero el prop贸sito de este art铆culo no es hablar sobre ellos, sino sobre la experiencia de adaptar uno de ellos y desarrollar el suyo propio. Llamamos a esta adaptaci贸n HandsAppMVP.

imagen

En el desarrollo de iOS, la arquitectura determina principalmente la organizaci贸n de clases y dependencias para un ViewController espec铆fico. Sin embargo, el componente central puede ser no solo 茅l, sino simplemente UIView. La elecci贸n depende de la tarea espec铆fica.

Comparaci贸n de arquitectura


Existen varias plantillas arquitect贸nicas est谩ndar para iOS: MVC, MVP, MVVM, VIPER (los enlaces a la descripci贸n de cada uno se pueden encontrar al final del art铆culo).

Al elegir una arquitectura para el desarrollo, identificamos los principales par谩metros a los que debe corresponder: velocidad de desarrollo, flexibilidad y un umbral de entrada bajo. A continuaci贸n, comenzamos a comparar tres arquitecturas conocidas con estos par谩metros en mente (la plantilla de la comunidad MVC iOS ha estado enterrada durante mucho tiempo debido al grave incumplimiento de la responsabilidad 煤nica).

Para un equipo de outsourcing, la velocidad de desarrollo es especialmente importante. VIPER es la arquitectura m谩s compleja y "lenta", el desarrollo es m谩s r谩pido utilizando MVP o MVVM puro, ya que tienen menos componentes.

Flexibilidad significa la adici贸n o eliminaci贸n indolora de funcionalidad en la aplicaci贸n. Este par谩metro se correlaciona fuertemente con la velocidad de desarrollo en todas las etapas de la vida de la aplicaci贸n, excepto la inicial. La flexibilidad tambi茅n est谩 estrechamente relacionada con la simplicidad de las pruebas: las pruebas autom谩ticas le dan al desarrollador la confianza de que no romper谩 nada y ayudan a evitar errores. MVP cl谩sico est谩 mal cubierto por las pruebas, especialmente si no utiliza las interfaces de clase que se analizan a continuaci贸n. MVVM desde el punto de vista de las pruebas tambi茅n tiene un bajo rendimiento, ya que la prueba del c贸digo reactivo lleva mucho m谩s tiempo. VIPER es excelente para escribir ex谩menes porque respeta el principio de responsabilidad exclusiva en la mayor medida posible y las clases dependen de abstracciones.

Y el 煤ltimo par谩metro que consideramos es el umbral de entrada. Muestra la rapidez con la que los nuevos desarrolladores (en primer lugar, los jones) penetran en la arquitectura. Aqu铆 MVVM que usa bibliotecas reactivas de terceros (RxSwift, PromiseKit, etc.) ocupa un 煤ltimo lugar honorable por razones obvias. VIPER tambi茅n es una arquitectura bastante compleja debido a la gran cantidad de componentes. MVP tiene el umbral de entrada m谩s bajo.

Despu茅s de sopesar los pros y los contras, llegamos a la conclusi贸n de que necesitamos algo tan simple como MVP y tan flexible como VIPER. Entonces, la idea naci贸 para crear su propia arquitectura basada en ellos: HandsAppMVP.

Expandir MVP


Los componentes principales de nuestra arquitectura son Modelo, Vista, Presentador. Realizan las mismas funciones que en el MVP cl谩sico de acuerdo con el esquema bien conocido:

imagen
[Esquema del MVP cl谩sico]

Aqu铆 y a continuaci贸n, cada componente de interacci贸n (cuadrado azul) en los diagramas es una clase cuya vida coincide con la vida 煤til de la Vista. Una flecha s贸lida indica la propiedad de otro objeto, un enlace fuerte, y una flecha punteada indica un enlace d茅bil. Con referencias d茅biles, evitamos dependencias circulares y p茅rdidas de memoria.

Interfaces


Primero, agregamos las interfaces ViewInput y ViewOutput a este esquema cl谩sico. Tomamos en cuenta el quinto principio de SOLID: el principio de inversi贸n de dependencia. Es m谩s probable que no sea una adici贸n, sino un refinamiento para MVP. La dependencia de las abstracciones ayuda a eliminar la estricta conexi贸n de los componentes y le permite escribir pruebas normalmente. El esquema que tiene en cuenta las interfaces tiene este aspecto:

imagen
[Agregar interfaces ViewInput y ViewOutput] Un

peque帽o rect谩ngulo es una interfaz.

Un desarrollador atento preguntar谩, 驴d贸nde est谩n las interfaces para Model? Ahora nos dirigimos a ellos.

Trabajar con datos


El modelo de datos en arquitecturas m贸viles es un concepto colectivo. Un ejemplo est谩ndar: una aplicaci贸n llama a la red para interactuar con el servidor, luego guarda datos en CoreData para el trabajo fuera de l铆nea, escribe informaci贸n simple en UserDefaults y almacena el JWT en Keychain. Todos estos datos con los que se interact煤a forman el Modelo.

La clase que es responsable de interactuar con el contenedor de datos de un tipo particular, llamamos al servicio de datos. Para cada contenedor (base de datos remota, base de datos local, UserDefaults, etc.), se agrega una clase de servicio a HandsAppMVP que interact煤a con el presentador. Ahora tambi茅n puede agregar interfaces de entrada / salida para cada servicio de datos:

imagen
[Agregar servicios para trabajar con datos]

No todas las clases de servicio deben conectarse al presentador mediante una interfaz, como, por ejemplo, cuando se utiliza Moya. Moya es una biblioteca de red de c贸digo abierto. Moya proporciona una clase de servicio preparada (MoyaProvider), y al escribir pruebas, no tenemos que crear un objeto simulado que reemplace a ApiProvider. Moya proporciona un modo de prueba especial, cuando est谩 activado, MoyaProvider no interrumpe la red, pero devuelve datos de prueba (se pueden encontrar m谩s detalles aqu铆). En este caso, el presentador no se refiere a la abstracci贸n de MoyaProvider, sino a la implementaci贸n. Y recibimos comentarios de este servicio mediante cierres. Un ejemplo de implementaci贸n se puede encontrar en el proyecto de demostraci贸n.

Este ejemplo es m谩s una excepci贸n que una regla, y muestra que la adhesi贸n a SOLID no siempre es la mejor soluci贸n.

Navegaci贸n


Consideramos la navegaci贸n en la aplicaci贸n como una responsabilidad separada. HandsAppMVP utiliza una clase especial para ello: enrutador. El enrutador contiene un enlace d茅bil a la Vista, con el que puede mostrar una nueva pantalla o cerrar la actual. El enrutador tambi茅n interact煤a con el presentador utilizando la interfaz RouterInput:

imagen
[Agregar un componente para la navegaci贸n (Enrutador)]

Ensamblaje de componentes


La 煤ltima adici贸n al MVP cl谩sico que usamos es Assembly, una clase de colecci贸n. Se utiliza para inicializar la Vista y otros componentes de HandsAppMVP, as铆 como para implementar dependencias. El ensamblaje contiene el 煤nico m茅todo p煤blico: `assemble () -> UIViewController`, cuyo resultado es el UIViewController deseado (o UIView) con el gr谩fico de dependencia necesario.

No mostraremos Ensamblaje en el diagrama de arquitectura, ya que no est谩 conectado con componentes MVP y su ciclo de vida finaliza inmediatamente despu茅s de su creaci贸n.

Codigo de GENERACION


Para ahorrar tiempo, automatizamos el proceso de creaci贸n de clases HandsAppMVP usando Generamba. Las plantillas utilizadas para Generamba se pueden encontrar en nuestro repositorio. Un ejemplo de configuraci贸n para Generamba est谩 en el proyecto de demostraci贸n.

Como resultado de generar una pantalla espec铆fica, obtenemos un conjunto de clases que corresponde al esquema HandsAppMVP, un conjunto de pruebas unitarias para crear e implementar componentes, y tambi茅n una clase de plantilla para pruebas de presentador.

Que pas贸


Si compara Head-to-Head HandsAppMVP y VIPER, notar谩 que son muy similares y el primero solo se distingue por la ausencia del componente Interactor. Pero, al deshacernos de la capa entre los servicios y el presente (el interactor), adem谩s de simplificar la interacci贸n con la red usando Moya, recibimos un notable aumento en la velocidad de desarrollo.

Le recomendamos que preste suficiente atenci贸n a la arquitectura en la etapa de dise帽o para evitar errores globales, disputas con los clientes y el tormento de los desarrolladores en el futuro, y en su lugar liderar el proceso de desarrollo de manera competente y previsible.

Recuerde que cualquier arquitectura puede no ser adecuada espec铆ficamente para su proyecto, as铆 que no se apresure a aferrarse ciegamente a plantillas ya preparadas e historias exitosas de su aplicaci贸n. No tenga miedo de desarrollar y aplicar sus soluciones, pueden ser m谩s valiosas y flexibles para usted que las ya preparadas.

En conclusi贸n, recomendaremos algunos buenos art铆culos sobre la arquitectura de las aplicaciones de iOS que nos ayudaron a comprender las complejidades y tomar una decisi贸n:

  1. Patrones arquitect贸nicos en iOS
  2. iOS Swift: Arquitectura MVP
  3. An谩lisis de la arquitectura VIPER en el ejemplo de una peque帽a aplicaci贸n iOS en Swift 4
  4. Implemente MVVM en iOS con RxSwift

La documentaci贸n de c贸digo abierto de SurfStudio tambi茅n fue muy 煤til e inspirada .

Finalmente, estamos poniendo un enlace en el proyecto DEMO , escrito en HandsAppMVP, que hemos mencionado repetidamente en el art铆culo.

All Articles