UDE comienza una nueva serie de artículos de amplio interés en donde se compartirá información de autores de primera línea.

👉 Aquí tienes los artículos publicados hasta la fecha👈

¿Sabías que puedes organizar tus aplicaciones de manera limpia?

Existen diferentes arquitecturas que podemos usar para organizar nuestras aplicaciones, las opciones incluyen por capas, hexagonal, onion, DCI, clean entre otras. A continuación vamos mostrar una breve introducción de la Arquitectura Clean de Robert Martin (Uncle Bob).

Arquitectura Clean

Esta arquitectura sigue los siguientes principios:

  • Independiente de los frameworks: La arquitectura no debe depender de ninguna librería, los frameworks debe ser usados como herramientas.
  • Testable: Las reglas de negocio deben poderse probar sin necesidad de componentes externos.
  • Independiente de la UI: La interfaz de usuario debe poderse cambiar fácilmente, sin que esto conlleve a cambiar todo el sistema.
  • Independiente de la base de datos: Las reglas de negocio no deben estar atadas a la base datos, permitiendo que se pueda cambiar de un motor a otro.
  • Independiente de componentes externos: Las reglas de negocio no conocen los componentes externos.

Para lograr esto propone en general dos prácticas: separar la aplicación en capas y el seguir la regla de dependencia.

Componentes de la arquitectura Clean

Podemos ver los componentes de la aplicación en la siguiente Figura:

La arquitectura Clean

La arquitectura Clean

Cada círculo representa diferentes partes de la aplicación, los círculos externos son mecanismos y los internos son reglas.

La regla de dependencia plantea siguiente:

  • Las dependencias apuntan únicamente hacia adentro, areglas de alto nivel”.
  • Los componentes de los círculos internos no deben referenciar a componentes en los círculos externos. Al seguir esta regla logramos que nuestros componentes de negocio no sean afectados por cambios en frameworks, librerías y dependencias.
  • Las Entity encapsulan componentes críticos del negocio como pueden ser clases, estructuras de datos y funciones.
  • Los Use Cases contienen las reglas de negocio e implementan todos los casos de uso del sistema.
  • Los Interface Adapters están encargados de convertir y pasar datos desde los componentes externos a los casos de uso y las entidades, puede contener componentes de patrones como MVC o MVP.
  • Los Framewoks y Drivers son las herramientas como las bases de datos, frameworks web.

 

GreeterApp

Ahora que entendemos lo básico de la arquitectura, veamos una implementación con una variación del clásico “Hola Mundo”, donde en este caso saludaremos a un usuario.

Empezaremos creando la Entity User con un único parámetro de la siguiente manera:

public class User {

private String name;

//Constructor y getter

//…

}

El Use Case lo implementaremos con la clase GreetUser:

public class GreetUser implements Story {

private final StoryPresenter presenter;

private final UserGateway gateway;

public GreetUser(StoryPresenter presenter, UserGateway gateway) {

this.presenter = presenter;

this.gateway = gateway;

}

public void execute(StoryRequest request) {

GreetUserStoryRequest req = (GreetUserStoryRequest) request;

User user = gateway.findById(req.userId);

presenter.execute(new GreetUserStoryResponse(user.getName()));

}

}

Las Interfaces y Adapters con StoryPresenter y UserGateway:

 public interface StoryPresenter {

void execute(StoryResponse response);

}

public interface UserGateway {

User findById(String id);

}

El diagrama completo de clases de la aplicación lo podemos ver en la siguiente figura:

Diagrama de clases de la aplicación GreetUser - Universidad de la Empresa

Diagrama de clases de la aplicación GreetUser

 

Funcionamiento GreetApp

Para ejecutar la aplicación seguimos los siguientes pasos:

  1. Instanciar nuestro caso de uso GreetUsercon una implementación del gateway y el presenter:  Story sut = new GreetUser(presenter, gateway);
  2. Crear una petición  StoryRequest con el id del usuario que queremos saludar: StoryRequest request = new GreetUserStoryRequest(“UserId”);
  3. Ejecutar nuestro caso de uso: sut.execute(request);

Con esto obtenemos nuestra salida según la implementación de los componentes externos de la aplicación, el flujo completo puede verse en la siguiente figura:

Flujo de la aplicación GreetUser

Flujo de la aplicación GreetUser

 

El código fuente completo se encuentra en Github  

Conclusión

En el artículo hicimos una breve introducción a la arquitectura clean,  describimos sus características y mostramos un breve ejemplo de implementación.


Juan Moreno es Ingeniero Electrónico venezolano, se desempeña como Consultor Senior para Arnaldo C. Castro en Uruguay. Su especialidad es el desarrollo aplicaciones Web e Integración de Sistemas con tecnologías Java. Adicionalmente es docente en la asignatura de “Programación de Aplicaciones distribuidas Java/.NET” de las carreras “Técnico en Informática” y “Analista en Tecnología Informática” de la Facultad de Ingeniería de UDE

Share This