¿Es Laravel un aliado de software mantenible de gran escala?
Published: 2021-03-14 20:01:28

## Introducción.

Laravel es un frameworks de desarrollo ágil que te permite desarrollar código a muy buena velocidad y centrado en el requerimiento gracias a las características "out of the box" que provee, desde base de datos, email, eventos, jobs/qeues, testing, entre otros.

En este blog analizaremos que tan buen candidato es Laravel respecto a las buenas prácticas y principios de programación como lo son DDD, arquitectura hexagonal y principios SOLID.

## Estado de Laravel en cuanto a arquitectura hexagonal.

La arquitectura hexagonal es una forma de diseñar software por capas, se podría resumir en algo similar a lo siguiente:

```
Dominio (Lvl 1) <- Aplicación (Lvl 2) <- Infraestructura (Lvl 3)
```

La capa de dominio hace referencia a una esfera de conocimiento, en otras palabras, esta capa se centra en definir y/o conceptualizar toda la lógica de negocio.

La capa de aplicación, por su parte, concentra la manera de interactuar entre los usuarios y/o clientes con toda la lógica de negocio (dominio).

Finalmente, la capa de infraestructura se refiere a todos los elementos externos que son necesarios para desarrollar software que no están directamente relacionados con el dominio, por ejemplo: servidores, bases de datos, incluso software o librerías de terceros.

La única regla estricta en la arquitectura basada en capas es que las capas menor nivel no pueden utilizar capas de mayo nivel. Esto quiere decir, por ejemplo, que la capa de dominio puede utilizar la capa de dominio, pero no puede saber de la existencia de la capa de aplicación ni de infraestructura.

La capa de aplicación puede utilizar elementos de la capa de aplicación y dominio, pero no puede saber de la existencia de elementos de la capa de infraestructura. El mismo caso para la capa de infraestructura...

Retomando el tema, Laravel sacrifica un poco los principios de la arquitectura en capas para brindar practicidad. El ejemplo más claro que tenemos es Eloquent, el ORM por defecto de Laravel, permite ejecutar operaciones CRUD a una velocidad increíble, sin embargo, la definición del modelo pertenece a la capa de dominio, y la conexión con la base de datos a la capa de infraestructura.

## Estado de Laravel respecto principios SOLID.

Laravel, al igual que la mayoría de frameworks vienen con una serie de lineamientos que se consideran buenas prácticas, en este caso, conocido como "the laravel way". Y aunque la misma documentación busca que se implementen buenas prácticas de desarrollo, existen prácticas que podrían mejorar el desarrollo de aplicaciones con Laravel.

Un ejemplo de esto es el caso de los modelos, actualmente los modelos en Laravel se utilizan para mapeo de datos, pero no solo eso, en ellos recaen responsabilidades de serialización, notificaciones, etc... 

"The laravel way" recomienda delegar aún más responsabilidades a los modelos con query builders, colecciones, entre otras. Sin embargo, el framework brinda todas las herramientas para abstraer estas funcionalidades en clases concretas con responsabilidades únicas, pueden verse más detalles de cómo mejorar la calidad del código en el libro/curso Laravel Beyound CRUD.

## Estado de Laravel respecto a DDD.

Domain Driven Design (DDD) se define como una serie de principios cuyo objetivo es desarrollar software mantenible y agnóstico a frameworks usando como base principios SOLID y arquitectura hexagonal.

Para aplicar principios DDD en Laravel será necesario realizar algunos ajustes en cuanto a las convenciones de escafolding para separar el código en capas y mantenerlo organizado respecto a responsabilidades, pero es totalmente factible.

En este sentido, Laravel actúa a nivel de aplicación e infraestructura, brindando mecanismos sencillos y eficientes respecto a ruteo, middlewares, controllers, comandos, etc. Por lo que debemos centrarnos en abstraer la capa de Dominio con toda la lógica de negocio y de esta manera cumplir el propósito general de DDD.

## Conclusión.

Laravel es un framework estupendo, uno de los mejores en cuanto a practicidad y más completo en cuanto a características. Siempre busca que los desarrolladores implementen buenas prácticas, aunque en su núcleo algunas de estas prácticas se sacrifiquen para lograr esta facilidad y agilidad de desarrollo.

Respecto a las herramientas de Laravel que violan algunas reglas de arquitecturas limpias o en capas, pueden ser encapsuladas para evitar este tipo de inconvenientes, sin embargo, será necesario evaluar si es totalmente necesario dependiendo de la magnitud y alcance del proyecto final para no caer en sobre ingeniería. 

Lo importante del desarrollo de software es crear código funcional, mantenible y de fácil crecimiento, no es necesario implementar DDD en todos los proyectos incluso, se podría implementar parcialmente dependiendo de la complejidad, pero entre más grande y complejo apegarse a estos principios facilitarán el ciclo de desarrollo del producto.

Recuerda que todo comentario en bienvenido y si consideras que el contenido puede ser mejorado siéntete libre de expresarlo en comentarios.

Hasta la próxima.