{"id":229464,"date":"2022-11-02T18:29:00","date_gmt":"2022-11-02T15:29:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229464"},"modified":"2022-11-09T07:12:04","modified_gmt":"2022-11-09T04:12:04","slug":"o-primer-do-padrao-de-repositorio","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/o-primer-do-padrao-de-repositorio\/","title":{"rendered":"O primer do padr\u00e3o de reposit\u00f3rio"},"content":{"rendered":"\n<p>Sempre que voc\u00ea estiver trabalhando em um projeto maior baseado no WordPress, as chances de trabalhar com mais de uma \u00fanica fonte de dados \u2013 ou seja, o banco de dados do WordPress \u2013 s\u00e3o maiores que o normal. Por exemplo, voc\u00ea pode estar trabalhando em um projeto que precisa coordenar informa\u00e7\u00f5es de:<\/p>\n<ul>\n<li>o banco de dados do WordPress,<\/li>\n<li>um sistema de t\u00edquetes de help desk,<\/li>\n<li>um sistema de importa\u00e7\u00e3o de conte\u00fado,<\/li>\n<li>outra API de terceiros,<\/li>\n<li>e poss\u00edvel mais.<\/li>\n<\/ul>\n<p>E quando isso acontece, pode se tornar um pouco complicado escrever c\u00f3digo que facilite a recupera\u00e7\u00e3o de informa\u00e7\u00f5es desses lugares diferentes. \u00c9 disso que os desenvolvedores costumam falar quando se referem a lidar com &#8220;camadas&quot; em seus aplicativos.<\/p>\n<ul>\n<li>existem camadas para apresentar informa\u00e7\u00f5es ao usu\u00e1rio,<br \/>\ncamadas para lidar com a l\u00f3gica de neg\u00f3cios (ou l\u00f3gica de dom\u00ednio),<\/li>\n<li>camadas para comunica\u00e7\u00e3o com APIs,<\/li>\n<li>e camadas para armazenamento de dados.<\/li>\n<\/ul>\n<p>Honestamente, voc\u00ea n\u00e3o precisa ter uma variedade de armazenamentos de dados para observar para criar uma camada que facilite o envio e a recupera\u00e7\u00e3o de dados do banco de dados, \u00e9 exatamente quando isso \u00e9 mais comum. Voc\u00ea pode trabalhar com a mesma efic\u00e1cia com um \u00fanico armazenamento de dados, como o banco de dados WordPress, ao implementar o padr\u00e3o de reposit\u00f3rio.<\/p>\n<p>Independentemente disso, se voc\u00ea estiver construindo um site maior, aplicativo da Web ou plug-in, implementar o padr\u00e3o de reposit\u00f3rio \u00e9 algo que pode render dividendos em manuten\u00e7\u00e3o, clareza de c\u00f3digo e separa\u00e7\u00e3o de interesses.<\/p>\n<p>Mas como isso pode ser implementado no WordPress? N\u00e3o \u00e9 muito desafiador, mas primeiro, vale a pena revisar uma cartilha de reposit\u00f3rio antes de pular para qualquer c\u00f3digo.<\/p>\n<h2>Um primer de padr\u00e3o de reposit\u00f3rio<\/h2>\n<p>Antes de olhar para uma implementa\u00e7\u00e3o real no WordPress, \u00e9 importante entender o que \u00e9 o reposit\u00f3rio, como ele \u00e9 definido, o que ele oferece e uma implementa\u00e7\u00e3o gen\u00e9rica dele. Compartilharei algumas leituras adicionais no final do artigo, mas at\u00e9 l\u00e1 cobrirei minha opini\u00e3o geral sobre o padr\u00e3o aqui.<\/p>\n<p>Primeiro, uma implementa\u00e7\u00e3o desse padr\u00e3o pode se tornar mais complicada do que o necess\u00e1rio para iniciantes. Isso n\u00e3o quer dizer que o padr\u00e3o real n\u00e3o valha a pena entender, mas se voc\u00ea est\u00e1 apenas querendo se molhar com isso, n\u00e3o sou f\u00e3 de jogar os leitores no fundo do po\u00e7o. N\u00e3o acho que seja a melhor maneira de aprender.<\/p>\n<p>Em vez disso, vale a pena quebrar o problema e depois reconstru\u00ed-lo em algo um pouco mais elegante. Ent\u00e3o \u00e9 isso que eu pretendo fazer.<\/p>\n<h3>Uma palavra sobre desacoplamento<\/h3>\n<p>Ao falar sobre programa\u00e7\u00e3o orientada a objetos, muitas vezes falamos sobre a ideia de &#8220;desacoplar&#8221; partes do sistema. Se voc\u00ea est\u00e1 familiarizado com <a href=\"https:\/\/8thlight.com\/blog\/uncle-bob\/2014\/05\/08\/SingleReponsibilityPrinciple.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">acoplamento e coes\u00e3o<\/a>, ent\u00e3o sabe por qu\u00ea.<\/p>\n<p>Mas se n\u00e3o, basta dizer que quanto mais acoplados forem os componentes do seu sistema, mais dif\u00edcil ser\u00e1 alter\u00e1-los. Eles sabem muito um do outro. Ou seja, se voc\u00ea alterar um dos aspectos do sistema, \u00e9 prov\u00e1vel que ocorra uma cascata ou impacto em outra parte do sistema que voc\u00ea nunca quis que acontecesse. Ent\u00e3o voc\u00ea tem que gastar muito mais tempo corrigindo todos esses outros &#8220;pontos de contato&#8221; em todo o sistema que n\u00e3o deveriam ser necess\u00e1rios.<\/p>\n<p>A implementa\u00e7\u00e3o de v\u00e1rias estrat\u00e9gias, como o padr\u00e3o de reposit\u00f3rio, pode ajudar a desacoplar partes do sistema. Caso em quest\u00e3o: a camada de apresenta\u00e7\u00e3o n\u00e3o sabe como o armazenamento de dados subjacente \u00e9 a organiza\u00e7\u00e3o. Ele n\u00e3o precisa saber SQL. Ele n\u00e3o precisa saber que \u00e9 um banco de dados. Em vez disso, ele s\u00f3 precisa saber como falar com o reposit\u00f3rio.<\/p>\n<p>Legal, certo?<\/p>\n<p>Isso significa que voc\u00ea pode trocar o armazenamento de dados de back-end e, supondo que sua API seja s\u00f3lida; seu aplicativo continuar\u00e1 funcionando com pouca ou nenhuma altera\u00e7\u00e3o. E \u00e9 isso que significa ser verdadeiramente dissociado.<\/p>\n<h3>Uma implementa\u00e7\u00e3o do padr\u00e3o de reposit\u00f3rio<\/h3>\n<p>Ent\u00e3o, como \u00e9 o padr\u00e3o do reposit\u00f3rio? Como acontece com a maioria dos padr\u00f5es de design, h\u00e1 uma forma gen\u00e9rica do padr\u00e3o, e isso \u00e9 sempre \u00fatil, mas acho que tamb\u00e9m ajuda aqueles que trabalham no WordPress a ver como ele pode funcionar no contexto do WordPress.\u00a0<\/p>\n<p>Ent\u00e3o, primeiro, quero detalhar o padr\u00e3o em si e, em seguida, dar um exemplo de como pode ser ao trabalhar com o WordPress.<\/p>\n<h3>Um Implemento Gen\u00e9rico do Padr\u00e3o de Reposit\u00f3rio<\/h3>\n<p>A implementa\u00e7\u00e3o real do padr\u00e3o de reposit\u00f3rio \u00e9 bem simples. Na verdade, nunca tenho certeza se isso \u00e9 \u00fatil porque apenas mostra como os armazenamentos de dados, o reposit\u00f3rio e o restante do aplicativo interagem entre si.<\/p>\n<p>N\u00e3o me entenda mal: sou a favor de modelos conceituais de como as coisas s\u00e3o organizadas. Pessoalmente, isso me ajuda a pensar na estrutura de um aplicativo ao constru\u00ed-lo, mas se for muito geral, n\u00e3o ajudar\u00e1 muito.<\/p>\n<p>Mas para chegar a um implemento concreto, temos que come\u00e7ar de algum lugar, certo? Ent\u00e3o eu vou come\u00e7ar no n\u00edvel mais alto poss\u00edvel e trabalhar para baixo.<\/p>\n<p>Como voc\u00ea pode ver na imagem acima, voc\u00ea tem alguns armazenamentos de dados que s\u00e3o lidos por meio do reposit\u00f3rio e, em seguida, o aplicativo consulta o reposit\u00f3rio que, por sua vez, recupera informa\u00e7\u00f5es do armazenamento de dados.<\/p>\n<p>Sim, existem op\u00e7\u00f5es para armazenar informa\u00e7\u00f5es em cache, invalidar o cache e todas essas coisas divertidas. Mas est\u00e1 fora do escopo de um prim\u00e1rio do reposit\u00f3rio. Portanto, n\u00e3o vou seguir esse caminho espec\u00edfico por enquanto. Talvez em um post futuro (se este for \u00fatil para voc\u00ea).<\/p>\n<h2>O padr\u00e3o de reposit\u00f3rio no WordPress<\/h2>\n<p>Ent\u00e3o, com isso dito, vamos dar uma olhada em uma implementa\u00e7\u00e3o b\u00e1sica de como isso pode parecer em uma instala\u00e7\u00e3o padr\u00e3o do WordPress. Ou seja, tudo o que temos \u00e9 o armazenamento de dados. N\u00e3o estamos nos comunicando com mais nada, mas queremos garantir que qualquer coisa que fa\u00e7a interface com o banco de dados ou a API seja tratada pelo reposit\u00f3rio<\/p>\n<p>Isso ficaria mais ou menos assim:<\/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=\"O primer do padr\u00e3o de reposit\u00f3rio\" ><\/a><\/p>\n<p>Como pode ficar com o WordPress<\/p>\n<p>E isso pode ser abstra\u00eddo ainda mais. Talvez haja um Post Repository ou um User Repository. Pessoalmente, sou f\u00e3 de ter um reposit\u00f3rio para cada tipo de entidade porque ajuda a conter a l\u00f3gica de neg\u00f3cios relacionada sem criar aquelas grandes classes que sabem tudo (e desnecessariamente).<\/p>\n<p>Ent\u00e3o isso pode ficar assim:<\/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=\"O primer do padr\u00e3o de reposit\u00f3rio\" ><\/a><\/p>\n<p>Um pacote de reposit\u00f3rios<\/p>\n<p>Ent\u00e3o vamos subir mais um n\u00edvel e dizer que voc\u00ea est\u00e1 trabalhando com a API do Twitter, a API do ZenDesk, a API do usu\u00e1rio do WordPress e a API do WordPress Post. Ent\u00e3o o que? Existem mais reposit\u00f3rios.<\/p>\n<p>Talvez eles estejam contidos em seu namespace (o que deveriam estar), talvez estejam implementando uma interface comum (para o qual h\u00e1 um caso para isso), mas durante o tempo de desenvolvimento, acho importante declarar explicitamente qual reposit\u00f3rio voc\u00ea est\u00e1 usando para ser o mais claro poss\u00edvel.<\/p>\n<p>Ou seja, n\u00e3o use um gen\u00e9rico e deixe o tempo de execu\u00e7\u00e3o descobrir:<\/p>\n<pre><code>$support_repository = new Support_Repository();\n$support_repository-&gt;get_tickets_for( 'tommcfarlin' );<\/code><\/pre>\n<p>Em vez disso, seja expl\u00edcito:<\/p>\n<pre><code>$zendesk_repository = new ZenDesk_Repository();\n$zendesk_repository-&gt;get_tickets_from( 'yesterday' );<\/code><\/pre>\n<p>Isso pode parecer muito. N\u00e3o sei se voc\u00ea experimenta isso, mas h\u00e1 uma sensa\u00e7\u00e3o estranha na programa\u00e7\u00e3o orientada a objetos, onde queremos criar as classes pequenas e focadas, mas isso cria muitos arquivos.<\/p>\n<p>Ent\u00e3o voc\u00ea tem esses arquivos bem configurados, cada um dos quais est\u00e1 fazendo algo pequeno e proposital. N\u00e3o deixe que a quantidade de arquivos que comp\u00f5em um projeto d\u00ea a impress\u00e3o de que voc\u00ea tem uma arquitetura ruim.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Esta \u00e9 a cartilha do padr\u00e3o de reposit\u00f3rio. Naturalmente, h\u00e1 c\u00f3digo que acompanha isso, mas antes de mergulhar nessa parte \u2013 porque c\u00f3digo \u00e9 onde as coisas se perdem facilmente na tradu\u00e7\u00e3o \u2013 eu queria ter certeza de ajudar a fornecer uma ilustra\u00e7\u00e3o para desenvolver um modelo conceitual de como o padr\u00e3o funciona.<\/p>\n<p>A partir daqui, podemos come\u00e7ar a falar sobre uma implementa\u00e7\u00e3o do padr\u00e3o. Ent\u00e3o, no pr\u00f3ximo post ou nos pr\u00f3ximos posts, vou fazer exatamente isso.<\/p>\n<p>Enquanto isso, n\u00e3o hesite em deixar coment\u00e1rios ou perguntas sobre o que abordamos aqui.<\/p>\n<h2>Leitura 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\">O Padr\u00e3o do Reposit\u00f3rio via 8\u00aa Luz<\/a><\/li>\n<li><a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ff649690.aspx\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">O padr\u00e3o de reposit\u00f3rio via MSDN<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/clean\/repository\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Uma implementa\u00e7\u00e3o do padr\u00e3o de reposit\u00f3rio<\/a><\/li>\n<\/ul>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <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 o padr\u00e3o de reposit\u00f3rio n\u00e3o \u00e9 muito dif\u00edcil, mas vale a pena revisar uma cartilha de reposit\u00f3rio antes de pular para qualquer 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":[898,722,920,846],"tags":[1170],"class_list":["post-229464","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-outro","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229464","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=229464"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229464\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223973"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229464"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229464"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229464"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}