Sobes.tech
Middle+

¿Qué puedes contarme sobre la arquitectura limpia?

sobes.tech AI

Respuesta de la IA

La arquitectura limpia (Clean Architecture), popularizada por Robert Martin ("Tío Bob"), es un conjunto de principios para organizar el código, dirigido a crear un sistema flexible, testeable y fácil de mantener.

Ideas principales:

  1. Separación en capas: El código se divide en círculos concéntricos, donde los círculos internos contienen la lógica de negocio, y los externos, los detalles de implementación (UI, bases de datos, APIs externas).
  2. Dependencia de las capas internas: Las capas externas dependen de las internas, pero no al revés. Esto se logra mediante el principio de inversión de dependencias.
  3. Encapsulación: Cada capa oculta los detalles de su implementación de las capas externas.
  4. Testabilidad: La lógica de negocio, ubicada en las capas centrales, no depende de detalles externos, lo que la hace fácilmente testeable en aislamiento.
  5. Independencia de frameworks: Las reglas principales del negocio no están atadas a frameworks específicos, UI o bases de datos.

Capas (ejemplo):

  • Entidades: Contienen objetos de negocio y reglas (por ejemplo, la clase User con lógica de negocio relacionada con el usuario).
  • Casos de uso (Interactors): Contienen lógica de negocio específica de la aplicación (por ejemplo, GetUserUseCase). Orquestan la interacción entre Entidades y Interfaces de Gateway.
  • Adaptadores de interfaz: Adaptan datos de fuentes externas a un formato comprensible para los Casos de Uso y Entidades (por ejemplo, Presentadores para UI, Implementaciones de Gateway para bases de datos).
  • Frameworks y controladores: Capa externa que contiene frameworks (UI, bases de datos, servicios web).

El principio de inversión de dependencias juega un papel clave. Las capas internas definen interfaces (Interfaces de Gateway), y las capas externas implementan esas interfaces. Esto se muestra en el siguiente esquema:

+-----------------+      +-------------------+      +--------------------+      +------------------------+
| Frameworks &    |----->|   Interface       |<-----|    Casos de Uso    |<-----|        Entidades     |
| Controladores (UI, DB)|  |   Adaptadores     |      |  (Interactors)     |      |  (Reglas de negocio) |
+-----------------+      |  (Presentadores,  |      |                    |      +------------------------+
                           |  Implementaciones de Gateway|  |                    |
                           +-------------------+      +--------------------+

Las flechas muestran la dirección de las dependencias. Todas apuntan hacia adentro, hacia la capa de Entidades.

En el desarrollo Android, la arquitectura limpia se implementa a menudo usando componentes como:

  • Capa UI (Presentación): Activity, Fragment, ViewModel, lógica de UI. Depende de la Capa de Dominio.
  • Capa de Dominio (Casos de Uso): Lógica de negocio de la aplicación. No depende de otras capas.
  • Capa de Datos: Fuentes de datos (redes, bases de datos), repositorios. Implementa interfaces definidas en la Capa de Dominio.

Ejemplo de estructura:

raíz
├── app
│   ├── src
│   │   └── main
│   │       └── java
│   │           └── com
│   │               └── ejemplo
│   │                   └── miapp
│   │                       ├── presentación  // Capa UI (ViewModel, Activities, Fragments)
│   │                       │   ├── ui
│   │                       │   └── viewmodel
│   │                       ├── dominio      // Capa de Dominio (Casos de Uso, Entidades, Interfaces)
│   │                       │   ├── entidad
│   │                       │   ├── repositorio  // Interfaces de Dominio
│   │                       │   └── casosdeuso
│   │                       └── datos        // Capa de Datos (Repositorios, Fuentes de Datos, Mappers)
│   │                           ├── local       // Fuente de Datos Local (Room)
│   │                           ├── remoto      // Fuente de Datos Remota (Retrofit)
│   │                           ├── mapeador
│   │                           └── repositorio  // Implementaciones de Datos que extienden Interfaces de Dominio
│   └── build.gradle
└── build.gradle

Ventajas:

  • Testabilidad: La lógica de negocio está aislada y es fácil de probar.
  • Flexibilidad: Es fácil reemplazar dependencias externas (por ejemplo, cambiar de Room a Realm).
  • Mantenibilidad: La clara separación de responsabilidades hace que el código sea más fácil de entender y mantener.
  • Independencia de tecnología: La lógica de negocio no está atada a frameworks o bibliotecas específicas de Android.

Desventajas:

  • Complejidad: Puede ser inicialmente más difícil de entender e implementar, especialmente en proyectos pequeños.
  • Más código: Requiere escribir más clases e interfaces en comparación con arquitecturas más simples.

En general, Clean Architecture es un enfoque poderoso para crear aplicaciones Android escalables y mantenibles, especialmente en proyectos de mediana y gran complejidad. Fomenta el desarrollo en torno a la lógica de negocio, no a los detalles técnicos.