{"id":229441,"date":"2022-11-02T10:46:00","date_gmt":"2022-11-02T07:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229441"},"modified":"2022-11-09T07:04:42","modified_gmt":"2022-11-09T04:04:42","slug":"singletons-no-wordpress-revisitados-a-time-and-a-place","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/singletons-no-wordpress-revisitados-a-time-and-a-place\/","title":{"rendered":"Singletons no WordPress, revisitados (A Time and a Place?)"},"content":{"rendered":"\n<p>Antes de come\u00e7ar um post falando sobre o uso de singletons no WordPress (ou, mais apropriadamente, o <a href=\"https:\/\/tommcfarlin.com\/singleton-pattern-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Singleton Pattern<\/a> ), quero ter certeza de que voc\u00ea leu os dois artigos a seguir:<\/p>\n<ul>\n<li><a href=\"http:\/\/wpkrauts.com\/2013\/cloning-in-php-or-why-your-singleton-might-kill-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Clonagem em PHP, ou por que seu singleton pode matar o WordPress<\/a> por <a href=\"https:\/\/twitter.com\/toscho\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Thomas Scholz<\/a><\/li>\n<li><a href=\"https:\/\/carlalexander.ca\/singletons-in-wordpress\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Singletons e seu uso no WordPress<\/a> por <a href=\"https:\/\/twitter.com\/twigpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Carl Alexander<\/a><\/li>\n<\/ul>\n<p>Ambos os artigos fornecem uma perspectiva imensamente valiosa sobre esse padr\u00e3o e os perigos de us\u00e1-lo ao longo de nosso trabalho no WordPress; no entanto, isso significa que devemos evit\u00e1-los completamente?<\/p>\n<p>Eu n\u00e3o acho.<\/p>\n<p>Ent\u00e3o, novamente, eu tamb\u00e9m reconhe\u00e7o que os artigos n\u00e3o est\u00e3o dizendo para evit\u00e1-los completamente. Eles est\u00e3o dando casos fortes de como us\u00e1-los e os perigos de us\u00e1-los, caso voc\u00ea opte por faz\u00ea-lo.<\/p>\n<p>E embora eu definitivamente os tenha usado no passado, geralmente parei. No entanto, recentemente me deparei com um caso de uso para um projeto no qual acho aceit\u00e1vel.<\/p>\n<h2>Ainda usando Singletons no WordPress?<\/h2>\n<p>Para dar uma raz\u00e3o pela qual considero esse padr\u00e3o espec\u00edfico, acho que vale a pena primeiro entender o caso de uso. Para simplificar:<\/p>\n<ul>\n<li>H\u00e1 uma p\u00e1gina de administra\u00e7\u00e3o que permite ao usu\u00e1rio selecionar como deseja exibir as datas no front-end do site.<\/li>\n<li>Quando o usu\u00e1rio salvar a op\u00e7\u00e3o, ele gravar\u00e1 o formato <a href=\"https:\/\/php.net\/manual\/en\/function.date.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">baseado em PHP<\/a> para a data em uma tabela no WordPress.<\/li>\n<li>Ao renderizar uma data, o valor ser\u00e1 recuperado do banco de dados e aplicado \u00e0 data a ser renderizada.<\/li>\n<\/ul>\n<p>E para aqueles que est\u00e3o curiosos, h\u00e1 apenas um punhado \u2013 digamos, quatro ou cinco \u2013 maneiras de permitir que o usu\u00e1rio exiba a data.<\/p>\n<p>Como esse projeto em particular permite que os usu\u00e1rios importem CSVs de dados (que incluem datas) e que permitem renderizar dados dos CSVs, embora em um formato diferente, vale a pena notar que h\u00e1 uma quantidade razo\u00e1vel de formata\u00e7\u00e3o de data acontecendo no back-end.<\/p>\n<p>Naturalmente, surge uma pergunta:<\/p>\n<p>Por que n\u00e3o apenas formatar a data em que o usu\u00e1rio importa seu CSV?<\/p>\n<p>E isso porque o usu\u00e1rio pode optar por alterar a forma como a data \u00e9 renderizada ap\u00f3s a importa\u00e7\u00e3o do CSV.<\/p>\n<p>Com isso dito, h\u00e1 todo esse outro mecanismo no plug-in respons\u00e1vel por validar, sanitizar e gravar a entrada do usu\u00e1rio no banco de dados.<\/p>\n<p>Mas quando chega a hora de pegar valores do banco de dados, especialmente quando vem na forma de ler um valor de uma tabela de banco de dados, e faz\u00ea-lo em v\u00e1rios pontos em todo o aplicativo, n\u00e3o faria sentido ter um \u00fanico ponto de qual o valor pode ser derivado?<\/p>\n<p>Uma vis\u00e3o de alto n\u00edvel de como isso funciona.<\/p>\n<p>Ou, outra maneira de colocar isso, n\u00e3o faz sentido alterar um local no aplicativo que possa facilmente se espalhar pelo restante do aplicativo, em vez de procurar todos os locais poss\u00edveis de:<\/p>\n<ol>\n<li>lendo a op\u00e7\u00e3o<\/li>\n<li>certificando-se de que est\u00e1 definido,<\/li>\n<li>definir um padr\u00e3o se n\u00e3o estiver definido,<\/li>\n<li>e devolvendo o valor?<\/li>\n<\/ol>\n<p>E \u00e9 aqui que vejo um uso v\u00e1lido de um singleton no WordPress entrando em a\u00e7\u00e3o: uma maneira de ler dados em v\u00e1rios pontos em todo o aplicativo. Isso traz consigo, no entanto, algumas implica\u00e7\u00f5es:<\/p>\n<ul>\n<li>a classe n\u00e3o precisa ser instanciada mais de uma vez (quer dizer, essa \u00e9 a ideia do singleton),<\/li>\n<li>n\u00e3o estar\u00e1 lidando com dados mut\u00e1veis,<\/li>\n<li>n\u00e3o estar\u00e1 escrevendo informa\u00e7\u00f5es ou manipulando informa\u00e7\u00f5es.<\/li>\n<\/ul>\n<p>Em outras palavras, ele \u00e9 o \u00fanico respons\u00e1vel por recuperar as informa\u00e7\u00f5es e devolv\u00ea-las. \u00c9 isso. Nada mais.<\/p>\n<h3>Um exemplo de implementa\u00e7\u00e3o<\/h3>\n<p>Ent\u00e3o, o que isso pode parecer? Aqui est\u00e1 <a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-singleton-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">uma implementa\u00e7\u00e3o aproximada<\/a> para fins de conversa:<\/p>\n<pre><code>&lt;?php\n\nclass Date_Formatter {\n\n    private static $instance;\n\n    private function __construct() {\n    }\n\n    private static function get_instance() {\n\n        if (null === self::$instance) {\n            self::$instance = new self;\n        }\n\n        return self::$instance;\n    }\n\n    public static function get() {\n\n        self::get_instance();\n\n        $default_format = 'm\/d\/Y';\n        $format = get_option( 'yhd_directory_importer', false );\n        if (false === $format) {\n            return $default_format;\n        }\n\n        $format = $format['date'];\n        $format = (isset( $format) &amp;&amp; isset( $format['format']) )? $format['format']: $default_format;\n\n        return $format;\n    }\n}\n<\/code><\/pre>\n<p>Como voc\u00ea pode ver, ele cumpre todos os pontos acima. Ou seja, ele l\u00ea os dados, define um valor padr\u00e3o e o retorna.<\/p>\n<p>Essa classe n\u00e3o faz nada al\u00e9m de ler e retornar um conjunto de dados muito espec\u00edfico.<\/p>\n<h3>Uma advert\u00eancia sobre o cache<\/h3>\n<p>Obviamente, como essa classe est\u00e1 lendo dados do banco de dados, ela pode ser \u2013 e possivelmente deve ser \u2013 armazenada em cache. O objetivo deste post, no entanto, n\u00e3o \u00e9 entrar em transit\u00f3rios, expira\u00e7\u00f5es e trabalhar com todas essas nuances.<\/p>\n<p>Em vez disso, trata-se de avaliar se este \u00e9 ou n\u00e3o um caso de uso v\u00e1lido para implementar um singleton no WordPress.<\/p>\n<h2>Espere, n\u00e3o tem que ser assim!<\/h2>\n<p>Eu sei eu sei. <a href=\"https:\/\/www.youtube.com\/watch?v=yeEp7BA2mLg\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ps\u00edquico<\/a>! Acredito que seja a terminologia correta, mas vamos manter esse aspecto profissional.<\/p>\n<p>At\u00e9 este ponto, todo o post falava sobre por que voc\u00ea pode querer investigar o uso de singletons no WordPress para que voc\u00ea tenha uma maneira de recuperar informa\u00e7\u00f5es facilmente usando princ\u00edpios consistentemente orientados a objetos.<\/p>\n<p>Mas ainda n\u00e3o acho que usar um singleton no WordPress seja necess\u00e1rio aqui. No m\u00ednimo, acho que uma fun\u00e7\u00e3o est\u00e1tica est\u00e1 bem. E a \u00fanica raz\u00e3o pela qual eu acho que est\u00e1 tudo bem \u00e9 porque criar uma inst\u00e2ncia da classe toda vez que voc\u00ea precisa acessar uma fun\u00e7\u00e3o que recupera dados que n\u00e3o ser\u00e3o alterados dentro da classe \u00e9 um exagero.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/e27db4b35ff6ed7fba3b506dccb8ad2d#file-00-date-formatter-refactored-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Ent\u00e3o, como<\/a> \u00e9 isso ?<\/p>\n<pre><code>&lt;?php\n\nclass Date_Formatter {\n\n    public static function get() {\n\n        $default_format = 'm\/d\/Y';\n\n        $format = get_option( 'yhd_directory_importer', false );\n        if (false === $format) {\n            return $default_format;\n        }\n\n        $format = $format['date'];\n        $format = (isset( $format) &amp;&amp; isset( $format['format']) )? $format['format']: $default_format;\n\n        return $format;\n    }\n}\n<\/code><\/pre>\n<p>E isso, acredito, \u00e9 uma solu\u00e7\u00e3o melhor do que implementar um padr\u00e3o de design arbitr\u00e1rio quando n\u00e3o \u00e9 necess\u00e1rio.<\/p>\n<p>Mas estou aberto a ser convencido do contr\u00e1rio.<\/p>\n<h2>Pensamentos de desenvolvedores mais experientes?<\/h2>\n<p>Eu ouvi de um amigo e colega que simplesmente usar uma fun\u00e7\u00e3o com namespace pode at\u00e9 ser o caminho a seguir. Claramente, h\u00e1 uma variedade de maneiras de lidar com isso.<\/p>\n<p>E com isso, estou interessado em saber como voc\u00eas podem refatorar isso ainda mais. N\u00e3o estou muito preocupado com a implementa\u00e7\u00e3o da\u00a0 fun\u00e7\u00e3o <strong>get<\/strong>, pois ela \u00e9 montada principalmente para a demonstra\u00e7\u00e3o.<\/p>\n<p>Em vez disso, estou interessado em maneiras de lidar com isso fora do que \u00e9 apresentado aqui. Ou melhor, apenas sua opini\u00e3o sobre o que voc\u00ea v\u00ea.<\/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>Talvez voc\u00ea queira implementar singletons no WordPress para facilitar a leitura de dados. Mas n\u00e3o precisa ser assim.<\/p>\n","protected":false},"author":1,"featured_media":221011,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,867],"tags":[1170],"class_list":["post-229441","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229441","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=229441"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229441\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/221011"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229441"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229441"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}