{"id":34,"date":"2021-06-03T10:17:41","date_gmt":"2021-06-03T15:17:41","guid":{"rendered":"https:\/\/lafilosofiadelsoftware.wordpress.com\/?p=34"},"modified":"2021-06-03T10:17:41","modified_gmt":"2021-06-03T15:17:41","slug":"clean-architecture-parte-1","status":"publish","type":"post","link":"https:\/\/lafilosofiadelsoftware.com\/index.php\/2021\/06\/03\/clean-architecture-parte-1\/","title":{"rendered":"Clean Architecture en Arquitectura N-capas parte 1"},"content":{"rendered":"\n<p id=\"6fa6\">\u00bfEs posible aplicar conceptos de arquitectura limpia utilizando una arquitectura de N-capas?<\/p>\n\n\n\n<p id=\"4ba5\">A menudo se habla que para trabajar con Clean Architecture es posible si se realiza con arquitectura hexagonal (hexagonal architecture) o arquitectura de cebolla (Onion architecture), lo cual no es del todo cierto, debemos ver las Clean Architecture como una filosof\u00eda la cual debe basarse en construir soluciones bajo 3 pilares: escalabilidad, mantenibilidad e independientes de agentes externos.<\/p>\n\n\n\n<p id=\"92a0\">Pero entonces, qu\u00e9 sucede con&nbsp;la muy utilizada, querida por muchos y odiada por pocos Arquitectura de N-capas, intentar\u00e9 responder a esta pregunta bajo las luces de mi experiencia profesional.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"7a75\">Estado actual de las arquitecturas N-capas<\/h1>\n\n\n\n<p id=\"3b82\">Considero que cualquier persona que ha trabajado con Java los \u00faltimos 15 a\u00f1os debi\u00f3 haberse enfrentado a la siguiente imagen:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"http:\/\/lafilosofiadelsoftware.files.wordpress.com\/2021\/06\/82f3b-0ynjkgkyedx7lsnng.png\" alt=\"\" \/><figcaption>Tipica arquitectura N-capas<\/figcaption><\/figure><\/div>\n\n\n\n<p id=\"7dca\">Donde en el momento de trabajar, lo hacemos bajo las siguientes afirmaciones:<\/p>\n\n\n\n<p id=\"d835\">\u201ctoda la l\u00f3gica de negocio ir\u00e1 en la carpeta service\u201d, \u201clos accesos a la base de datos se har\u00e1n en la carpeta repository\u201d, \u201clos controladores no deber\u00edan conocer a las entity (orm) y deber\u00eda solo exponer dto\u201d, entre otras afirmaciones.<\/p>\n\n\n\n<p id=\"be61\">Para proyectos peque\u00f1os o proyectos que tendr\u00e1n una baja mantenibilidad y modificabilidad esta solucion anda a toda m\u00e1quina, el problema aparece cuando la l\u00f3gica de negocio es densa y la carpeta&nbsp;<strong>service<\/strong>&nbsp;se llena de clases \u201cCualquierCosaService\u201d no siendo otra cosa sino grandes \u2018 cajas negras\u2019 donde cuando se cambia lo mas m\u00ednimo desencadenaran una serie de cambios no previstos; en resumen, clases con una complejidad alt\u00edsima que violan SRP (Single Responsibility Principle) indiscriminadamente.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"b191\">Lo feo de como se concibieron y se hicieron famosas las arquitectura N-capas<\/h1>\n\n\n\n<p id=\"69b4\">Para dar un ejemplo, pongamos una soluci\u00f3n de software hipot\u00e9tica para una librer\u00eda en donde se necesitar\u00e1 inicialmente las siguientes funcionalidades: prestar un libro, verificar disponibilidad de un libro, buscar si existe, vender un libro, enviar una copia pdf por email al momento de comprar.<\/p>\n\n\n\n<p id=\"9c89\">Cuantas veces se han enfrentado a este tipo de situaciones y han visto que crearon (o ustedes mismos crearon) la clase BookServiceImpl que contiene la soluci\u00f3n de todos estos casos de uso haciendo que dicha clase tenga much\u00edsimas razones para cambiar.<\/p>\n\n\n\n<p id=\"1b57\">El problema parte de que al momento de comenzar el proyecto se dijo \u201cen la carpeta service ira la l\u00f3gica de negocio\u201d y en el caso de necesitar algo sobre libro, agregalo en la clase BookServiceImpl, si necesitas algo sobre factura agregalo en FacturaServiceImpl y as\u00ed sucesivamente. Estas afirmaciones son una clara violacion a varios de los principios SOLID, intentar\u00e9 explicar a continuaci\u00f3n cuales.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong><em>SRP<\/em><\/strong>: Las clases tendr\u00e1n muchas razones para cambiar y no habr\u00e1 una raz\u00f3n de cambio espec\u00edfico para cada una de ellas, teniendo solo razones generales de cambio.<\/li><li><strong><em>OCP<\/em><\/strong>: Nuestras clases no tendr\u00e1n una l\u00f3gica cerrada al cambio ni permite ser extendida por otras clases para a\u00f1adir caracter\u00edsticas, en caso de abrir otra librer\u00eda en otro pa\u00eds con otra forma de pagos, \u00bfse imaginan la cantidad \u201cif\u201d a agregar en la aplicaci\u00f3n?<\/li><li><strong><em>ISP<\/em><\/strong>: A mi consideracion el m\u00e1s violado y menos respetado de este tipo de soluciones donde se dispone de una \u00fanica interfaz general con una cantidad absurda de m\u00e9todos, teniendo un contrato, que m\u00e1s que un contrato no termina representando nada dicha interfaz.<\/li><\/ul>\n\n\n\n<p id=\"537e\">y ni hablar de c\u00f3mo trabajamos el acceso a sistemas externos por medio de rest, soap, GraphQL, en nuestra carpeta service haci\u00e9ndola altamente acoplada a sistemas externos o del c\u00f3mo trabajamos con las \u2018entity\u2019 (objetos de base de datos) en la carpeta service, contaminandola de temas de base de datos en nuestra l\u00f3gica de negocio, el m\u00e1s m\u00ednimo cambio a nivel de base de datos afectar\u00e1 directamente a nuestro \u2018core\u2019.<\/p>\n\n\n\n<p id=\"7fd3\">En resumen, este tipo de soluciones para proyectos medianamente grandes conservar los tres pilares de la arquitectura limpia sera bastante complicado (por no decir imposible), pero no teman, tiene soluci\u00f3n. En el siguiente cap\u00edtulo, dar\u00e9 mi visi\u00f3n de c\u00f3mo trabajar con todos estos problemas y sus soluciones.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfEs posible aplicar conceptos de arquitectura limpia utilizando una arquitectura de N-capas? A menudo se habla que para trabajar con Clean Architecture es posible si se realiza con arquitectura hexagonal (hexagonal architecture) o arquitectura de cebolla (Onion architecture), lo cual no es del todo cierto, debemos ver las Clean Architecture como una filosof\u00eda la cual &#8230; <a title=\"Clean Architecture en Arquitectura N-capas parte 1\" class=\"read-more\" href=\"https:\/\/lafilosofiadelsoftware.com\/index.php\/2021\/06\/03\/clean-architecture-parte-1\/\" aria-label=\"Leer m\u00e1s sobre Clean Architecture en Arquitectura N-capas parte 1\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[2],"tags":[6,8,19,20],"class_list":["post-34","post","type-post","status-publish","format-standard","hentry","category-clean-architecture","tag-clean-architectura","tag-clean-code","tag-software-engineer","tag-solid"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/posts\/34"}],"collection":[{"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/comments?post=34"}],"version-history":[{"count":0,"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/posts\/34\/revisions"}],"wp:attachment":[{"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/media?parent=34"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/categories?post=34"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/tags?post=34"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}