Tal vez si eres un principiante como yo, mientras navegas por el amplio universo del Internet, te has topado con conceptos que no entiendes, o si eres pro activo, los has investigado y esto solo complica mas las cosas porque te topas con otros términos que tampoco entiendes.

Uno de esos términos puede que sea el de "Clean Architecture" ó "Arquitectura Limpia". El día de hoy te quiero presentar y tratar de aclarar de forma general este concepto así como sus características, OJO este articulo no pretende explicarte a profundidad para eso te dejare al final unos enlaces donde podrás encontrar información mas detallada sobre este tema, comencemos...

¿Que es la Arquitectura Limpia?

Cuando vamos desarrollando un proyecto que podrá crecer eventualmente, al principio tal vez no le demos mucha importancia al como debe estar segmentado, pero a medida de que este crece nos vamos a dar cuenta de que probablemente es difícil de leer y peor aun, es difícil de mantener, es aquí donde pensamos que quizás y solo quizás debimos investigar si existe alguna manera de organizar nuestro código para no tener estos problemas.

Pues bien es esto lo que hace una arquitectura limpia la cual nos va guiando en la construcción de nuestro proyecto y nos indica como es que debemos organizarlo y que reglas se deben cumplir, mas adelante se abordara esto, mientras tanto es importante mencionar que el termino viene del libro titulado "Clean Code" escrito por Robert C. Martin, un libro que si quieres puedes comprarlo solo debes buscarlo en Google.

¿Que conforma una Arquitectura limpia?

Bien tenemos 2 tipos de principios los de Cohesión y los de Acoplamiento ademas de 5 características

Principios de Cohesión

  • The Reuse/Release Equivalence Principle En síntesis nos dice que los componentes se deben ejecutar de manera independiente sin afectar a otros.
  • The common closure principle Si algunas clases deben cambiar por la misma razón, estas deben ser agrupadas.
  • The common reuse principle Si un componente depende de otro debemos intentar que se usen la mayoría de las clases del componente del cual se esta dependiendo.

Principios de Acoplamiento

  • The Acyclic Dependencies Principle Si llegamos a cambiar una dependencia este cambio no debe afectar el resto del proyecto.
  • The stable dependencies Principle Si un componente cambia constantemente no debe depender de alguno que sea complejo de modificar.
  • The stable Abstractions Principle Si un componente es difícil de modificar debemos cuidar que este compuesto por interfaces y clases abstractas para así hacerlo extensible y mantener la arquitectura.

Caracteristicas

  1. Independiente de los framework Esto debido a que si en algún momento cambiamos de Framework no debemos tener inconvenientes de compatibilidad
  2. Testable Debemos poder realizar las pruebas necesarias sin necesidad de componentes externos como por ejemplo la base de datos.
  3. Independiente de la UI El proyecto no debe verse afectado si la UI llega a cambiar.
  4. Independiente de la base de datos Si en algún momento requerimos el cambio de proveedor de base de datos no debe afectar el proyecto.
  5. Independiente de cualquier entidad externa Los componentes deben desconocer que sucede afuera de ellos.

Muchas reglas y eso pero en sí que nos dice todo esto, bueno como puedes ver en la imagen esta arquitectura nos presenta un diseño de capas donde en el centro se encuentra nuestra lógica de negocios y todos los componentes externos, o dependencias, van en las capas siguientes esto es así para que si en algún momento debemos cambiar incluso todos los componentes podamos de alguna manera desacoplar nuestra lógica de negocio y acoplarla en otro ambiente conformado por otras dependencias y con los ajustes necesarios esta siga funcionando con normalidad, , por esto la importancia en que no dependamos de Frameworks, bases de datos etc.

Es importante mencionar que es muy difícil llegar a cumplir todas estas reglas, muchas veces se debe hacer un análisis para ajustar el diseño y tratar de cumplirlo en su totalidad, ademas de que no existe una sola arquitectura limpia, pues cualquiera que cumpla con las características anteriormente mencionadas podrá ser considerada.

Como prometí aquí te dejo 3 recursos si quieres profundizar en el tema: