{"id":229071,"date":"2022-11-02T18:07:00","date_gmt":"2022-11-02T15:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229071"},"modified":"2022-11-09T05:25:22","modified_gmt":"2022-11-09T02:25:22","slug":"introduccion-al-patron-del-repositorio","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/introduccion-al-patron-del-repositorio\/","title":{"rendered":"Introducci\u00f3n al patr\u00f3n del repositorio"},"content":{"rendered":"\n<p>Cada vez que trabaja en un proyecto m\u00e1s grande que se basa en WordPress, las probabilidades de que trabaje con m\u00e1s de una sola fuente de datos, es decir, la base de datos de WordPress, son m\u00e1s altas de lo normal. Por ejemplo, puede estar trabajando en un proyecto que tiene que coordinar informaci\u00f3n de:<\/p>\n<ul>\n<li>la base de datos de WordPress,<\/li>\n<li>un sistema de tickets de la mesa de ayuda,<\/li>\n<li>un sistema de importaci\u00f3n de contenido,<\/li>\n<li>otra API de terceros,<\/li>\n<li>y posible m\u00e1s.<\/li>\n<\/ul>\n<p>Y cuando esto sucede, puede volverse un poco engorroso escribir c\u00f3digo que facilite la recuperaci\u00f3n de informaci\u00f3n de esos diferentes lugares. De esto suelen hablar los desarrolladores cuando se refieren a tratar con &quot;capas&quot; en su aplicaci\u00f3n. Es decir,<\/p>\n<ul>\n<li>hay capas para presentar informaci\u00f3n al usuario,<br \/>\ncapas para manejar la l\u00f3gica empresarial (o l\u00f3gica de dominio),<\/li>\n<li>capas para comunicarse con las API,<\/li>\n<li>y capas para almacenar datos.<\/li>\n<\/ul>\n<p>Honestamente, no es necesario tener una variedad de almacenes de datos para observar para crear una capa que facilite el env\u00edo y la recuperaci\u00f3n de datos de la base de datos, justo cuando es m\u00e1s com\u00fan. Puede trabajar con la misma eficacia con un \u00fanico almac\u00e9n de datos, como la base de datos de WordPress, al implementar el patr\u00f3n de repositorio.<\/p>\n<p>De todos modos, si est\u00e1 creando un sitio web, una aplicaci\u00f3n web o un complemento m\u00e1s grande, implementar el patr\u00f3n de repositorio es algo que puede generar beneficios en el mantenimiento, la claridad del c\u00f3digo y la separaci\u00f3n de preocupaciones.<\/p>\n<p>Pero, \u00bfc\u00f3mo podr\u00eda implementarse esto dentro de WordPress? No es un gran desaf\u00edo, pero primero, vale la pena revisar un manual de repositorio antes de saltar a cualquier c\u00f3digo.<\/p>\n<h2>Una cartilla de patrones de repositorio<\/h2>\n<p>Antes de ver una implementaci\u00f3n real en WordPress, es importante comprender qu\u00e9 es el repositorio, c\u00f3mo se define, qu\u00e9 ofrece y una implementaci\u00f3n gen\u00e9rica del mismo. Compartir\u00e9 algunas lecturas adicionales al final del art\u00edculo, pero hasta entonces cubrir\u00e9 mi opini\u00f3n general sobre el patr\u00f3n aqu\u00ed.<\/p>\n<p>Primero, la implementaci\u00f3n de este patr\u00f3n puede volverse m\u00e1s complicada de lo necesario para los principiantes. Esto no quiere decir que no valga la pena entender el patr\u00f3n real, pero si solo busca mojarse con esto, no soy un fan\u00e1tico de arrojar a los lectores al fondo. No creo que sea la mejor manera de aprender.<\/p>\n<p>En cambio, vale la pena dividir el problema y luego reconstruirlo en algo un poco m\u00e1s elegante. As\u00ed que eso es lo que voy a intentar hacer.<\/p>\n<h3>Una palabra sobre el desacoplamiento<\/h3>\n<p>Cuando hablamos de programaci\u00f3n orientada a objetos, a menudo hablamos de la idea de &quot;desacoplar&quot; partes del sistema. Si est\u00e1 familiarizado con <a href=\"https:\/\/8thlight.com\/blog\/uncle-bob\/2014\/05\/08\/SingleReponsibilityPrinciple.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">el acoplamiento y la cohesi\u00f3n<\/a>, entonces sabe por qu\u00e9.<\/p>\n<p>Pero si no, baste decir que cuanto m\u00e1s acoplados est\u00e9n los componentes de su sistema, m\u00e1s dif\u00edcil ser\u00e1 cambiarlos. Saben demasiado el uno del otro. Es decir, si cambia uno de los aspectos del sistema, es probable que se produzca una cascada o un impacto en otra parte del sistema que nunca tuvo la intenci\u00f3n de que sucediera. Luego, tendr\u00e1 que pasar mucho m\u00e1s tiempo reparando todos estos otros &quot;puntos de contacto&quot; en todo el sistema que no deber\u00edan ser necesarios.<\/p>\n<p>La implementaci\u00f3n de varias estrategias, como el patr\u00f3n de repositorio, puede ayudar a desacoplar partes del sistema. Caso en cuesti\u00f3n: la capa de presentaci\u00f3n no sabe c\u00f3mo est\u00e1 organizado el almac\u00e9n de datos subyacente. No necesita saber SQL. No necesita saber que es una base de datos. En cambio, solo necesita saber c\u00f3mo comunicarse con el repositorio.<\/p>\n<p>Bonito, \u00bfverdad?<\/p>\n<p>Esto significa que puede intercambiar el almac\u00e9n de datos de back-end y, suponiendo que su API sea s\u00f3lida; su aplicaci\u00f3n continuar\u00e1 funcionando con poco o ning\u00fan cambio. Y eso es lo que significa estar verdaderamente desacoplado.<\/p>\n<h3>Una implementaci\u00f3n del patr\u00f3n de repositorio<\/h3>\n<p>Entonces, \u00bfc\u00f3mo se ve el patr\u00f3n del repositorio? Como con la mayor\u00eda de los patrones de dise\u00f1o, hay una forma gen\u00e9rica del patr\u00f3n, y eso siempre es \u00fatil, pero creo que tambi\u00e9n nos ayuda a los que trabajamos en WordPress a ver c\u00f3mo podr\u00eda funcionar dentro del contexto de, ya sabes, WordPress.\u00a0<\/p>\n<p>Entonces, primero, quiero desglosar el patr\u00f3n en s\u00ed y luego dar un ejemplo de c\u00f3mo se ver\u00eda cuando se trabaja con WordPress.<\/p>\n<h3>Una implementaci\u00f3n gen\u00e9rica del patr\u00f3n de repositorio<\/h3>\n<p>La implementaci\u00f3n real del patr\u00f3n de repositorio es bastante simple. De hecho, nunca estoy seguro de si es tan \u00fatil porque solo muestra c\u00f3mo los almacenes de datos, el repositorio y el resto de la aplicaci\u00f3n interact\u00faan entre s\u00ed.<\/p>\n<p>No me malinterpreten: estoy a favor de los modelos conceptuales de c\u00f3mo se organizan las cosas. Personalmente, me ayuda pensar en la estructura de una aplicaci\u00f3n cuando la construyo, pero si es demasiado general, no es de mucha ayuda.<\/p>\n<p>Pero para llegar a un implemento concreto, tenemos que empezar por alguna parte, \u00bfno? As\u00ed que empezar\u00e9 en el nivel m\u00e1s alto posible y trabajar\u00e9 hacia abajo.<\/p>\n<p>Como puede ver en la imagen de arriba, tiene un par de almacenes de datos, todos los cuales se leen a trav\u00e9s del repositorio, y luego la aplicaci\u00f3n consulta el repositorio que, a su vez, recupera informaci\u00f3n del almac\u00e9n de datos.<\/p>\n<p>S\u00ed, hay opciones para almacenar informaci\u00f3n en cach\u00e9, invalidar el cach\u00e9 y todas esas cosas divertidas. Pero est\u00e1 fuera del alcance de una primaria del repositorio. As\u00ed que no voy a seguir ese camino en particular por ahora. Tal vez en una publicaci\u00f3n futura (si esta te resulta \u00fatil).<\/p>\n<h2>El patr\u00f3n de repositorio en WordPress<\/h2>\n<p>Dicho esto, echemos un vistazo a una implementaci\u00f3n b\u00e1sica de c\u00f3mo se ver\u00eda esto en una instalaci\u00f3n est\u00e1ndar de WordPress. Es decir, todo lo que tenemos es el almac\u00e9n de datos. No nos estamos comunicando con nada m\u00e1s, pero queremos asegurarnos de que todo lo que interact\u00faa con la base de datos o la API sea manejado por el repositorio.<\/p>\n<p>Esto se ver\u00eda algo como esto:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a689f876.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a689f876.png\" alt=\"Introducci\u00f3n al patr\u00f3n del repositorio\" ><\/a><\/p>\n<p>C\u00f3mo podr\u00eda verse con WordPress<\/p>\n<p>Y esto se puede resumir a\u00fan m\u00e1s. Tal vez haya un repositorio de publicaciones o un repositorio de usuarios. Personalmente, soy fan\u00e1tico de tener un repositorio para cada tipo de entidad porque ayuda a contener la l\u00f3gica comercial relacionada sin crear esas grandes clases que lo saben todo (e innecesariamente).<\/p>\n<p>As\u00ed que esto podr\u00eda verse as\u00ed:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a6e78654.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166793-61e79a6e78654.png\" alt=\"Introducci\u00f3n al patr\u00f3n del repositorio\" ><\/a><\/p>\n<p>Un paquete de repositorios<\/p>\n<p>Luego, subamos un nivel m\u00e1s y digamos que est\u00e1 trabajando con la API de Twitter, la API de ZenDesk, la API de usuario de WordPress y la API de publicaci\u00f3n de WordPress. \u00bfY que? Hay m\u00e1s repositorios.<\/p>\n<p>Tal vez est\u00e9n contenidos en su espacio de nombres (que deber\u00edan estar), tal vez est\u00e9n implementando una interfaz com\u00fan (para lo cual existe un caso), pero durante el tiempo de desarrollo, creo que es importante indicar expl\u00edcitamente qu\u00e9 repositorio est\u00e1 utilizando. para que quede lo m\u00e1s claro posible.<\/p>\n<p>Es decir, no use un gen\u00e9rico y deje que el tiempo de ejecuci\u00f3n lo resuelva:<\/p>\n<pre><code>$support_repository = new Support_Repository();\n$support_repository-&gt;get_tickets_for( 'tommcfarlin' );<\/code><\/pre>\n<p>En su lugar, sea expl\u00edcito:<\/p>\n<pre><code>$zendesk_repository = new ZenDesk_Repository();\n$zendesk_repository-&gt;get_tickets_from( 'yesterday' );<\/code><\/pre>\n<p>Esto puede parecer mucho. No s\u00e9 si experimenta esto, pero hay una sensaci\u00f3n extra\u00f1a en la programaci\u00f3n orientada a objetos donde queremos crear clases peque\u00f1as y enfocadas, pero crea muchos archivos.<\/p>\n<p>As\u00ed que tienes estos archivos cuidadosamente configurados, cada uno de los cuales est\u00e1 haciendo algo peque\u00f1o y con un prop\u00f3sito. No permita que la cantidad de archivos que componen un proyecto le d\u00e9 la impresi\u00f3n de que tiene una arquitectura deficiente.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Este es el manual b\u00e1sico sobre el patr\u00f3n del repositorio. Naturalmente, hay un c\u00f3digo que va junto con esto, pero antes de profundizar en esa parte, porque el c\u00f3digo es donde las cosas se pierden f\u00e1cilmente en la traducci\u00f3n, quer\u00eda asegurarme de ayudar a proporcionar una ilustraci\u00f3n para desarrollar un modelo conceptual de c\u00f3mo funciona el patr\u00f3n.<\/p>\n<p>A partir de aqu\u00ed, podemos empezar a hablar de una implementaci\u00f3n del patr\u00f3n. As\u00ed que en la pr\u00f3xima publicaci\u00f3n o en las pr\u00f3ximas dos publicaciones, har\u00e9 exactamente eso.<\/p>\n<p>Mientras tanto, no dude en dejar cualquier comentario o pregunta sobre lo que hemos cubierto aqu\u00ed.<\/p>\n<h2>Lectura relacionada<\/h2>\n<ul>\n<li><a href=\"https:\/\/8thlight.com\/blog\/mike-ebert\/2013\/03\/23\/the-repository-pattern.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">El patr\u00f3n de repositorio a trav\u00e9s de 8th Light<\/a><\/li>\n<li><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ff649690.aspx\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">El patr\u00f3n de repositorio a trav\u00e9s de MSDN<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/clean\/repository\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Una implementaci\u00f3n del patr\u00f3n de repositorio<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Implementar el patr\u00f3n del repositorio no es terriblemente dif\u00edcil, pero vale la pena revisar un manual del repositorio antes de saltar a cualquier c\u00f3digo.<\/p>\n","protected":false},"author":1,"featured_media":223973,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,914,840],"tags":[1172],"class_list":["post-229071","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-otro","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=229071"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/229071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=229071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=229071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=229071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}