Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Clean Architecture at Mr.Milu

Clean Architecture at Mr.Milu

Clean Architecture: As we have applied in Mr.Milú

Jorge Garrido

October 14, 2016
Tweet

More Decks by Jorge Garrido

Other Decks in Programming

Transcript

  1. Friendly projects Mr. Milú - Sobre mi - De dónde

    venimos - Problemática - Solución: Clean Architecture - Cómo lo hemos aplicado - Conclusión Índice
  2. Friendly projects Mr.Milú La arquitectura de aplicaciones básica en Android,

    la cual aprendemos cuando llegamos a este campo (a golpe de tutoriales y la documentación propia del sdk) se basa en Actividades, posteriormente Actividades y Fragments, y en ir extendiéndolas, así como usando una (o usando Fragments) por cada pantalla de nuestras aplicaciones. Esto nos lleva al problema de que nuestras Actividades empiezan a crecer y crecer de forma acelerada por cada nueva funcionalidad que les incluimos. O lo que se conoce como God Activity (Activity Dios u omnipresente), que carga con todo el peso de cada pantalla de nuestras aplicaciones, tales como: trabajo de presentación (UI), lógica, hilos, red, y todo lo que se nos ocurra. Arquitectura clásica I
  3. Friendly projects Mr.Milú Esta arquitectura evidentemente no es sostenible para

    aplicaciones con gran cantidad de funcionalidades y/o mantenimiento, dado que trae tantos problemas como todas y cada una de las cosas que mezclamos en estas clases omnipresentes: complejidad, dificultad de debugging, spaghetti code, casi imposibilidad de testeo, entre otras muchas. Partiendo de esta base tan endeble y a pesar de conseguir quizás (y no estoy muy seguro a día de hoy) un ritmo de desarrollo más acelerado solo estaremos cavando nuestro camino hacia la desesperación a hora de añadir nuevas características o realizar cualquier tipo de mantenimiento. Problemática I
  4. Friendly projects Mr.Milú ¿Qué sorpresas nos encontraremos con un desarrollo

    bajo esta arquitectura? - Cargas de red en el hilo principal - Leaks de memoria - Evidente incumplmiento de los principios solid - Código nada testeable - Spaghetti code por doquier - Dificultad de debugging - Dificultad de extensibilidad y mantenimiento - ... Problemática II
  5. Friendly projects Mr.Milú ¿Qués es Clean Architecture? Simplificando el término,

    serían una serie de condiciones que debe cumplir nuestro software para que pueda ser considerado limpio, más que una arquitectura en sí puesto que no es cerrada y está abierta a interpretaciones. ¿En qué se basa? Clean Architecture nos muestra una serie de capas en las que separa el código de nuestra aplicación siguiendo una simple regla de dependencia de forma que: las dependencias sólo pueden apuntar hacia adentro y nada en un círculo interno puede saber nada en absoluto sobre algo en un círculo exterior. Introducción para noobs
  6. Friendly projects Mr.Milú UI: sdk’s y dependencias externas Presenters: controllers,

    gateways, adapters… Use cases: reglas de negocio Entities: lógica de dominio Arquitectura por capas
  7. Friendly projects Mr.Milú Las ventajas de esta arquitectura por capas

    como vemos son: - Una separación de conceptos sencilla - Gran extensibilidad y flexibilidad - Cumplimiento de los principios SOLID - Código limpio, testeable y mantenible - Desacoplamiento e independencia de frameworks - Fácil integración de librerías u otros agentes externos - Centrado en la lógica de negocio y no en las herramientas - Abstracción entre capas, especialmente notable entre fuentes de datos CA: SOLID y clean code
  8. Friendly projects Mr.Milú En Mr.Milú hemos interpretado de la forma

    mas cercana posible la implementación clean en la capa de UI de nuestras aplicaciones. Para ello hemos empleado el patrón Modelo - Vista (pasiva) - Presentador (MVP) mediante un framework de creación propia (Meigic) y así separar la lógica de presentación de nuestras vistas, así como de nuestros modelos. Por otro lado hemos eliminado el uso de una interfaz para la implementación del Presentador puesto que no aporta mayor testabilidad ni desacoplamiento y en definitiva es una pérdida de tiempo. Además aplicamos activamente el concepto de Interface Driven Development, también llamado Diseño por contrato. Módulo UI (interfaz) I
  9. Friendly projects Mr.Milú Aún aplicando este patrón de diseño nos

    encontramos que con las vistas crecían demasiado y además repetíamos código en ciertas tareas por lo que decidimos optar por la creación de unas clases especiales llamadas Helpers, las cuales nos proveen de características de composición para nuestras vistas. Nuestros Helpers son dependientes del framework y/o contexto dado que interactúan de forma directa con elementos de nuestra UI Módulo UI (interfaz) IV
  10. Friendly projects Mr.Milú Módulo UI (interfaz) V En el ejemplo

    podemos ver una implementación simple del patrón MVP usando Meigic. Además se ha añadido una clase Helper (ColorHelper) que obtiene el contexto y la vista donde va a aplicar los cambios.
  11. Friendly projects Mr.Milú En esta capa es donde se encuentra

    nuestra capa de dominio (negocio), por tanto tendremos nuestros Casos de Uso (también llamados Interactors) y nuestros Modelos de negocio propiamente dichos. Nuestra interpretación a la hora de implementar UseCase se basa en 3 cosas: - Fluent interfaces (patrón Api fluent) - RxJava (patrón Observer) - Patrón Command Por lo que tomamos ventaja de flexibilidad de modelado que nos ofrece RxJava a la hora de trabajar con datos y además dotamos de una interfaz fluida (y DSL) a nuestros casos de uso gracias a las Fluent interfaces. Módulo Domain (Dominio) I
  12. Friendly projects Mr.Milú El siguiente diagrama es la definición persé

    de un caso de uso en uml Módulo Domain (Dominio) II
  13. Friendly projects Mr.Milú Módulo Domain (Dominio) III En este ejemplo

    vemos como implementamos en caso de uso de identificación de un usuario en el sistema. En LoginUseCase implementamos una interefaz fluida para dotarlo de semántica (DSL) y nos valemos del patrón comand como finalizador de la acción, este devuelve la subscripción (RX) para que obtengamos el resultado en nuestro Presenter
  14. Friendly projects Mr.Milú Llegados a este último módulo, ya hemos

    captado la interacción del usuario y hemos modelado una Request, por lo que nos queda: - Mediar sobre los repositorios (patrón Mediator) - Mapear la request (patrón Data mapper) - Seleccionar el repositorio (patrón Strategy) - Llamar al repo (patrón Repository) - Y por último mapear la respuesta (Response) y devolverla (Data mapper) De nuevo y como hemos visto hasta este punto, nos apoyamos en patrones para obtener un código limpio en cada capa. Módulo Data I
  15. Friendly projects Mr.Milú El Mediator recibe el modelo por parte

    del Caso de Uso junto con la operación a realizar y este decide mediante un patrón Strategy qué Data source usará. Módulo Data II
  16. Friendly projects Mr.Milú Como podemos ver en el diagrama, el

    repositorio es un nivel de abstración respecto a los distintos data sources de nuestra aplicación, estos a la vez asislados gracias a una capa de data mappers. Módulo Data III
  17. Friendly projects Mr.Milú Internamente los Data mappers se encargan de

    transformar las propiedades de nuestros modeles en entidades que el data source objetivo pueda entender (y viceversa), abstrayendo además nuestro modelo hacia el exterior. Módulo Data IV
  18. Friendly projects Mr.Milú Módulo Data V Partiendo del Caso de

    Uso implementado en el módulo anterior, realizamos el login consultando primero nuestra Estratégia (caducidad de un token anterior) para decir como y donde loguearnos. Al elegir un repositorio externo, mapeamos nuestro modelo para adaptarlo a la endidad del repositorio y a la inversa con la respuesta.
  19. Friendly projects Mr.Milú A lo largo de esta charla hemos

    planteado una problemática y explorado una solución, tomando las condiciones propuestas por Clean Architecture e implementándolas a golpe de patrónes de diseño de software. Con todo ello hemos obtenido una arquitectura sólida, limpia, testeable, facilmente mantenible, y además, facil de reconocer por aquellos que conozcan los patrones empleados. El esquema por capas que nos abstrae de implementaciones, el uso de fronteras mediante interfaces y data mappers que garantizan también una alta abstracción y extensión, facilitan en conjunto la adición de nuevas características y/o mantenimiento. Conclusión
  20. Friendly projects Mr.Milú - (El get started de Clean Architecture)

    https://github.com/android10/Android-CleanArchitecture - (Charla Codemotion Clean Achitecture) https://www.youtube.com/watch?v=x3CR39_PR_I - (Meigic framework) https://github.com/mrmilu/Meigic - (Gist de la charla) - https://gist.github.com/FireZenk/820bcdaeca2ea769f0b23e6b07d906a0 - (Interface driven design) https://msdn.microsoft.com/en-us/library/aa260635(v=vs.60).aspx - (Software design patterns) - https://sourcemaking.com/design_patterns - Google!! Bibliografía