Android – Desmitificando Clean Architecture | DevPicon by Armando Picón | Armando | Diciembre 2021
Si es tuprimera vez leyendo sobre Arquitectura limpia quizás te convenga saber algunas cosillas antes de seguir:
- Arquitectura limpia es el título de un libro escrito por Robert C. Martin (aka. Uncle Bob)
- No es una arquitectura en sí, sino una guía que encierra un conjunto de principios a seguir.
- La base de esta guía se encuentra en aplicar los principios SOLID.
- En terminos generales, te intenta llevar a una estructura basada en el Dominio como punto central de tu aplicación (la capa en la que se implementará la lógica de tu aplicación). ¿ Alguien habló de Desarrollo impulsado por dominios?
- Un buen número de desarrolladores la confunde la arquitectura con N-capas.
- No es el santo grial, es una expresión algo Convencional entre los desarrolladores y por ende sirve como una forma fácil de describirle un desarrollador de qué manera se ha estructurado un proyecto.
Básicamente, es una estructura, una manera de distribuir los componentes que conforman una aplicación en distintas agrupaciones. Por esto mismo, no existe una única manera de Organizar tu proyecto. Diversos aspectos como el estado de tu proyecto, el tamaño de tuequipo, el tiempo, etc.
Mucho se ha dicho y escrito sobre cómo aplicar Arquitectura limpia en las aplicaciones que desarrollamos, un buen número de desarrolladores te hablarán sobre Separación de preocupaciones y pruebas como las principales características de seguir estos principios, suelen a su vez olvidar un aspecto muy importante sobre Arquitectura limpia y que consite en que su base yace en la implementación de la capa de Dominio.
Dicho esto ¿Cómo se estructuraría un proyecto base siguiendo estos principios? Para trabajar en esto es importante establecer dos thinkaciones importantes:
- Exist in regla en Arquitectura limpia por la cual toda capa externamente depende de una capa interna (y no al revés), quedando para el final la capa de Dominio sin Dependencia alguna.
- Existe unlujo de datos que pasa por todas las capas externas e internas tanto de ida desde que se efectúe el ingreso de datos por parte del usuario (o de los sensores) los datos o el envío de los mismos a un comicio remoto, vuelta con el resultado de la operación con el servicio hasta la presentación del resultado a nuestro usuario.
Teniendo encuenta estos dos aspectos, para una estructura básica contaríamos con tres módulos: Reunión de promoción, campo sí datos.La relación entre estos sería de la siguiente manera:
Es importante reiterar que al hablar de arquitectura, hablamos deorganización y estructura, por lo tanto, la distribución y qué componentes en específico irán en cada módulodependenterá del patrón que decidas emplear y de el propólodu
- campo deberá contener los elementos que contengan la lógica de tu aplicación y la lógica del negocio. Con ello en mente, tendremos clases de dominio, y ademáscomponentes quetendrán la lógica como son los Casos de Uso o Interactors. Este módulo NO debe Depender del Marco de Android ni dedependencias de terceros. Este módulo puede ser un módulo Kotlin.
- Reunión de promoción tendra los elementos que mostrarán información a nuestro usuario, recibir datos del mismo o de sensores. Además de los componentes visuales propios de Android (Activity y Fragment) y su sistema de UI (archivos XML o funciones de Compose), si se siguen patrocinador como MVP o MVVM, tendremos también Presenters o ViewModels respect. Este módulo es un módulo Android.
- datos va a incluir todas las Dependencias de network (Retrofit, volley, etc) y de persistencia de datos (Room, SharedPreferences, DataStore, Firebase, etc) Implementación de los repositorios las fuentes de datos (fuente de datos). Este módulo es un módulo Android también.
Seguramente aquí te podría surgir la siguiente duda: si campo Cielo invisible datos ¿ ¿cómo es que podríamos inyectar los repositorios en nuestros casos de uso? La respuesta se encuentra en el principio de Inversión de Dependencia (Inversión de dependencia) Sólido alemán.
Este principio de SOLID establece dos consignas:
- Los módulos de alto nivel no deben importar nada de un módulo de bajo nivel. Pero ambos deben Depender de absstracciones (interfaz).
- Las abstracciones no debendependenter de los detalles. Los detalles (las implementaciones concretas) debendependenter de las abstracciones.
Teniendo en mente esto, nuestro módulo campo deberá ser propietario de la interfaz del repositorio que se implementó dentro del módulo datos.
En código esto luciría más o menos de la siguiente manera, en el módulo campo Estaría la abstracción de un BookRepository.
interface BookRepository {
suspend fun getBooks():Listclass GetBooksUseCase(
}
private val bookRepository: BookRepository
) { /*...*/ }
Mientras que en el módulo datos iría su implementación.
class BookRepositoryImpl (...) : BookRepository {
override suspend fun getBooks(): List { /* ... */}
}
De este modo al momento de crear una instancia de nuestro caso de uso le podremos inyectar la deploymentación debido a la interfaz que hems declarado.
Podría mencionar algunas cosas como parte de la conclusión:
- Contar con una arquitectura o forma de Organizar los componentes es mejor que no tener ninguna.
- Arquitectura limpia no es una arquitectura en sí, pero nos provee de una guía a seguir para estructurar nuestros proyectos.
- Hay otras arquitecturas que nocuentan con mucha fama, pero no por ello son menos útiles.
- Teniendo esta estructura, puedes usar lo que se te antoje tanto en lapresentación (sea Views-XMLs o Compose) como a nivel del acceso a datos (Retrofit, Room, SharedPreferences, etc).
- En mi experiencia, la buena aplicación de los principios SOLID te da una buena base para ir perfilando la arquitectura de tu proyecto.
- La Lansada guía oficial de arquitectura de Android no sigue Clean Architecture, pero sí Protoe de una arquitectura separada en capas.