Scaffold Clean Architecture — Una guía práctica

Jakspok
Bancolombia Tech
Published in
6 min readFeb 28, 2022

“La única forma de ir rápido es hacerlo bien”
- Uncle Bob -

En este artículo damos a conocer la correcta utilización del plugin de arquitectura limpia desde una orientación práctica.

Un término muy afamado en nuestro medio en los últimos tiempos es clean architecture o arquitectura limpia, pero, ¿a qué se refiere y cuáles son sus principales planteamientos?

Desde la fase del diseño de la arquitectura se contempla la modularización como un pilar fundamental de cada una de las partes a implementar, respetando los conceptos de cohesión y acoplamiento para generar sistemas altamente escalables y mantenibles.

Para conocer mayor detalle de los conceptos aplicados en el plugin de arquitectura limpia puedes revisar este artículo:
https://medium.com/bancolombia-tech/clean-architecture-aislando-los-detalles-4f9530f35d7a

“El objetivo de la arquitectura de software es minimizar los recursos humanos necesarios para construir y mantener el sistema requerido”
- Uncle Bob -

El plugin de arquitectura limpia va enfocado principalmente hacia Domain Driven Design, desacoplando la lógica de negocio de las implementaciones tecnológicas a utilizar y definiendo principalmente los criterios necesarios para su construcción, como el core de negocio lo requiera.

Manos A La Obra

Pasos para la construcción de un proyecto base:

Debemos tener presente que para la correcta ejecución de los comandos siguientes debemos tener instalado Gradle con una versión mayor o igual a 6.9.1.

  1. En nuestro computador crearemos una carpeta con un nombre a nuestra elección relacionado con el proyecto que vamos a construir.

2. Crear un archivo con el nombre build.gradle donde el contenido de esta será:

plugins {
id "co.com.bancolombia.cleanArchitecture" version "2.0.0"
}

3. Desde la consola escribimos el siguiente comando:

gradle tasks

Como resultado nos muestra las tareas definidas dentro del plugin:

4. Escribimos el siguiente comando para la creación de un proyecto base, para nuestro ejemplo lo llamaremos crudTest:

gradle cleanArchitecture --package=co.com.crudtest --type=imperative --name=crudTest 

En donde estamos definiendo el paquete, tipo de proyecto (reactivo o imperativo) y nombre del proyecto.

El resultado debería verse de la siguiente manera:

5. Abrimos el proyecto recién creado en el IDE de nuestra preferencia, en nuestro caso IntelliJ Idea:

Esta es la estructura base creada con el plugin y las configuraciones predefinidas para este.

6. Procedemos a crear un modelo. Desde la consola escribimos:

gradle gm --name Product

Ya con el modelo Product creado, definiremos unas propiedades necesarias para nuestro ejemplo.

Con el modelo se genera también una interfaz tipo gateway en la cual definiremos manualmente las firmas de nuestro repositorio de productos.

7. Crear un caso de uso (revisa el artículo referenciado al inicio, si no sabes qué es un caso de uso):

gradle generateUseCase — name=[useCaseName]

Ya generado nuestro CU (Caso de uso) abrimos la clase generada CrudProductUseCase e inyectamos el repositorio creado anteriormente. Agregamos, para este ejemplo, los métodos que el caso de uso va a ofrecer (CRUD):

8. Como unidad de persistencia usaremos JPA, para lo cual crearemos un drivenAdapter de la siguiente manera:

gradle generateDrivenAdapter --type=jpa

Nos creará un drivenAdapter con el tipo indicado por nosotros (JPA). A continuación, crearemos una entidad de persistencia de manera manual, la cual llamaremos ProductEntity:

Ahora modificaremos la clase JPARepositoryAdapter, la cual se encarga de mediar entre el modelo y la entidad de persistencia. Cambiamos Object por el modelo del dominio (Product) y el segundo Object por la entidad de persistencia (ProductEntity):

Entonces vamos a crear una clase llamada JpaProductImp, la cual implementará la interfaz ProductRepository:

9. En este numeral crearemos un controller donde vamos a gestionar las peticiones http para nuestro proyecto CRUDTest. En este punto tenemos varias alternativas:

Para nuestro ejemplo usaremos restmvc y escribimos el siguiente comando :

gradle generateEntryPoint --type=restmvc

Ya con esto hemos creado un punto de entrada para nuestro proyecto en el cual definiríamos los endpoints que necesitaríamos usando la lógica del caso de uso ya creado anteriormente.

Seguidamente realizaremos un “clean” y un “build” dentro de las tareas definidas en el IDE:

Ya en consola podemos ver que no tendremos errores:

Y continuación realizaremos la puesta en marcha de nuestro proyecto:

  1. Ubicamos la carpeta applications donde se encuentra ubicado nuestro main desde el cual iniciaremos nuestro proyecto

2. Como podemos ver en esta tenemos nuestro main o clase principal

3. Dentro de este archivo haremos clic en la primera flecha verde y nos mostrara un cuadro de dialogo “Run MainApplication.main()” en donde podremos ver la puesta en marcha del proyecto

Realicemos algunas pruebas

1) Creación de un producto

2) Consulta de productos

3) Actualización de productos:

4) Eliminación de producto

El código completo del ejemplo lo puedes encontrar en este link.

Conclusiones

El plugin de arquitectura limpia ahorra un tiempo considerable en el desarrollo de aplicaciones, mejorando la productividad y permitiendo centrarnos más en la lógica de negocio.

Recuerda que el plugin es un proyecto Open Source, por tanto todas las contribuciones y aportes que se te ocurran son bienvenidas: https://github.com/bancolombia/scaffold-clean-architecture

Happy Coding…

--

--