Mejores Prácticas para El Diseño de Una API Rest Con Spring Boot
Mejores Prácticas para El Diseño de Una API Rest Con Spring Boot
Mejores Prácticas para El Diseño de Una API Rest Con Spring Boot
Cochabamba – Bolivia
2018
1
ii
AGRADECIMIENTOS
Resumen ....................................................................................................................... 4
Introducción ................................................................................................................. 5
TABLA DE FIGURAS
Figura 25: Método genérico findByID, capturando error de solicitud HTTP ....... 35
Resumen
Esta monografía es parte del resultado que se obtuvo como producto en el desarrollo del Sistema
de Seguridad Industrial y Salud Ocupacional, por una parte se hizo un servicio web REST con
Framework Spring Boot, en la que se puede registrar y controlar la maquinaria, el equipo de
protección personal, las áreas y los equipos de trabajo.
Para el mencionado proyecto se utilizó Spring Boot, uno de los lenguajes de programación más
utilizados en el mundo por los desarrolladores. Sus principales características cómo;
portabilidad, simplicidad, arquitectura neutral y alto rendimiento, lo hacen una herramienta
potente para la construcción de software, se usó este framework ya que ocupa el primer lugar en
la lista de los más usados, sus múltiples beneficios permiten tener un software altamente
escalable y modular. Por lo tanto, las características antes mencionadas contribuyen a un
desarrollo ágil y eficiente que logran disminuir tiempos y recursos durante el proceso de
fabricación de la aplicación.
En este estudio se compartirá las mejores prácticas para el diseño de una API REST con Spring
Boot que se ha utilizado al desarrollar el Sistema de Seguridad Industrial y Salud Ocupacional,
me centro en las prácticas específicas, recomendados al implementar dicho sistema como por
ejemplo: uso de la configuración automática que ofrece, uso de Spring Initializr para comenzar
nuevos proyectos Spring Boot, estructurar el directorio de paquetes correctamente, tener los
controladores bien definidos, construir los servicios según las capacidades del negocio, hacer que
la base de datos sea un detalle (abstraerlo de la lógica central), confiar en el Constructor
Inyección, proporcionar manejo de excepciones globales, uso de logging framework y como
último punto una aplicación práctica de una API REST siguiendo las recomendaciones de los
expertos.
5
INTRODUCCIÓN
Los principales proveedores de servicios web como Facebook, Google, GitHub, Netflix, Amazon
y Twitter tienen sus propias API REST (full) a las que puedes acceder para obtener o incluso
escribir datos, resulta que REST es bastante flexible y compatible con HTTP. Ya que es un estilo
arquitectónico y no el estándar, proporciona mucha libertad para implementar diversas mejores
prácticas de diseño.
En este estudio sobre las mejores las mejores prácticas para el diseño de una api rest con Spring
Boot, el framework Java más popular para desarrollar microservicios, primero se hará un análisis
de los conceptos básicos y definiciones, para luego mostrar algunas de las mejores prácticas de
Spring Boot.
6
Actualmente existe un debate sobre esto, REST es un estilo, mientras que los servicios Web son
sistemas de software. Por tanto, no es posible la comparación de ambos. Por otra parte,
popularmente se generaliza el concepto de servicio Web con el de servicio Web basado en
REST, es decir tomando REST como estilo de diseño.
El consorcio W3C define los Servicios Web como sistemas software diseñado para soportar una
interacción interoperable máquina a máquina sobre una red. Los Servicios Web suelen ser APIs
Web que pueden ser accedidas dentro de una red (principalmente Internet) y son ejecutados en el
sistema que los aloja.
La definición de Servicios Web propuesta alberga muchos tipos diferentes de sistemas, pero el
caso común de uso de refiere a clientes y servidores que se comunican mediante mensajes XML
que siguen el estándar SOAP.
En los últimos años se ha popularizado un estilo de arquitectura Software conocido como REST
(Representational State Transfer). Este nuevo estilo ha supuesto una nueva opción de estilo de
uso de los Servicios Web. A continuación se listan los tres estilos de usos más comunes:
HTTP
URL
Representación de los recursos: XML/HTML/GIF/JPEG/…
Tipos MIME: text/xml, text/html.
gracias a REST y las APIs REST. Sin ellas, todo el crecimiento en horizontal sería prácticamente
imposible.
El éxito de REST se debe a que tiene como motivación la de capturar las características de la
Web que la han hecho tan exitosa, esto porque la web ha sido la única aplicación distribuida que
ha conseguido ser escalable al tamaño de Internet.
El estilo de arquitectura subyacente a la Web es el modelo REST. Los objetivos de este estilo de
arquitectura se listan a continuación:
Los métodos son usados para manipular los diferentes recursos que conforman la API.
Los principales métodos soportados por HTTP y por ello usados por una API REST son:
hace una petición al servidor, parte de la respuesta que éste devuelve, debe contener
información sobre vínculos relacionados con el recurso que se está consultando. Esto
permite la navegación entre recursos.
La principal ventaja del uso de una API REST reside en la independencia que proporciona frente
a cualquier consumidor, sin importar el lenguaje o plataforma con el que se acceda a ella. Esto
permite que una misma API REST sea consumida por infinidad de clientes sea cual sea la
naturaleza de estos y que el cambio a cualquier otro tipo de consumidor no provoque impacto
alguno en ella. Esta característica proporciona fiabilidad, escalabilidad y una fácil portabilidad a
cualquier otra plataforma, ya que aísla por completo al cliente del servidor. Sólo se requiere que
el intercambio de información de las respuestas se haga en un formato soportado, por lo general
JSON o XML. Dicha separación entre el cliente y el servidor hace que se pueda migrar a otros
servidores o bases de datos de manera transparente, siempre y cuando los datos se sigan enviado
de manera correcta. Esto convierte a las APIs REST en una de las arquitecturas web más
utilizadas actualmente por la flexibilidad que aportan a cualquier entorno de trabajo sea cual sea
su naturaleza.
James Lewin y Marting Fowler, ambos expertos en el campo, definen una arquitectura de
microservicios de la siguiente manera: “El estilo de arquitectura de microservicios es un enfoque
para desarrollar una aplicación individual como un conjunto de pequeños servicios, cada uno
12
corriendo su propio proceso y comunicándose con mecanismos livianos”. Lo que hace Spring
Boot es que facilita la creación de aplicaciones basadas en Spring Framework eliminando toda la
configuración XML. No se trata de generación de código sino que proporciona configuraciones
por defecto a la vez que permite de manera muy sencilla sobrescribir estas configuraciones según
nuestras necesidades.
2.1. Microservicios
El término microservicios no es relativamente nuevo, este estilo arquitectural fue acuñado por
Martin Fowler en un taller de arquitectos de software como una descripción del nuevo campo
que los participantes estaban explorando. No existe una definición en concreto para
microservicio, sin embargo una aproximación que la realiza (Newman, 2015) lo define como:
“Pequeños servicios autónomos que trabajan juntos”.
Una de las ventajas de utilizar microservicios es la capacidad de publicar una aplicación grande
como un conjunto de pequeñas aplicaciones (microservicios) que se pueden desarrollar,
desplegar, escalar, manejar y visualizar de forma independiente. Los microservicios permiten a
las empresas gestionar las aplicaciones de código base grande usando una metodología más
práctica donde las mejoras incrementales son ejecutadas por pequeños equipos en bases de
código y despliegues independientes. La agilidad, reducción de costes y la escalabilidad
granular, traen algunos retos de los sistemas distribuidos y las prácticas de gestión de los equipos
de desarrollo que deben ser considerados.
14
2.1.1. Beneficios
Spring es uno de los frameworks Java EE más utilizados para construir aplicaciones. Spring
Framework proporciona un elaborado modelo de programación y configuración. Su objetivo es
simplificar el desarrollo de Java EE y ayudar a los desarrolladores a ser más productivos en el
trabajo. Puede ser utilizado en cualquier tipo de plataforma de despliegue. Tiene en cuenta las
crecientes necesidades de las empresas de hoy se esfuerza por satisfacerlas.
Spring tiene una amplia cantidad de módulos que implican multitud de configuraciones. Estas
configuraciones pueden tomar mucho tiempo, pueden ser desconocidas para principiantes y
suelen ser repetitivas. La solución de Spring es Spring Boot que aplica el concepto de
Convention over Configuration (CoC).
CoC es un paradigma de programación que minimiza las decisiones que tienen que tomar los
desarrolladores, simplificando tareas. No obstante, la flexibilidad no se pierde, ya que a pesar de
otorgar valores por defecto, siempre se puede configurar de forma extendida. De esta forma se
evita la repetición de tareas básicas a la hora de construir un proyecto.
Mientras que Spring Framework se enfoca en brindar flexibilidad, Spring Boot apunta a acortar
código y brindar la manera más fácil de desarrollar una aplicación web. Con la configuración de
anotación y los códigos predeterminados, Spring Boot acorta el tiempo necesario para desarrollar
una aplicación. Ayuda a crear una aplicación independiente con menos configuraciones.
La autoconfiguración es una característica especial en Spring Boot, por lo cual es una de las
tecnologías dentro del mundo de Spring de las que más se está hablando últimamente.
Para los que no están familiarizados con esta tecnología, se podria decir que Spring Boot es una
herramienta que nace con la finalidad de simplificar el desarrollo de aplicaciones basadas en
Spring Core. Spring Boot busca que el desarrollador solo se centre en el desarrollo de la
solución, olvidándose por completo de la compleja configuración que actualmente tiene Spring
Core para poder funcionar.
Spring Boot centra su éxito en las siguientes características que lo hacen extremadamente fácil
de utilizar:
Configuración: Spring Boot cuenta con un complejo módulo que autoconfigura todos
los aspectos de nuestra aplicación para poder simplemente ejecutar la aplicación, sin
tener que definir absolutamente nada.
18
Resolución de dependencias: Con Spring Boot solo hay que determinar qué tipo de
proyecto se está utilizando y él se encarga de resolver todas las librerías/dependencias
para que la aplicación funcione.
Despliegue: Spring Boot se puede ejecutar como una aplicación Stand-alone, pero
también es posible ejecutar aplicaciones web, ya que es posible desplegar las aplicaciones
mediante un servidor web integrado, como es el caso de Tomcat, Jetty o Undertow.
Métricas: Por defecto, Spring Boot cuenta con servicios que permite consultar el estado
de salud de la aplicación, permitiendo saber si la aplicación está prendida o apagada,
memoria utilizada y disponible, número y detalle de los Bean’s creado por la aplicación,
controles para el prendido y apagado, etc.
Extensible: Spring Boot permite la creación de complementos, los cuales ayudan a que la
comunidad de Software Libre cree nuevos módulos que faciliten aún más el desarrollo.
“Spring Boot hace que la vida de los desarrolladores sea fácil cuando se crea un código listo
para la producción. Adoptar estas mejores prácticas ayudará a escribir menos y a producir
códigos manejables con poco mantenimiento y menos errores.”
En este apartado, hare referencia a las prácticas que se realizaron en el módulo II del Diplomado
“Experto en desarrollo de aplicaciones empresariales” 1ra versión, recomendaciones que la
mayoría de las veces es aplicable a proyectos con Spring. Estas se enlistan sin ningún orden en
particular.
Una de las características principales de Spring Boot es que hace uso de configuraciones
automáticas. De esta manera Spring Boot hace que tu aplicación se ponga en funcionamiento con
muy pocas configuraciones. La poca configuración que necesita esta en forma de anotaciones.
19
Una de las cosas interesantes que pude experimentar es el que Spring Boot maneja en cada
módulo criterios es decir que tiene valores predeterminados, por ejemplo el uso de Tomcat como
contenedor web.
Esta estructura que proporciona Spring Boot es personalizable, tanto en la configuración inicial,
como en el ciclo de desarrollo, por ejemplo si se prefiere usar Maven se cambiara los valores de
<dependency> en el archivo POM.
Los iniciadores son parte de la magia de Spring Boot, se utilizan para limitar la cantidad de
configuración manual de las dependencias que tiene que hacerse, todos los iniciadores utilizan la
siguiente nomenclatura: spring-boot-starter-XYZ, donde XYZ es el tipo de aplicación que se
quiere desarrollar, como se mostró en la figura anterior, a continuación se mostrara algunos de
los iniciadores más populares de Spring Boot:
Ahora si se necesitaria usar MySql como base de datos simplemente se añade esa dependencia:
Y si se quisiera trabajar con SqlServer so habría que comentar el tag de la dependencia de MySql
y añadir el de SqlServer, por ejemplo:
21
Al confiar en los iniciadores de Spring Boot, se tendría la certeza de que se está usando una
configuración probada y comprobada que funcionará bien. Todo esto también ayuda a evitar el
temido “Jar Hell” o Infierno de Dependencias.
Una vez seleccionadas las opciones se genera el proyecto y descarga un archivo compreso zip. Y
dependiendo de la IDE que se esté utilizando el proceso de instalación de las dependencias será
automático o en defecto será necesario escribir el comando maven install, para maven o
gradlew bootRun, para gradle.
Al usar la herramienta Spring Initializr le asegura que está usando dependencias probadas y
aprobadas que funcionarán bien con la configuración automática de Spring. Incluso puede
descubrir algunas integraciones nuevas que no sabía que existían y en pocos minutos disponer de
un proyecto básico funcional y listo para implementar la funcionalidad de la aplicación.
Si bien Spring Boot, da la libertad de estructurar nuestra paquetería como se desea, es importante
seguir las siguientes recomendaciones:
23
el cual buscara a todos los componentes (beans), que se encuentren en el directorio del
archivo SsibAplication.java.
Es también recomendable mantener los Controllers y Services juntos en módulos
orientados a la funcionalidad que presenta el proyecto, pero esto es opcional.
Una característica principal de REST es que está orientado a recursos, un recurso es cualquier
cosa tiene una URI (Uniform Resource Indentifier), estos recursos se usan a través de peticiones
HTTP donde cada una de los métodos del protocolo (GET, POST, PUT, PATCH, DELETE)
tienen un significado muy específico, para tener unos controladores bien definidos se enlistan las
siguientes recomendaciones:
25
Los controladores deben ser stateless (sin estado). Los controladores son por defecto
singletons y darles cualquier estado puede causar problemas masivos, según los expertos.
Lo que significa que no es una buena práctica el instanciarlos ya que solo son recursos
que deben ser consumidos a través de peticiones HTTP.
Los controladores no deben ejecutar la lógica de negocios sino confiar en la delegación
del recurso asignado.
Los controladores deben tratar con la capa HTTP de la aplicación. Esto no debe pasar a
Servicios.
Los controladores deben estar orientados en torno a un caso de uso / capacidad
empresarial.
Además de todo lo anterior es importante usar nombres y no verbos para los end-points ejemplo:
- /getAllMachines
- /createNewMachine
- /deleteAllRedMachines
Usar nombres en plural, no es recomendable mesclar nombres de los end-points con nombres en
singular:
- /machine
26
- /UnitOrganizational
- /employee
Usa en plural:
- /machines
- /unitsOrganizational
- /employees
Los servicios son otro concepto central en Spring Boot. Los servicios se usan para escribir la
lógica de negocios, pienso que es mejor crear servicios en torno a capacidades, dominios, casos
de uso de la aplicación.
En el siguiente ejemplo se creara un servicio genérico, no solo para machine, la cual hereda las
propiedades CRUD de CrudRepository.
Como se puede observar Spring Boot facilita en todo, ahora solo faltaría implementar el servicio
para machine, en el diplomado se vio distintas maneras de aprovechar las bondades de JPA y el
ejemplo siguiente se manejó procedimientos almacenados.
28
Al tener un servicio genérico del cual solo se hereda características CRUD, solo faltaría
implementar los diferentes servicios del negocio.
3.6. Hacer que la base de datos sea un detalle (abstraerlo de la lógica central)
Aunque sea posible escribir código limpio, siguiendo los principios de SOLID, se puede
encontrar que al crecer nuestro sistema, la arquitectura del mismo sea un impedimento, la
filosofía de C. Martin, “Arquitectura Limpia” resume que:
Las entidades: son las que incluyen las reglas de negocio críticas para el sistema. Estas
entidades pueden ser utilizadas por distintos componentes de la arquitectura, por lo que
son independientes, y no deben cambiar a consecuencia de otros elementos externos.
Los casos de uso: son reglas de negocio aplicables a una aplicación concreta. Estos casos
de uso siguen un flujo para conseguir que las reglas definidas por las entidades se
cumplan. Los casos de uso, solo definen como se comporta nuestro sistema, definiendo
los datos de entrada necesarios, y cual será su salida. Los cambios en esta capa no
deberían afectar a las entidades, al igual que los cambios en otras capas externas no
deberían afectar a los casos de uso.
Adaptadores de interfaz: Los datos generados por los casos de uso y las entidades,
tienen que transformarse en algo entendible por la siguiente capa que los va a utilizar y de
30
eso se encarga esta capa. Pensando en MVC por ejemplo, los controladores y las vistas,
pertenecerían a esta capa, y el modelo, serían los datos que se pasan entre los casos de
uso y los controladores para luego poder presentar las vistas.
Frameworks y drivers: En la capa más externa es, como dice Bob Martin, donde van los
detalles. Y la base de datos es un detalle, nuestro framework web, es un detalle etc.
Lo que entendí de todo lo que habla C. Martin es que se debe pensar en nuestro sistema, como un
sistema de plugins de forma que los componentes estén aislados y se pueda sustituir unos por
otros sin demasiados problemas. Por ejemplo la base de datos debería poder cambiarse de
Oracle, a SQL Server, a MongoDB, a Casandra o a cualquier otra base de datos sin que afectara
demasiado a nuestro sistema.
Aunque @Autowired es una anotación especifica de Spring y no pertenece al estándar JSR 330
(Java Specification Request), es una forma de mantener la lógica de negocio, @Autowired es
opcional pero tiene la ventaja de instanciar fácilmente un bean, permite resolver la inyección de
dependencias de los siguientes modos:
En el constructor de la clase.
En un atributo
31
En un método setter.
En un método JavaConfig.
En la siguiente figura se observa como @Autowired se usa para construir un bean de ese mismo
objeto en su constructor.
Spring ofrece un framework de excepciones a nivel web, por lo cual es posible mapear todos
nuestros errores de CONFLICT, NOT FOUND y BAD REQUEST.
Para ello se mostrara un ejemplo del uso de técnica HandlerExceptionResolver, para definir la
estrategia global de manejo de excepciones como se puede ver en la siguiente figura.
32
Usar esta librería de java me parecía no necesario, lo que yo hacía y la mayoría de mis
compañeros, para depurar su programa era imprimir mensajes así System.out.println(“Estoy
aqui”), porque no usar el Logging Framework, mostrar registros en depuración de nuestro
programa estandarizado, un Logger para el registro en lugar de hacerlo manualmente con
System.out.println(“”). Esto se hace fácilmente en Spring Boot prácticamente sin configuración.
Solo obtén tu instancia de logger para la clase:
Esto es importante, ya que le permitirá establecer diferentes niveles de registro según sea
necesario.
33
Para este ejemplo práctico, de una aplicación REST con Spring Boot, se creara un servicio web
para una empresa constructora que registra empleados, equipos, maquinarias, proyectos para lo
cual se hará uso de las siguientes herramientas:
Como primera buena práctica se usara Spring Initialzr, para ello diríjase a la siguiente dirección:
https://start.spring.io/, se debe seleccionar las configuraciones y dependencias necesarias que
tendrá nuestro proyecto Spring, tal como muestra la siguiente imagen:
Una vez se haya generado y descargado el proyecto se descomprime y luego abrir, con IntelliJ
IDEA, el cual empezara a descargar las dependencias automáticamente
El siguiente paso es crear nuestra clase de dominio, siempre teniendo en cuenta la buena práctica
de C. Martin, en este caso Spring ayuda a que la base datos sea solamente un detalle.
equipment
equipment_id
assign_equipment
name
assign_equipment_id
code
personnel_id
brand
equipment_id
quantity
loan_date
photo
return_date
price
quantity
type
state
active
observation contract
description
assign_supervisor_unit created_by
contract_id
assign_supervisor_unit_id created_by position_id
organizational_unit_id code
personnel_id place
observation salary
created_by start_date
updated_by end_date
created_date organizational_unit [document]
organizational_unit_id
modified_date description
type_organizational_unit_id
version created_by
name personnel updated_by
[level] personnel_id
created_date
description type_personnel_id
modified_date
created_by organizational_unit_id
type_organizational_unit version
type_organizational_unit_id updated_by contract_id
material
material_id
name
code
assign_machine brand
assign_machine_id
quantity
personnel_id
photo
machine_id
price
loan_date
type
machine
return_date
machine_id active
quantity
name description
state
code created_by
observation
brand updated_by
quantity created_date
photo modified_date
price version
type
active
description
La siguiente buena práctica es agrupar las clases en paquetes según las responsabilidades que
tengan.
En el paquete command se creara los POJO’s, en controller se colocara todos los controladores,
en la carpeta domain se creara toda la clase de dominio y el repositorio que se haya elegido
JPA o CRUD. A continuación se mostrara como quedaría para el recurso de Machine, teniendo
en cuenta las buenas practicas que se mencionó.
Una de las mejores prácticas es el uso de excepciones de manera central, un uso que lo daremos
es al momento de buscar algún elemento de nuestro repositorio como se muestra en la siguiente
figura:
Para las entidades se creara una base entidad, por las características que son comunes.
Entidad Base
Entidad Machine
Command Machine
Repositorio Machine
Al igual como se hizo una base para las entidades, se hará uno para los servicios
Servicio Base
Servicio Machine
Controlador Machine
Para ver el proyecto completo y ver como quedo puede ingresar a la siguiente dirección:
https://gitlab.com/edaeg2/ssib.git.
43
4. Conclusiones
Durante la elaboración de esta investigación se revisó varios conceptos y se reforzó los que
previamente tenía y con la elaboración del proyecto se espera que los lectores adquieran
habilidades necesarias para desarrollar una aplicación REST más óptima, siguiendo las
recomendaciones de los expertos.
Una de las ventajas que brinda Spring es que proporciona la posibilidad de integrar al framework
con otras herramientas o incluso con otros frameworks con el fin de obtener los beneficios que el
desarrollador desea de cada una de ellas. Para esto brinda diferentes módulos, según el tipo de la
herramienta o framework a integrar. Por lo que se puede decir que Spring intenta integrarse con
otras tecnologías y no competir contra ellas, aquí es donde recae la frase de que no trata de
“reinventar la rueda”. Otro de los aspectos más interesantes de Spring es que la complejidad de
la aplicación es proporcional a la complejidad del problema que se está resolviendo.
Se podría decir que Spring Boot recoge todas estas mejores prácticas y las incorpora en sus
versiones, por ejemplo en su página oficial, proporciona la herramienta Spring Initializr, el cual
cumple con la tarea de estructurar la aplicación de una buena manera. Otras de las cosas
interesantes que se puede ver, es que está diseñado con interfaces para que el desarrollador ya
pueda utilizarlas, por ejemplo un caso práctico es hacer que el código sea menos repetitivo al
momento de hacer una lectura y/o escritura de datos en una base de datos, además de hacerlo de
una manera segura y no queden abiertas conexiones a la base de datos y que las excepciones que
se den sean capturadas y traducidas a excepciones del mismo Spring. Los microservicios
fomentan buenas prácticas de ingeniería, uso de APIs e interfaces limpias, bajo acoplamiento,
alta cohesión, escalabilidad independiente, entre otras. Los microservicios permiten
independencia en equipos de trabajo y facilitan el Continous delivering de forma muy puntual
mientras el resto del sistema se mantiene estable y disponible.
Otro enfoque que tiene Spring es que los controladores están diseñados para tengan una única
función, cumpliendo así con una de buena práctica haciendo que los controladores sean Stateless,
todo esto con el propósito de que se enfoque a resolver su tarea de manera más centrada.
44
5. Bibliografía
- Spring Guides. [en línea]. https://spring.io/guides [Consulta: octubre de 2018].
- Spring Initializr. [en línea]. https://start.spring.io/ [Consulta: octubre de 2018].
- Bruno Krebs. [en línea]. https://auth0.com/blog/automatically-mapping-dto-to-entity-on-
spring-boot-apis/ [Consulta: octubre de 2018].
- Bartosz Jedrzejewski. [en línea]. https://www.e4developer.com/2018/08/06/spring-boot-
best-practices/ [Consulta: octubre de 2018].
- Roy Thomas Fielding. Architectural Styles and the Design of Network-based Software
Architectures – Chapter 5: Representational State Transfer (REST). DISSERTATION
UNIVERSITY OF CALIFORNIA, IRVINE 2000.
- Vladimir Pecanac. [en línea]. https://dzone.com/articles/top-rest-api-best-practices
[Consulta: octubre de 2018].
- Nicolai Parlog. [en línea]. https://dzone.com/articles/what-is-jar-hell [Consulta: octubre
de 2018].
- POSTA, Cristian. Microservices for Java Developers - A Hands-On Introduction to
Framework & Containers. California, USA : O'Reilly Media Inc., 2016.
- Patorjk, Text to ASCII Art Generator. [en línea]. <http:// patorjk.com/software/taag/
[Consulta: octubre de 2018].
- Robert C. Martin. Clean Architecture - a craftsman’s guide to software structure and
design. Chapter 7 - SRP: The Single Responsibility Principle. Pearson Education, Inc.,
2018.