{"id":229551,"date":"2022-11-04T10:34:00","date_gmt":"2022-11-04T07:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229551"},"modified":"2022-11-09T08:26:09","modified_gmt":"2022-11-09T05:26:09","slug":"sobre-valores-imutaveis-em-plugins-do-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/sobre-valores-imutaveis-em-plugins-do-wordpress\/","title":{"rendered":"Sobre valores imut\u00e1veis \u200b\u200bem plugins do WordPress"},"content":{"rendered":"\n<p>Se voc\u00ea fez algum trabalho \u2013 ou mesmo alguma leitura \u2013 sobre programa\u00e7\u00e3o orientada a objetos, provavelmente j\u00e1 se deparou com a ideia de imutabilidade. Essa \u00e9 a ideia de algo ser imut\u00e1vel.<\/p>\n<p>\u00c0s vezes, voc\u00ea pode ter valores imut\u00e1veis \u200b\u200be, \u00e0s vezes, objetos imut\u00e1veis \u200b\u200b(pelo menos depois de instanciados).<\/p>\n<p>O oposto de imut\u00e1vel (mas ele era minha tartaruga ninja favorita, de qualquer maneira).<\/p>\n<p>O problema \u00e9 que quanto mais trabalho com c\u00f3digo orientado a objetos, menos costumo trabalhar com vari\u00e1veis \u200b\u200bimut\u00e1veis. Claro, usarei constantes conforme definido em um arquivo de configura\u00e7\u00e3o, mas \u00e9 improv\u00e1vel que voc\u00ea me encontre armazenando valores em uma classe como <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.constants.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">const<\/a>.<\/p>\n<p>Isso provavelmente implica algo sobre mim e minhas habilidades, mas \u00e9 verdade. Felizmente, as <a href=\"https:\/\/tommcfarlin.com\/code-reviews\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">revis\u00f5es de c\u00f3digo<\/a> s\u00e3o \u00f3timas para ajud\u00e1-lo a ver oportunidades de onde aproveitar as estrat\u00e9gias que voc\u00ea normalmente n\u00e3o usaria. E esse \u00e9 o caso dos valores imut\u00e1veis \u200b\u200bnos plugins do WordPress.<\/p>\n<p>Claro, esta \u00e9 uma daquelas coisas que me chamaram a aten\u00e7\u00e3o <a href=\"https:\/\/twitter.com\/tobyschrapel\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">por um amigo<\/a> ao revisar meu c\u00f3digo.<\/p>\n<p>Ao trabalhar com o WordPress, muitos de n\u00f3s provavelmente est\u00e3o familiarizados com <strong>functions.php<\/strong> e <strong>wp-config.php<\/strong> e o papel que eles desempenham no aplicativo principal do WordPress.<\/p>\n<p>Sim, h\u00e1 momentos em que as coisas pertencem a <strong>wp-config.php<\/strong>, e sim, h\u00e1 momentos em que as coisas pertencem a <strong>functions.php<\/strong>, mas \u00e0s vezes acho que esse arquivo espec\u00edfico \u00e9 abusado com muitas fun\u00e7\u00f5es, valores e assim por diante .<\/p>\n<p>Mas e os plugins? Especificamente, e os plugins orientados a objetos? Caso em quest\u00e3o, digamos que voc\u00ea esteja trabalhando com uma API que requer uma chave de API, para que voc\u00ea n\u00e3o atinja um limite de taxa espec\u00edfico com uma vers\u00e3o gratuita do aplicativo.<\/p>\n<p>Normalmente, voc\u00ea pode me encontrar armazenando o valor na classe principal do plugin como uma vari\u00e1vel de inst\u00e2ncia que pode ser passada, ou talvez esteja em uma classe de cont\u00eainer \u00e0 qual eu possa me referir e usar seu\u00a0 m\u00e9todo <strong>get<\/strong>.<\/p>\n<p>Mas que tal usar uma\u00a0 propriedade <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.constants.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">const<\/a> em uma classe e depois pass\u00e1-la via inje\u00e7\u00e3o de setter?<\/p>\n<p>Por exemplo, digamos que h\u00e1 uma classe de plugin que depende de uma classe auxiliar para renderizar algo na tela. A chave da API pode ser definida nesta classe e ent\u00e3o <a href=\"https:\/\/gist.github.com\/tommcfarlin\/d588e0c45cf96bcd5f10614ccf432339#file-00-main-plugin-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">passada para o auxiliar quando necess\u00e1rio<\/a> :<\/p>\n<pre><code>&lt;?php\n\nclass Main_Plugin {\n\n  const ACME_API_KEY = '123456789';\n\n  public function init() {\n\n    $helper = new Helper_Class();\n    $helper-&gt;render_acme_data( self::ACME_API_KEY );\n  }\n}<\/code><\/pre>\n<p>Em seguida, a classe auxiliar pode fazer uma chamada para a API arbitr\u00e1ria (estou chamando de Canvas, pois hipoteticamente seremos algo) usando sua URL e passa a chave da API como parte da string de consulta.<\/p>\n<pre><code>&lt;?php\n\nclass Helper_Class {\n\n  public function render_acme_data( string $api_key) {\n\n    $canvas_url = 'https:\/\/url-for-canvas.com?api_key='. $api_key;\n    $canvas = new Canvas( $canvas_url );\n\n    $canvas-&gt;draw();\n  }\n}<\/code><\/pre>\n<p>Deste jeito:<\/p>\n<ul>\n<li>h\u00e1 um \u00fanico lugar em que o valor \u00e9 mantido,<\/li>\n<li>h\u00e1 um nome descritivo indicando o que ele armazena,<\/li>\n<li>pode ser passado para outras classes com depend\u00eancia m\u00ednima,<\/li>\n<li>as outras classes podem se referir a elas como vari\u00e1veis \u200b\u200blocais ou como vari\u00e1veis \u200b\u200bde inst\u00e2ncia (dependendo de como elas s\u00e3o passadas).<\/li>\n<\/ul>\n<p>Claro, existem outras maneiras de manter esses valores (novamente usando <strong>functions.php<\/strong> ou algo semelhante).<\/p>\n<p>Mas se voc\u00ea est\u00e1 trabalhando com programa\u00e7\u00e3o orientada a objetos e quer trabalhar com valores imut\u00e1veis \u200b\u200bem um plugin WordPress, n\u00e3o faria sentido mant\u00ea-lo no contexto das classes que comp\u00f5em o plugin?<\/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>As revis\u00f5es de c\u00f3digo ajudam voc\u00ea a ver oportunidades onde usar t\u00e9cnicas que voc\u00ea pode perder. Esse \u00e9 o caso de valores imut\u00e1veis \u200b\u200bem plugins do WordPress.<\/p>\n","protected":false},"author":1,"featured_media":166654,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[722,920,806,846,867],"tags":[1170],"class_list":["post-229551","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvedor","category-outro","category-php-8","category-tutoriais","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229551","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=229551"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229551\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/166654"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229551"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229551"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}