{"id":69199,"date":"2021-12-16T19:49:00","date_gmt":"2021-12-16T19:49:00","guid":{"rendered":"https:\/\/enviame.io\/?p=69199"},"modified":"2024-05-15T09:53:23","modified_gmt":"2024-05-15T13:53:23","slug":"clean-architecture-en-enviame","status":"publish","type":"post","link":"https:\/\/enviame.somosforma.dev\/pe\/clean-architecture-en-enviame\/","title":{"rendered":"Clean Architecture en Env\u00edame"},"content":{"rendered":"<p>Durante el a\u00f1o 2020, el equipo de TI de Env\u00edame estaba compuesto por un grupo acotado de personas, entre ellas se encontraban principalmente desarrolladores y analistas de soporte.<\/p>\n\n\n\n<p>La piedra angular del desarrollo hasta esos momentos era un proyecto con una arquitectura Modelo Vista Controlador (MVC), heredado de la etapa de MVP, donde Env\u00edame operaba como un equipo &#8220;fuertemente acoplado&#8221; con una \u00fanica fuente y organizaci\u00f3n de requerimientos. En \u00e9l se hallaban integradas las principales funcionalidades de nuestra plataforma, de las cuales algunas de ellas siguen funcionando en producci\u00f3n a d\u00eda de hoy.&nbsp;<\/p>\n\n\n\n<p>Esta plataforma se desempe\u00f1\u00f3 de muy buena manera, pero la integraci\u00f3n de nuevas funcionalidades, el aumento del volumen de c\u00f3digo, y el alto acoplamiento heredado, hizo que se volviera dif\u00edcil de&nbsp;<strong>mantener<\/strong>.<\/p>\n\n\n\n<p>Estas problem\u00e1ticas, junto con el crecimiento de clientes y transacciones, fueron identificadas por el equipo, llev\u00e1ndonos a redise\u00f1ar nuestra arquitectura, pasando de monolitos a microservicios desacoplados y dejando atr\u00e1s el patr\u00f3n MVC por&nbsp;<strong>Clean Architecture<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/image-9-1024x863.jpeg.webp\" alt=\"\" class=\"wp-image-9372\" width=\"545\" height=\"458\"\/><\/figure>\n\n\n\n<p><strong>Qu\u00e9 es Clean Architecture<\/strong><\/p>\n\n\n\n<p>Clean Architecture es un patr\u00f3n de Arquitectura de Software creado por Robert C. Martin, cuyas principales caracter\u00edsticas son:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>La aplicaci\u00f3n es independiente de cualquier entidad externa tales como frameworks, librer\u00edas o bases de datos<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>C\u00f3digo altamente desacoplado que permite realizar modificaciones, nuevas funcionalidades y testear de manera \u00f3ptima<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>La arquitectura est\u00e1 basada en una jerarqu\u00eda de capas que se comunican por medio de inyecci\u00f3n de dependencias<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" data-src=\"https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/2510386A-16F6-49FB-9498-12D1E38202CE.jpeg.webp\" alt=\"\" class=\"wp-image-9361 lazyload\" width=\"634\" height=\"466\" data-srcset=\"https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/2510386A-16F6-49FB-9498-12D1E38202CE.jpeg.webp 772w, https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/2510386A-16F6-49FB-9498-12D1E38202CE-300x220.jpeg.webp 300w, https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/2510386A-16F6-49FB-9498-12D1E38202CE-768x564.jpeg.webp 768w, https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/2510386A-16F6-49FB-9498-12D1E38202CE-600x441.jpeg.webp 600w\" data-sizes=\"(max-width: 634px) 100vw, 634px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 634px; --smush-placeholder-aspect-ratio: 634\/466;\" \/><\/figure>\n\n\n\n<p>La capa de&nbsp;<strong>dominio<\/strong>&nbsp;es la capa m\u00e1s interna de la aplicaci\u00f3n, en ella se definen las&nbsp;<strong>entidades<\/strong>&nbsp;que representan elementos propios del caso de negocio que se busca resolver. \u00c9stas suelen ser implementadas como clases.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"610\" height=\"204\" data-src=\"https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/image-7.jpeg.webp\" alt=\"\" class=\"wp-image-9362 lazyload\" data-srcset=\"https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/image-7.jpeg.webp 610w, https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/image-7-300x100.jpeg.webp 300w, https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/image-7-600x201.jpeg.webp 600w\" data-sizes=\"(max-width: 610px) 100vw, 610px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 610px; --smush-placeholder-aspect-ratio: 610\/204;\" \/><\/figure>\n\n\n\n<p>En la imagen anterior se presenta un ejemplo de una entidad en JS, que representa a un videojuego que pertenece a una compa\u00f1\u00eda, se encuentra disponible en ciertas plataformas y posee un t\u00edtulo y un a\u00f1o. Estas entidades pueden implementar m\u00e9todos que satisfagan reglas de negocio b\u00e1sicas que se relacionen con los atributos de la misma, para nuestro ejemplo se podr\u00eda a\u00f1adir un m\u00e9todo que obtenga el t\u00edtulo del videojuego o que verifique que una plataforma exista o no en el array&nbsp;<em>platforms<\/em>.&nbsp;<\/p>\n\n\n\n<p>La capa de&nbsp;<strong>casos de uso<\/strong>&nbsp;encapsula la l\u00f3gica de negocio de la aplicaci\u00f3n en funciones que corresponden a determinadas reglas de negocio del contexto que se est\u00e9 trabajando.&nbsp;<\/p>\n\n\n\n<p>En el siguiente ejemplo se representa la capa de casos de uso para el m\u00f3dulo de videojuegos.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"904\" height=\"662\" data-src=\"https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/image-8.jpeg.webp\" alt=\"\" class=\"wp-image-9363 lazyload\" data-srcset=\"https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/image-8.jpeg.webp 904w, https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/image-8-300x220.jpeg.webp 300w, https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/image-8-768x562.jpeg.webp 768w, https:\/\/enviame.somosforma.dev\/wp-content\/webp-express\/webp-images\/doc-root\/wp-content\/uploads\/2021\/12\/image-8-600x439.jpeg.webp 600w\" data-sizes=\"(max-width: 904px) 100vw, 904px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 904px; --smush-placeholder-aspect-ratio: 904\/662;\" \/><\/figure>\n\n\n\n<p>El m\u00e9todo&nbsp;<em>addPlatform<\/em>&nbsp;de la clase&nbsp;<em>VideoGamesUsecases<strong>&nbsp;<\/strong><\/em>implementa la l\u00f3gica referente a a\u00f1adir una nueva plataforma a un video juego. En este caso el m\u00e9todo se encarga de:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Obtener el video juego solicitado y verificar su existencia<\/li><li>Verificar que la plataforma que se quiere a\u00f1adir no se encuentra ya almacenada<\/li><li>A\u00f1adir la plataforma al video juego<\/li><li>Actualizar el video juego en la base de datos<\/li><\/ul>\n\n\n\n<p>El m\u00e9todo&nbsp;<em>databaseRepository.getVideoGameById&nbsp;<\/em>retorna una variable llamada&nbsp;<em>videoGame<\/em>&nbsp;que es una instancia de la entidad&nbsp;<em>VideoGame,&nbsp;<\/em>por lo cual en el caso de uso se pueden llamar todos los m\u00e9todos implementados para esa entidad, como es el caso del m\u00e9todo&nbsp;<em>videogame.isPlatformAssociated(platform)<\/em>.<\/p>\n\n\n\n<p>Una caracter\u00edstica importante de la clase&nbsp;<em>VideoGamesUsecases<\/em>&nbsp;es que inyecta como dependencia otra clase llamada&nbsp;<em>databaseRepository<\/em>, ella puede implementar m\u00e9todos para cualquier servicio de bases de datos.&nbsp;<\/p>\n\n\n\n<p>Al caso de uso&nbsp;<em>VideoGamesUsecases<\/em>&nbsp;le corresponde implementar l\u00f3gica de negocio y llamar a los m\u00e9todos de los repositorios, pero no conocer c\u00f3mo est\u00e1n implementado internamente, esa l\u00f3gica se implementa en la definici\u00f3n de dichos repositorios.<\/p>\n\n\n\n<p>La capa m\u00e1s externa implementa todas las funcionalidades referentes a frameworks y dependencias de infraestructura, en ella se programan conexiones a las bases de datos,&nbsp;&nbsp;configuraciones del servidor, entre otros. Esto nos da la posibilidad de poder modificar las dependencias y frameworks utilizados en la aplicaci\u00f3n sin causar mayores problemas, ya que los casos de uso se encuentran aislados.<\/p>\n\n\n\n<p><a><\/a>Impacto en el Equipo<\/p>\n\n\n\n<p>A d\u00eda de hoy, luego de algunos meses de haber comenzado a programar proyectos de backend con Clean Architecture, podemos hacer un balance entre las cosas positivas y negativas que ha conllevado esta decisi\u00f3n en el equipo.<\/p>\n\n\n\n<p>Partiendo con las cosas positivas, vale destacar que la estandarizaci\u00f3n de la forma de estructurar los proyectos ha permitido que heredar proyectos entre desarrolladores sea mucho m\u00e1s sencillo, ya que la separaci\u00f3n por capas, por contextos y la abstracci\u00f3n de la l\u00f3gica de negocio se respeta en todos los nuevos desarrollos. Esto tambi\u00e9n permite que la labor de mantener el c\u00f3digo y a\u00f1adir nuevas funcionalidades a desarrollos ya creados sea mucho m\u00e1s amena.<\/p>\n\n\n\n<p>Implementar cada capa con clases aisladas permite poder testear cada capa de manera independiente, la inyecci\u00f3n de dependencia facilita la labor de testear con mocks o con servicios montados en ambientes de pruebas dockerizados. Se puede testear cada capa con tests unitarios o varias capas funcionando juntas con tests de integraci\u00f3n.<\/p>\n\n\n\n<p>Otro punto positivo de Clean Architecture por sobre el MVC, es que nos ha permitido implementar un backend completamente aislado del frontend, lo cual se adapta mucho mejor a los microservicios y ha permitido mayor autonom\u00eda entre nuestros desarrolladores frontend y backend.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Con este patr\u00f3n como base hemos comenzado a plantearnos nuevos objetivos tales como realizar desarrollos orientados a tests y sentar las bases para nuestros procesos de Integraci\u00f3n Continua, \u00a1tema que abordaremos en otra entrada de blog!<\/p>\n\n\n\n<p>Como aspectos negativos se pueden mencionar cosas como la complejidad de implementaci\u00f3n del patr\u00f3n, el manejo de varios archivos para implementar una sola funcionalidad y la curva de aprendizaje media\/alta.&nbsp;<\/p>\n\n\n\n<p>Otro punto importante a mencionar aqu\u00ed es que Clean Architecture no es la soluci\u00f3n a todos los problemas de Software ni mucho menos, y que en casos en los que la complejidad de una soluci\u00f3n se vuelve considerable suele ser muy buena idea revisar alg\u00fan patr\u00f3n de dise\u00f1o que se adapte a la problem\u00e1tica e integrarlo dentro del proyecto.<\/p>","protected":false},"excerpt":{"rendered":"<p>Durante el a\u00f1o 2020, el equipo de TI de Env\u00edame estaba compuesto por un grupo acotado de personas, entre ellas se encontraban principalmente desarrolladores y analistas de soporte. La piedra angular del desarrollo hasta esos momentos era un proyecto con una arquitectura Modelo Vista Controlador (MVC), heredado de la etapa de MVP, donde Env\u00edame operaba como un equipo &#8220;fuertemente acoplado&#8221; con una \u00fanica fuente y organizaci\u00f3n de requerimientos. En \u00e9l se hallaban integradas las principales funcionalidades de nuestra plataforma, de las cuales algunas de ellas siguen funcionando en producci\u00f3n a d\u00eda de hoy.&nbsp; Esta plataforma se desempe\u00f1\u00f3 de muy buena manera, pero la integraci\u00f3n de nuevas funcionalidades, el aumento del volumen de c\u00f3digo, y el alto acoplamiento heredado, hizo que se volviera dif\u00edcil de&nbsp;mantener. Estas problem\u00e1ticas, junto con el crecimiento de clientes y transacciones, fueron identificadas por el equipo, llev\u00e1ndonos a redise\u00f1ar nuestra arquitectura, pasando de monolitos a microservicios desacoplados y dejando atr\u00e1s el patr\u00f3n MVC por&nbsp;Clean Architecture. Qu\u00e9 es Clean Architecture Clean Architecture es un patr\u00f3n de Arquitectura de Software creado por Robert C. Martin, cuyas principales caracter\u00edsticas son: La aplicaci\u00f3n es independiente de cualquier entidad externa tales como frameworks, librer\u00edas o bases de datos C\u00f3digo altamente desacoplado que permite realizar modificaciones, nuevas funcionalidades y testear de manera \u00f3ptima La arquitectura est\u00e1 basada en una jerarqu\u00eda de capas que se comunican por medio de inyecci\u00f3n de dependencias La capa de&nbsp;dominio&nbsp;es la capa m\u00e1s interna de la aplicaci\u00f3n, en ella se definen las&nbsp;entidades&nbsp;que representan elementos propios del caso de negocio que se busca resolver. \u00c9stas suelen ser implementadas como clases.&nbsp; En la imagen anterior se presenta un ejemplo de una entidad en JS, que representa a un videojuego que pertenece a una compa\u00f1\u00eda, se encuentra disponible en ciertas plataformas y posee un t\u00edtulo y un a\u00f1o. Estas entidades pueden implementar m\u00e9todos que satisfagan reglas de negocio b\u00e1sicas que se relacionen con los atributos de la misma, para nuestro ejemplo se podr\u00eda a\u00f1adir un m\u00e9todo que obtenga el t\u00edtulo del videojuego o que verifique que una plataforma exista o no en el array&nbsp;platforms.&nbsp; La capa de&nbsp;casos de uso&nbsp;encapsula la l\u00f3gica de negocio de la aplicaci\u00f3n en funciones que corresponden a determinadas reglas de negocio del contexto que se est\u00e9 trabajando.&nbsp; En el siguiente ejemplo se representa la capa de casos de uso para el m\u00f3dulo de videojuegos.&nbsp; El m\u00e9todo&nbsp;addPlatform&nbsp;de la clase&nbsp;VideoGamesUsecases&nbsp;implementa la l\u00f3gica referente a a\u00f1adir una nueva plataforma a un video juego. En este caso el m\u00e9todo se encarga de: Obtener el video juego solicitado y verificar su existencia Verificar que la plataforma que se quiere a\u00f1adir no se encuentra ya almacenada A\u00f1adir la plataforma al video juego Actualizar el video juego en la base de datos El m\u00e9todo&nbsp;databaseRepository.getVideoGameById&nbsp;retorna una variable llamada&nbsp;videoGame&nbsp;que es una instancia de la entidad&nbsp;VideoGame,&nbsp;por lo cual en el caso de uso se pueden llamar todos los m\u00e9todos implementados para esa entidad, como es el caso del m\u00e9todo&nbsp;videogame.isPlatformAssociated(platform). Una caracter\u00edstica importante de la clase&nbsp;VideoGamesUsecases&nbsp;es que inyecta como dependencia otra clase llamada&nbsp;databaseRepository, ella puede implementar m\u00e9todos para cualquier servicio de bases de datos.&nbsp; Al caso de uso&nbsp;VideoGamesUsecases&nbsp;le corresponde implementar l\u00f3gica de negocio y llamar a los m\u00e9todos de los repositorios, pero no conocer c\u00f3mo est\u00e1n implementado internamente, esa l\u00f3gica se implementa en la definici\u00f3n de dichos repositorios. La capa m\u00e1s externa implementa todas las funcionalidades referentes a frameworks y dependencias de infraestructura, en ella se programan conexiones a las bases de datos,&nbsp;&nbsp;configuraciones del servidor, entre otros. Esto nos da la posibilidad de poder modificar las dependencias y frameworks utilizados en la aplicaci\u00f3n sin causar mayores problemas, ya que los casos de uso se encuentran aislados. Impacto en el Equipo A d\u00eda de hoy, luego de algunos meses de haber comenzado a programar proyectos de backend con Clean Architecture, podemos hacer un balance entre las cosas positivas y negativas que ha conllevado esta decisi\u00f3n en el equipo. Partiendo con las cosas positivas, vale destacar que la estandarizaci\u00f3n de la forma de estructurar los proyectos ha permitido que heredar proyectos entre desarrolladores sea mucho m\u00e1s sencillo, ya que la separaci\u00f3n por capas, por contextos y la abstracci\u00f3n de la l\u00f3gica de negocio se respeta en todos los nuevos desarrollos. Esto tambi\u00e9n permite que la labor de mantener el c\u00f3digo y a\u00f1adir nuevas funcionalidades a desarrollos ya creados sea mucho m\u00e1s amena. Implementar cada capa con clases aisladas permite poder testear cada capa de manera independiente, la inyecci\u00f3n de dependencia facilita la labor de testear con mocks o con servicios montados en ambientes de pruebas dockerizados. Se puede testear cada capa con tests unitarios o varias capas funcionando juntas con tests de integraci\u00f3n. Otro punto positivo de Clean Architecture por sobre el MVC, es que nos ha permitido implementar un backend completamente aislado del frontend, lo cual se adapta mucho mejor a los microservicios y ha permitido mayor autonom\u00eda entre nuestros desarrolladores frontend y backend.&nbsp;&nbsp; Con este patr\u00f3n como base hemos comenzado a plantearnos nuevos objetivos tales como realizar desarrollos orientados a tests y sentar las bases para nuestros procesos de Integraci\u00f3n Continua, \u00a1tema que abordaremos en otra entrada de blog! Como aspectos negativos se pueden mencionar cosas como la complejidad de implementaci\u00f3n del patr\u00f3n, el manejo de varios archivos para implementar una sola funcionalidad y la curva de aprendizaje media\/alta.&nbsp; Otro punto importante a mencionar aqu\u00ed es que Clean Architecture no es la soluci\u00f3n a todos los problemas de Software ni mucho menos, y que en casos en los que la complejidad de una soluci\u00f3n se vuelve considerable suele ser muy buena idea revisar alg\u00fan patr\u00f3n de dise\u00f1o que se adapte a la problem\u00e1tica e integrarlo dentro del proyecto.<\/p>","protected":false},"author":1,"featured_media":9374,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_uag_custom_page_level_css":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-69199","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categorizar"],"acf":[],"uagb_featured_image_src":{"full":["https:\/\/enviame.somosforma.dev\/wp-content\/uploads\/2021\/12\/960A3415-BF09-4186-A084-E857C7108794.jpeg",1280,847,false],"thumbnail":["https:\/\/enviame.somosforma.dev\/wp-content\/uploads\/2021\/12\/960A3415-BF09-4186-A084-E857C7108794-150x150.jpeg",150,150,true],"medium":["https:\/\/enviame.somosforma.dev\/wp-content\/uploads\/2021\/12\/960A3415-BF09-4186-A084-E857C7108794-300x199.jpeg",300,199,true],"medium_large":["https:\/\/enviame.somosforma.dev\/wp-content\/uploads\/2021\/12\/960A3415-BF09-4186-A084-E857C7108794-768x508.jpeg",768,508,true],"large":["https:\/\/enviame.somosforma.dev\/wp-content\/uploads\/2021\/12\/960A3415-BF09-4186-A084-E857C7108794-1024x678.jpeg",1024,678,true],"1536x1536":["https:\/\/enviame.somosforma.dev\/wp-content\/uploads\/2021\/12\/960A3415-BF09-4186-A084-E857C7108794.jpeg",1280,847,false],"2048x2048":["https:\/\/enviame.somosforma.dev\/wp-content\/uploads\/2021\/12\/960A3415-BF09-4186-A084-E857C7108794.jpeg",1280,847,false]},"uagb_author_info":{"display_name":"enviameioadm","author_link":"https:\/\/enviame.somosforma.dev\/pe\/author\/enviameioadm\/"},"uagb_comment_info":0,"uagb_excerpt":"Durante el a\u00f1o 2020, el equipo de TI de Env\u00edame estaba compuesto por un grupo acotado de personas, entre ellas se encontraban principalmente desarrolladores y analistas de soporte. La piedra angular del desarrollo hasta esos momentos era un proyecto con una arquitectura Modelo Vista Controlador (MVC), heredado de la etapa de MVP, donde Env\u00edame operaba&hellip;","yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Clean Architecture en Env\u00edame - Env\u00edame<\/title>\n<meta name=\"description\" content=\"Descubre c\u00f3mo Env\u00edame implement\u00f3 Clean Architecture para optimizar su backend. Aprende las ventajas de este patr\u00f3n y c\u00f3mo ayuda a mejorar la colaboraci\u00f3n.\" \/>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Clean Architecture en Env\u00edame - Env\u00edame\" \/>\n<meta property=\"og:description\" content=\"Descubre c\u00f3mo Env\u00edame implement\u00f3 Clean Architecture para optimizar su backend. Aprende las ventajas de este patr\u00f3n y c\u00f3mo ayuda a mejorar la colaboraci\u00f3n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/enviame.io\/clean-architecture-en-enviame\/\" \/>\n<meta property=\"og:site_name\" content=\"Env\u00edame\" \/>\n<meta property=\"article:published_time\" content=\"2021-12-16T19:49:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-15T13:53:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/enviame.somosforma.dev\/wp-content\/uploads\/2021\/12\/960A3415-BF09-4186-A084-E857C7108794.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\">\n\t<meta name=\"twitter:data1\" content=\"5 minutos\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https:\/\/enviame.somosforma.dev\/#organization\",\"name\":\"Env\\u00edame\",\"url\":\"https:\/\/enviame.somosforma.dev\/\",\"sameAs\":[],\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/enviame.somosforma.dev\/#logo\",\"inLanguage\":\"es-PE\",\"url\":\"https:\/\/enviame.somosforma.dev\/wp-content\/uploads\/2020\/09\/logo-enviame-dark.png\",\"width\":678,\"height\":171,\"caption\":\"Env\\u00edame\"},\"image\":{\"@id\":\"https:\/\/enviame.somosforma.dev\/#logo\"}},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/enviame.somosforma.dev\/#website\",\"url\":\"https:\/\/enviame.somosforma.dev\/\",\"name\":\"Env\\u00edame\",\"description\":\"Plataforma de env\\u00edos multicourier I E-commerce\",\"publisher\":{\"@id\":\"https:\/\/enviame.somosforma.dev\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/enviame.somosforma.dev\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es-PE\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/enviame.io\/clean-architecture-en-enviame\/#primaryimage\",\"inLanguage\":\"es-PE\",\"url\":\"https:\/\/enviame.somosforma.dev\/wp-content\/uploads\/2021\/12\/960A3415-BF09-4186-A084-E857C7108794.jpeg\",\"width\":1280,\"height\":847},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/enviame.io\/clean-architecture-en-enviame\/#webpage\",\"url\":\"https:\/\/enviame.io\/clean-architecture-en-enviame\/\",\"name\":\"Clean Architecture en Env\\u00edame - Env\\u00edame\",\"isPartOf\":{\"@id\":\"https:\/\/enviame.somosforma.dev\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/enviame.io\/clean-architecture-en-enviame\/#primaryimage\"},\"datePublished\":\"2021-12-16T19:49:00+00:00\",\"dateModified\":\"2024-05-15T13:53:23+00:00\",\"description\":\"Descubre c\\u00f3mo Env\\u00edame implement\\u00f3 Clean Architecture para optimizar su backend. Aprende las ventajas de este patr\\u00f3n y c\\u00f3mo ayuda a mejorar la colaboraci\\u00f3n.\",\"breadcrumb\":{\"@id\":\"https:\/\/enviame.io\/clean-architecture-en-enviame\/#breadcrumb\"},\"inLanguage\":\"es-PE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/enviame.io\/clean-architecture-en-enviame\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/enviame.io\/clean-architecture-en-enviame\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/enviame.somosforma.dev\/\",\"url\":\"https:\/\/enviame.somosforma.dev\/\",\"name\":\"Portada\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/enviame.somosforma.dev\/pe\/clean-architecture-en-enviame\/\",\"url\":\"https:\/\/enviame.somosforma.dev\/pe\/clean-architecture-en-enviame\/\",\"name\":\"Clean Architecture en Env\\u00edame\"}}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/enviame.io\/clean-architecture-en-enviame\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/enviame.io\/clean-architecture-en-enviame\/#webpage\"},\"author\":{\"@id\":\"https:\/\/enviame.somosforma.dev\/#\/schema\/person\/4a1f4fd0b1fa4eb05d396a2eef7e7ed5\"},\"headline\":\"Clean Architecture en Env\\u00edame\",\"datePublished\":\"2021-12-16T19:49:00+00:00\",\"dateModified\":\"2024-05-15T13:53:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/enviame.io\/clean-architecture-en-enviame\/#webpage\"},\"publisher\":{\"@id\":\"https:\/\/enviame.somosforma.dev\/#organization\"},\"image\":{\"@id\":\"https:\/\/enviame.io\/clean-architecture-en-enviame\/#primaryimage\"},\"articleSection\":\"Sin categorizar\",\"inLanguage\":\"es-PE\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/enviame.somosforma.dev\/#\/schema\/person\/4a1f4fd0b1fa4eb05d396a2eef7e7ed5\",\"name\":\"enviameioadm\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/enviame.somosforma.dev\/#personlogo\",\"inLanguage\":\"es-PE\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/18478b563ca71196b4d600a2df0014f7?s=96&d=mm&r=g\",\"caption\":\"enviameioadm\"},\"sameAs\":[\"https:\/\/enviame.somosforma.dev\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/enviame.somosforma.dev\/pe\/wp-json\/wp\/v2\/posts\/69199"}],"collection":[{"href":"https:\/\/enviame.somosforma.dev\/pe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/enviame.somosforma.dev\/pe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/enviame.somosforma.dev\/pe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/enviame.somosforma.dev\/pe\/wp-json\/wp\/v2\/comments?post=69199"}],"version-history":[{"count":0,"href":"https:\/\/enviame.somosforma.dev\/pe\/wp-json\/wp\/v2\/posts\/69199\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/enviame.somosforma.dev\/pe\/wp-json\/wp\/v2\/media\/9374"}],"wp:attachment":[{"href":"https:\/\/enviame.somosforma.dev\/pe\/wp-json\/wp\/v2\/media?parent=69199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/enviame.somosforma.dev\/pe\/wp-json\/wp\/v2\/categories?post=69199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/enviame.somosforma.dev\/pe\/wp-json\/wp\/v2\/tags?post=69199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}