{"id":251,"date":"2023-05-21T17:30:13","date_gmt":"2023-05-21T22:30:13","guid":{"rendered":"https:\/\/lafilosofiadelsoftware.com\/?p=251"},"modified":"2023-08-23T07:30:50","modified_gmt":"2023-08-23T12:30:50","slug":"facade-delegate-en-nuestras-arquitecturas-de-software","status":"publish","type":"post","link":"https:\/\/lafilosofiadelsoftware.com\/index.php\/2023\/05\/21\/facade-delegate-en-nuestras-arquitecturas-de-software\/","title":{"rendered":"Facade &amp; Delegate en nuestras arquitecturas de software"},"content":{"rendered":"\n<p>Comencemos por el patr\u00f3n Facade. Imagina que tienes un problema el cual para solucionarlo requiere de diferentes conocimientos en distintos temas. Veamos el siguiente ejemplo: Tienes dificultades con la instalaci\u00f3n el\u00e9ctrica de tu hogar y hay interruptores que no funcionan correctamente junto con luces que parpadean, es tu <strong>responsabilidad <\/strong>darle soluci\u00f3n a esas dificultades, pero requieres conocimientos especializados en electricidad, como identificar circuitos, resolver problemas de cableado y reemplazar componentes defectuosos. Ante esta situaci\u00f3n, tenemos dos maneras de solucionarlo: en la primera, te conviertes en un especialista y aprendes todo lo que necesitas para solucionar la necesidad actual, y en la segunda, contratas a un electricista el cual ya tiene los conocimientos y herramientas para hacer las debidas reparaciones.<br>En este segundo escenario, el electricista ser\u00eda nuestro facade. Por lo tanto, ahora tu labor es \u00fanicamente comunicarle al experto qu\u00e9 dificultades est\u00e1s presentando y \u00e9l te brindar\u00e1 a trav\u00e9s de un simple llamado la soluci\u00f3n para reparar tu hogar.<\/p>\n\n\n\n<p>El patr\u00f3n de facade aplicado en este caso se convierte en el electricista el cual abstrae la complejidad de la soluci\u00f3n del problema y proporciona una interfaz simple para ser invocado. Podemos ver a facade como un concepto en el que se reubica la complejidad de la soluci\u00f3n de un problema, brindando una <strong><em>abstracci\u00f3n<\/em><\/strong> simplificada para su uso.<\/p>\n\n\n\n<p>Facade es, entonces, un patr\u00f3n de dise\u00f1o que busca abstraer la soluci\u00f3n de un problema, ofreciendo una interfaz simplificada permitiendo a su vez la <em>reutilizaci\u00f3n<\/em>. Muchos ingenieros piensan e incluso afirman que facade es un patr\u00f3n que reduce el acoplamiento, cuando lo correcto que se deber\u00eda decir es que acomoda el acoplamiento, debido a que el acoplamiento para la soluci\u00f3n del problema sigue existiendo, pero ahora se encuentra en la facade.<\/p>\n\n\n\n<p>Veamos el siguiente ejemplo:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-3-1024x323.png\" alt=\"\" class=\"wp-image-255\" width=\"819\" height=\"257\" srcset=\"https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-3-1024x323.png 1024w, https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-3-300x95.png 300w, https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-3-768x242.png 768w, https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-3.png 1311w\" sizes=\"(max-width: 819px) 100vw, 819px\" \/><figcaption class=\"wp-element-caption\">Antes y despu\u00e9s de usar facade<\/figcaption><\/figure><\/div>\n\n\n<p>Observando la imagen anterior, podemos apreciar en la imagen de la izquierda c\u00f3mo cada una de las clases de ventas presenta un alto acoplamiento al tener que depender de diferentes clases y sus respectivas respuestas para completar la l\u00f3gica de negocio que precisase para realizar la venta. En la imagen de la derecha, vemos el poder de la facade en acci\u00f3n, esta facade ahora tiene el acoplamiento hacia las clases que necesitase para completar la venta y ofrece a las clases de venta una abstracci\u00f3n a trav\u00e9s de una interfaz simplificada para hacer uso de ella. En este escenario, facade tambi\u00e9n habilita la reutilizaci\u00f3n; sin embargo, a pesar de conseguirlo este no es su prop\u00f3sito principal.<\/p>\n\n\n\n<p>Debe quedar claro que el acoplamiento que existe para realizar la venta NO desaparece del proyecto, dicho acoplamiento sigue existiendo pero ahora en la facade.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Facade en nuestra estructura del proyecto<\/h2>\n\n\n\n<p>Facade est\u00e1 para ofrecer una interfaz simplificada a una l\u00f3gica de negocio y NO para ser parte de una estructura de paquetes dentro de la arquitectura del proyecto a nivel de vista de paquetes.&nbsp;<br><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/facade-delegate-facade.drawio.png\" alt=\"\" class=\"wp-image-259\" width=\"132\" height=\"313\" srcset=\"https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/facade-delegate-facade.drawio.png 211w, https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/facade-delegate-facade.drawio-126x300.png 126w\" sizes=\"(max-width: 132px) 100vw, 132px\" \/><figcaption class=\"wp-element-caption\">Uso incorrecto de facade<\/figcaption><\/figure><\/div>\n\n\n<p>La imagen anterior muestra un cl\u00e1sico uso incorrecto de facade donde la presentan como una capa dentro de la estructura del proyecto, cuando ya hemos explicado realmente cual es su prop\u00f3sito. Veamos una aproximaci\u00f3n m\u00e1s correcta de su uso.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"441\" height=\"611\" src=\"https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-2.png\" alt=\"\" class=\"wp-image-254\" srcset=\"https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-2.png 441w, https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-2-217x300.png 217w\" sizes=\"(max-width: 441px) 100vw, 441px\" \/><figcaption class=\"wp-element-caption\">Una vista de nuestro proyecto usando correctamente facade<\/figcaption><\/figure><\/div>\n\n\n<p>Las Facades hacen parte de la l\u00f3gica de negocio y por lo tanto, deben estar dentro de la carpeta service podr\u00edas llegar a crear una carpeta para dejar todas tus facades dependiendo de la necesidad que tenga tu proyecto.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u201cToda la arquitectura habla de dise\u00f1o, pero no todo el dise\u00f1o habla de arquitectura\u201d<\/h3>\n\n\n\n<p>Cuando se habla de Facade entonces estamos hablando de dise\u00f1o y no de arquitectura de software debemos recordar que <em>La arquitectura de software habla de la forma que se le da al sistema, esa forma es la divisi\u00f3n del sistema en componentes, la organizaci\u00f3n (estructuctura) de esos componentes y la forma en que esos componentes se comunican entre s\u00ed.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SOLID y Facade<\/h2>\n\n\n\n<p>Algunas personas piensan que facade, al \u2018disminuir\u2019 el acoplamiento (cuesti\u00f3n que no es as\u00ed como ya se explic\u00f3 anteriormente), ayuda a cumplir los principios SOLID. Esto es falso, el alto o bajo acoplamiento no es un principio SOLID. Sin embargo, revisemos c\u00f3mo se relaciona este patr\u00f3n de dise\u00f1o con SOLID:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>Dependency inversion principle<\/em>: Puedes trabajar con interfaces y hacer inyecci\u00f3n de dependencias en la facade sin necesidad de hacer inversi\u00f3n de dependencia. DESCARTADO.<br><\/li>\n\n\n\n<li><em>Interface segregation principle: <\/em>Trabajar con interfaces espec\u00edficas no tiene nada que ver con facade. DESCARTADO<br><\/li>\n\n\n\n<li><em>Liskov substitution principle: <\/em>Poder reemplazar objetos por sus subtipos sin alterar el correcto funcionamiento tampoco tiene que ver con facade. DESCARTADO<br><\/li>\n\n\n\n<li><em>Open\/closed principle<\/em>: Habilitar el programa para su extensi\u00f3n y cerrado a modificaci\u00f3n tampoco est\u00e1 relacionado facade (Este principio SOLID se puede encontrar m\u00e1s claramente en patrones de dise\u00f1o de comportamiento). DESCARTADO<br><\/li>\n\n\n\n<li><em>Single responsibility principle: <\/em>Al mover la responsabilidad de una l\u00f3gica a una facade, se permite que la clase sea m\u00e1s cohesiva, es decir, facade ayuda al principio de responsabilidad \u00fanica. APROBADO.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfFacade como patr\u00f3n arquitect\u00f3nico?<\/h2>\n\n\n\n<p>Al patr\u00f3n de dise\u00f1o facade lo podemos encontrar tambi\u00e9n como un patr\u00f3n arquitect\u00f3nico cuando se trabaja con soluciones de microservicios con el nombre de <em><a href=\"https:\/\/www.waytoeasylearn.com\/learn\/gateway-aggregation-pattern\/\" title=\"Pattern Gateway Aggregation\">Pattern Gateway Aggregation<\/a><\/em>, de este tema podremos ahondar en entradas posteriores si es de inter\u00e9s general.<\/p>\n\n\n\n<p>Conclusiones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Facade no baja el acoplamiento solo lo mueve a otro lugar (mejor).<\/li>\n\n\n\n<li>Facade est\u00e1 relacionado en cierta forma con <strong>S<\/strong>OLID en el tema de Cohesi\u00f3n pero no con el Acoplamiento.<\/li>\n\n\n\n<li>Es posible lograr reutilizaci\u00f3n con facade pero no es su prop\u00f3sito principal, puedes crear tu facade para ser utilizada por una sola clase y est\u00e1 correcto.<\/li>\n\n\n\n<li>Facade no hace parte de la estructura de paquetes en n-layer.<\/li>\n\n\n\n<li>Facade al mejorar la cohesi\u00f3n y reestructurar el acoplamiento facilita las pruebas unitarias y las pruebas de integraci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">DELEGATE<\/h2>\n\n\n\n<p>El patr\u00f3n delegate es un patr\u00f3n de dise\u00f1o en el cual un objeto, en lugar de realizar directamente una tarea en particular, delega la tarea a otro objeto. En otras palabras, un objeto delegado se encarga de realizar la tarea.&nbsp;<\/p>\n\n\n\n<p>Este concepto de \u201cpatr\u00f3n de dise\u00f1o\u201d fue importante en los primeros momentos de la programaci\u00f3n cuando se sol\u00eda tener archivos extensos con toda la l\u00f3gica en ellos, lo que resultaba en una baja mantenibilidad y flexibilidad. Si repasamos este \u201cpatr\u00f3n de dise\u00f1o\u201d podemos apreciar el \u00abvalor\u00bb que aporta, listemololos:<br><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Separaci\u00f3n de responsabilidades: El patr\u00f3n Delegate permite separar las responsabilidades entre objetos, promoviendo un dise\u00f1o modular y f\u00e1cil de mantener. El objeto delegante (delegating object) puede transferir una tarea espec\u00edfica a otro objeto delegado (delegate object), lo que ayuda a mantener el c\u00f3digo m\u00e1s organizado y reduce la complejidad.<\/li>\n\n\n\n<li>Flexibilidad y extensibilidad: El uso de delegates permite cambiar el comportamiento de un objeto delegante en tiempo de ejecuci\u00f3n. Puedes cambiar f\u00e1cilmente el objeto delegado al que se le delega una tarea sin modificar el c\u00f3digo del objeto delegante.<\/li>\n\n\n\n<li>Acoplamiento d\u00e9bil: El patr\u00f3n Delegate ayuda a reducir el acoplamiento entre objetos. El objeto delegante no necesita conocer los detalles internos del objeto delegado, solo necesita conocer la interfaz com\u00fan que deben implementar los objetos delegados.<\/li>\n<\/ul>\n\n\n\n<p>Excelente todo lo anterior, \u00bfverdad?, sin embargo, en la actualidad con los lenguajes orientados a objetos, el uso de interfaces y la composici\u00f3n brindan el mismo valor que se menciono anteriormente. Esto nos lleva a la conclusi\u00f3n de que el patr\u00f3n delegate no aporta ning\u00fan valor adicional a nuestro proyecto. De hecho esto se puede comprobar en que la gran mayor\u00eda de libros y documentos que hablan acerca de lo que son patrones, ya no mencionan delegate como un patr\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Delegate en nuestra estructura del proyecto<\/h2>\n\n\n\n<p><br>Ahora, es probable que alguna vez hayas implementado Delegate como una estructura\/capa de tu arquitectura del proyecto, como se muestra en la siguiente imagen:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image.png\" alt=\"\" class=\"wp-image-252\" width=\"170\" height=\"428\" srcset=\"https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image.png 193w, https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-119x300.png 119w\" sizes=\"(max-width: 170px) 100vw, 170px\" \/><figcaption class=\"wp-element-caption\">Uso incorrecto de delegate como capa&nbsp;<\/figcaption><\/figure><\/div>\n\n\n<p>Lo anterior, es un error generalizado puesto que no aporta ning\u00fan valor a tu proyecto agregar esta capa de delegate que solo realice llamadas a la capa de servicio. Sin embargo, existen defensores que argumentan que su funci\u00f3n es \u201cdelegar\u201d.&nbsp;<\/p>\n\n\n\n<p>Veamos ahora una aproximaci\u00f3n de nuestro proyecto sin esa capa de delegate:<br><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"451\" height=\"591\" src=\"https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-1.png\" alt=\"\" class=\"wp-image-253\" srcset=\"https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-1.png 451w, https:\/\/lafilosofiadelsoftware.com\/wp-content\/uploads\/2023\/05\/image-1-229x300.png 229w\" sizes=\"(max-width: 451px) 100vw, 451px\" \/><figcaption class=\"wp-element-caption\">Una vista de nuestro proyecto sin la capa delegate.<\/figcaption><\/figure><\/div>\n\n\n<p>Con la anterior aproximaci\u00f3n logramos los mismos beneficios que tendr\u00edamos al tener una capa de delegate (Separaci\u00f3n de responsabilidades, flexibilidad y extensibilidad, acoplamiento d\u00e9bil). Sin embargo, evitamos la complejidad accidental que conlleva agregar algo innecesario.&nbsp;<\/p>\n\n\n\n<p><em>La composici\u00f3n por medio de interfaces es la clave.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfDelegate como patr\u00f3n arquitect\u00f3nico?<\/h2>\n\n\n\n<p>Al patr\u00f3n de dise\u00f1o delegate lo podemos encontrar tambi\u00e9n como un patr\u00f3n arquitect\u00f3nico cuando se trabaja con soluciones de microservicios con el nombre de <em><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/architecture\/patterns\/gateway-routing\" title=\"Pattern Gateway Routing\">Pattern Gateway Routing<\/a><\/em> dado que nuestro gateway recibe una petici\u00f3n y la delega a un componente que se encarga de hacer el trabajo (delegado). Delegate como patr\u00f3n arquitect\u00f3nico aporta mucho valor al proporcionar un punto \u00fanico para la comunicaci\u00f3n de diferentes componentes del sistema, lo que traduce en reducir el acoplamiento del sistema.&nbsp;<\/p>\n\n\n\n<p><br>Conclusiones<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Delegate no deber\u00eda hacer parte de nuestra estructura de carpetas del proyecto.<\/li>\n\n\n\n<li>La composici\u00f3n y uso de interfaces\/polimorfismo suplen los beneficios que puede aportar el uso de Delegate.<\/li>\n\n\n\n<li>El concepto de Delegate lo podemos encontrar tambi\u00e9n como patr\u00f3n arquitect\u00f3nico.<\/li>\n\n\n\n<li>Delegate no es un agrupador de llamados a servicios para ser usado por un controlador.<\/li>\n\n\n\n<li>La excusa de \u201csu responsabilidad es delegar\u201d es bastante carente de argumento dentro de los ingenieros de software que a\u00fan la defienden a capa y espada.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Escrito por SAS (Software Architecture Sabana): Sebastian Pardo, <a href=\"https:\/\/www.linkedin.com\/in\/sergio-andres-gonz%C3%A1lez-roa-61735b250\/\" title=\"Sergio Gonzalez\">Sergio Gonzalez<\/a>,  <a href=\"https:\/\/www.linkedin.com\/in\/richard-lion\/\" title=\"Richard Lion\">Richard Lion<\/a>, <a href=\"https:\/\/www.linkedin.com\/in\/daniel-saavedra-1997ba27\/\" title=\"Daniel Saavedra\">Daniel Saavedra<\/a>. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comencemos por el patr\u00f3n Facade. Imagina que tienes un problema el cual para solucionarlo requiere de diferentes conocimientos en distintos temas. Veamos el siguiente ejemplo: Tienes dificultades con la instalaci\u00f3n el\u00e9ctrica de tu hogar y hay interruptores que no funcionan correctamente junto con luces que parpadean, es tu responsabilidad darle soluci\u00f3n a esas dificultades, pero &#8230; <a title=\"Facade &amp; Delegate en nuestras arquitecturas de software\" class=\"read-more\" href=\"https:\/\/lafilosofiadelsoftware.com\/index.php\/2023\/05\/21\/facade-delegate-en-nuestras-arquitecturas-de-software\/\" aria-label=\"Leer m\u00e1s sobre Facade &amp; Delegate en nuestras arquitecturas de software\">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":[8,37,36,34,40,39,50,51,38,20],"class_list":["post-251","post","type-post","status-publish","format-standard","hentry","category-clean-architecture","tag-clean-code","tag-delegate","tag-facade","tag-ieeeunisabana","tag-patron","tag-patron-de-diseno","tag-patron-delegate","tag-patron-facade","tag-sas","tag-solid"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/posts\/251"}],"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=251"}],"version-history":[{"count":13,"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/posts\/251\/revisions"}],"predecessor-version":[{"id":277,"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/posts\/251\/revisions\/277"}],"wp:attachment":[{"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/media?parent=251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/categories?post=251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lafilosofiadelsoftware.com\/index.php\/wp-json\/wp\/v2\/tags?post=251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}