{"id":229471,"date":"2022-11-03T19:22:00","date_gmt":"2022-11-03T16:22:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229471"},"modified":"2022-11-09T07:14:31","modified_gmt":"2022-11-09T04:14:31","slug":"beneficios-do-padrao-de-repositorio-por-que-devemos-considera-lo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/beneficios-do-padrao-de-repositorio-por-que-devemos-considera-lo\/","title":{"rendered":"Benef\u00edcios do padr\u00e3o de reposit\u00f3rio: por que devemos consider\u00e1-lo"},"content":{"rendered":"\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/o-primer-do-padrao-de-repositorio\/\" title=\"Ontem\" >Ontem<\/a>, dei uma cartilha sobre o padr\u00e3o de reposit\u00f3rio. Resumindo, \u00e9 um daqueles padr\u00f5es que eu acho que qualquer um que trabalhe em middleware constru\u00eddo em cima do WordPress deveria entender.<\/p>\n<p>Ao dar uma cartilha em um padr\u00e3o como este, pode ser dif\u00edcil fazer justi\u00e7a ao padr\u00e3o quando voc\u00ea precisa:<\/p>\n<ul>\n<li>apresent\u00e1-lo,<\/li>\n<li>explicar como funciona,<\/li>\n<li>cobrir os benef\u00edcios,<\/li>\n<li>e d\u00ea uma pequena demonstra\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Mas a vantagem real do reposit\u00f3rio n\u00e3o est\u00e1 apenas em abstrair a camada de dados do resto do aplicativo, mas tamb\u00e9m no fato de que ela pode (ou deve) ser facilmente trocada por v\u00e1rios armazenamentos de dados sem alterar a API.<\/p>\n<p>Por exemplo, em uma inst\u00e2ncia, voc\u00ea pode precisar recuperar dados do banco de dados do WordPress, em outros casos voc\u00ea pode precisar recuperar algo de uma API de terceiros, ou talvez haja algum outro lugar do qual voc\u00ea precise recuperar dados.<\/p>\n<p>Independentemente disso, a ideia por tr\u00e1s do padr\u00e3o de reposit\u00f3rio \u00e9 que o que quer que esteja por tr\u00e1s dele n\u00e3o importa, desde que a API que ele fornece funcione para a camada do aplicativo que a chama.<\/p>\n<p>E j\u00e1 que cobrimos uma cartilha sobre o padr\u00e3o de reposit\u00f3rio, vamos dar uma olhada em alguns dos benef\u00edcios do padr\u00e3o de reposit\u00f3rio e como podemos implement\u00e1-lo no contexto de projetos do WordPress.<\/p>\n<h2>Benef\u00edcios do padr\u00e3o de reposit\u00f3rio<\/h2>\n<p>Existem algumas maneiras de come\u00e7ar a explicar o padr\u00e3o, ent\u00e3o vou come\u00e7ar com um diagrama simples:<\/p>\n<p>Os benef\u00edcios do padr\u00e3o de reposit\u00f3rio incluem abstra\u00e7\u00e3o de armazenamento de dados<\/p>\n<p>Observe na imagem acima, existem tr\u00eas componentes principais:<\/p>\n<ol>\n<li>a l\u00f3gica de dom\u00ednio (ou a l\u00f3gica de neg\u00f3cios) que rotulei como &quot;Aplicativo&quot;,<\/li>\n<li>o reposit\u00f3rio,<\/li>\n<li>o armazenamento de dados,<\/li>\n<\/ol>\n<p>Em rela\u00e7\u00e3o \u00e0 aplica\u00e7\u00e3o, as regras de neg\u00f3cio permanecer\u00e3o sempre relativamente consistentes. Pelo menos deveriam, certo?<\/p>\n<p>O reposit\u00f3rio \u00e9 o que atua como um meio de comunica\u00e7\u00e3o entre a l\u00f3gica de neg\u00f3cios e o armazenamento de dados.<\/p>\n<p>Agora, o armazenamento de dados pode ser um banco de dados, talvez um conjunto de arquivos (o que eu n\u00e3o recomendaria), uma API para terceiros, uma lista de informa\u00e7\u00f5es recuperadas de outro aplicativo e assim por diante.<\/p>\n<p>O ponto \u00e9 que o reposit\u00f3rio fornecer\u00e1 uma API limpa na qual a l\u00f3gica de neg\u00f3cios pode gravar e ler (e mais sobre isso daqui a pouco) sem se preocupar com os detalhes de para onde os dados est\u00e3o indo ou como est\u00e3o voltando.<\/p>\n<p>Esse \u00e9 o trabalho do reposit\u00f3rio. E \u00e9 isso que torna importante ter uma API consistente e \u00e9 isso que \u00e9 importante para garantir que ela tenha os detalhes de implementa\u00e7\u00e3o do armazenamento de dados com o qual est\u00e1 interagindo.<\/p>\n<h3>No acoplamento<\/h3>\n<p>Al\u00e9m de ter seu aplicativo devidamente segmentado, o padr\u00e3o de reposit\u00f3rio beneficia a arquitetura, pois ajuda a desacoplar as partes do seu aplicativo.<\/p>\n<p>Ou seja, a l\u00f3gica de neg\u00f3cios n\u00e3o sabe nada sobre como ou onde os dados s\u00e3o armazenados. Ele apenas sabe que pode escrev\u00ea-lo e recuper\u00e1-lo e pode faz\u00ea-lo usando uma API limpa.<\/p>\n<p>O reposit\u00f3rio \u00e9 respons\u00e1vel por comunicar o referido armazenamento de dados para orquestrar a serializa\u00e7\u00e3o e a recupera\u00e7\u00e3o, mas deve fornecer uma API consistente, para que a camada de dados n\u00e3o precise fazer nenhuma gin\u00e1stica de sintaxe para ler e gravar suas informa\u00e7\u00f5es.<\/p>\n<h3>Detalhes de implementa\u00e7\u00e3o<\/h3>\n<p>At\u00e9 este ponto, tenho representado o reposit\u00f3rio como uma classe concreta.<\/p>\n<p>O problema \u00e9 que um aplicativo provavelmente ter\u00e1 v\u00e1rios reposit\u00f3rios. E por causa disso, \u00e9 uma boa ideia ter interfaces que cada reposit\u00f3rio possa implementar.<\/p>\n<p>\u00c9 assim que voc\u00ea define o contrato de m\u00e9todos que o reposit\u00f3rio fornecer\u00e1. E \u00e9 assim que voc\u00ea pode garantir que cada reposit\u00f3rio esteja conectado ao armazenamento de dados adequado.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-166772-61e79a138aeb3.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-166772-61e79a138aeb3.png\" alt=\"Benef\u00edcios do padr\u00e3o de reposit\u00f3rio: por que devemos consider\u00e1-lo\" ><\/a><\/p>\n<p>Uma implementa\u00e7\u00e3o de interface para v\u00e1rios reposit\u00f3rios.<\/p>\n<p>Ent\u00e3o, digamos que seu aplicativo precise conversar com o banco de dados do WordPress, bem como com uma API de terceiros.<\/p>\n<p>Idealmente, a interface forneceria um conjunto comum de m\u00e9todos, mas os detalhes de implementa\u00e7\u00e3o variariam por reposit\u00f3rio, pois cada reposit\u00f3rio ter\u00e1 as credenciais necess\u00e1rias e a capacidade de se comunicar com o armazenamento de dados.<\/p>\n<p>O avan\u00e7o para a interface, por\u00e9m, \u00e9 o que d\u00e1 ao padr\u00e3o seu poder. A l\u00f3gica de dom\u00ednio n\u00e3o precisa se preocupar com como as informa\u00e7\u00f5es s\u00e3o salvas ou recuperadas. Ele simplesmente chama os m\u00e9todos conforme definidos na interface e o objeto necess\u00e1rio cuida disso.<\/p>\n<p>Ele simplesmente chama os m\u00e9todos conforme definidos na interface e o objeto necess\u00e1rio cuida disso.<\/p>\n<h2>Como seria isso no WordPress?<\/h2>\n<p>Esta \u00e9 uma boa pergunta (e n\u00e3o, eu n\u00e3o inventei apenas para responder por conta pr\u00f3pria \ud83d\ude42), e pode ser dif\u00edcil dar um \u00f3timo exemplo porque muito do que fazemos interage diretamente com o banco de dados do WordPress.<\/p>\n<p>Isso n\u00e3o significa que n\u00e3o haja abstra\u00e7\u00f5es que possamos usar, como Posts, P\u00e1ginas, Usu\u00e1rios ou qualquer outro tipo de postagem personalizado que optamos por criar.<\/p>\n<p>Mas o WordPress fornece uma API para muito disso. Eu posso ver um caso em que, digamos, um usu\u00e1rio com campos adicionais que foram adicionados poderia se beneficiar de um Reposit\u00f3rio de Usu\u00e1rios.<\/p>\n<p>Ou um tipo de postagem personalizado com muitos metadados tamb\u00e9m pode se beneficiar de um reposit\u00f3rio ao ter os detalhes encapsulados no reposit\u00f3rio.<\/p>\n<h3>Um exemplo de alto n\u00edvel<\/h3>\n<p>Digamos, por exemplo, que voc\u00ea tenha um tipo de postagem personalizado para um evento, e o evento tenha um t\u00edtulo e uma descri\u00e7\u00e3o que se encaixem naturalmente no t\u00edtulo e no conte\u00fado da postagem.<\/p>\n<p>Mas ent\u00e3o ele tem metadados sobre sua localiza\u00e7\u00e3o, seu hor\u00e1rio de in\u00edcio, seu hor\u00e1rio de t\u00e9rmino e assim por diante. Isso tamb\u00e9m pode ser encapsulado pelo reposit\u00f3rio para que voc\u00ea possa ter um objeto Event, pass\u00e1-lo para o reposit\u00f3rio e permitir que o reposit\u00f3rio envie as informa\u00e7\u00f5es para o local apropriado no banco de dados.<\/p>\n<p>E o mesmo vale para recuperar as informa\u00e7\u00f5es: ele sabe onde obt\u00ea-las, como preencher um objeto Event e, em seguida, devolv\u00ea-las ao chamador.<\/p>\n<h2>De volta \u00e0 pista<\/h2>\n<p>Mas toda essa conversa sobre um evento est\u00e1 ficando um pouco fora do t\u00f3pico, ent\u00e3o talvez eu continue falando sobre isso e como ele se encaixa com o reposit\u00f3rio em um post de acompanhamento. Claramente, ao falar sobre isso, h\u00e1 muito o que cobrir.<\/p>\n<p>Eu prefiro lev\u00e1-lo em passos menores<\/p>\n<p>Resumindo, se voc\u00ea tiver um Reposit\u00f3rio de Eventos, provavelmente ter\u00e1 um objeto Evento ou uma entidade Evento. E como isso se encaixa no WordPress, tipos de postagem personalizados, metadados e assim por diante introduz um n\u00edvel de complexidade que pode parecer assustador no in\u00edcio, mas compensa quando se trabalha com um aplicativo da Web maior.<\/p>\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>Vamos dar uma olhada em alguns dos benef\u00edcios do padr\u00e3o de reposit\u00f3rio e como podemos implement\u00e1-lo no contexto de projetos do WordPress.<\/p>\n","protected":false},"author":1,"featured_media":223872,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[722,920,846],"tags":[1170],"class_list":["post-229471","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-outro","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229471","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=229471"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229471\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/223872"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}