{"id":229011,"date":"2022-10-22T18:07:00","date_gmt":"2022-10-22T15:07:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229011"},"modified":"2022-11-09T05:11:03","modified_gmt":"2022-11-09T02:11:03","slug":"refatorando-plugins-do-wordpress-um-pequeno-exemplo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/refatorando-plugins-do-wordpress-um-pequeno-exemplo\/","title":{"rendered":"Refatorando plugins do WordPress: um pequeno exemplo"},"content":{"rendered":"\n<p>Uma das maneiras que os plugins do WordPress surgem \u00e9 que, pelo menos no meu caso, eles come\u00e7am como uma cole\u00e7\u00e3o de fun\u00e7\u00f5es usadas para ajudar com um prop\u00f3sito espec\u00edfico para um determinado projeto. A partir da\u00ed, voc\u00ea pensa &#8220;Ei, talvez algu\u00e9m ache isso \u00fatil&quot;.<\/p>\n<p>Pelo menos essa tem sido a minha experi\u00eancia mais frequentemente do que n\u00e3o.<\/p>\n<p>Mas o problema \u00e9 que antes de liber\u00e1-lo para outras pessoas tentarem, voc\u00ea quer passar pelo processo de limpeza do c\u00f3digo. Tamb\u00e9m n\u00e3o estou falando de refatorar plugins do WordPress \u2013 pelo menos n\u00e3o ainda.<\/p>\n<p>Estou falando sobre pegar o c\u00f3digo, traz\u00ea-lo para algo que funcionar\u00e1 como um plugin do WordPress e, possivelmente, refatorar o c\u00f3digo.<\/p>\n<h2>Refatorando plugins do WordPress<\/h2>\n<p>Passar por todo o processo de refatora\u00e7\u00e3o de plugins do WordPress \u2013 sem falar em um \u00fanico plugin do WordPress \u2013 pode ser \u00e1rduo, mas compartilhar como refatorar uma parte de um plugin \u00e9 algo fact\u00edvel.<\/p>\n<p>Ent\u00e3o, eu estarei usando um exemplo de como eu estava usando algo recentemente (com o c\u00f3digo um pouco abstrato para n\u00e3o me incomodar em ser espec\u00edfico sobre qualquer projeto).<\/p>\n<p>Tra\u00e7ar a sa\u00edda ideal de op\u00e7\u00f5es.<\/p>\n<p>Antes de fazer isso, por\u00e9m, acho importante compartilhar meu processo pode ser diferente \u2013 ou provavelmente \u2013 diferente do seu (j\u00e1 que muitos de n\u00f3s temos processos diferentes).<\/p>\n<ol>\n<li>Projete o componente (sim, nem mesmo o plugin completo) em um notebook,<\/li>\n<li>Crie uma lista de verifica\u00e7\u00e3o dos casos de uso em que deve passar e quando deve falhar,<\/li>\n<li>Escreva quais dados s\u00e3o necess\u00e1rios, como s\u00e3o necess\u00e1rios e quando devem ser ignorados<\/li>\n<li>Converta todos os itens acima em c\u00f3digo.<\/li>\n<\/ol>\n<p>Claro, eu n\u00e3o converto tudo literalmente em c\u00f3digo, mas voc\u00ea entendeu. Talvez a maneira mais sucinta de colocar isso seja assim:<\/p>\n<ul>\n<li>Comece com um m\u00e9todo longo que atenda ao caso de uso ideal. Em seguida, refatore esse c\u00f3digo para que as fun\u00e7\u00f5es sejam menores e considerem os casos em que o resultado falharia.<\/li>\n<\/ul>\n<p>Dito isso, veja como o c\u00f3digo pode ficar.<\/p>\n<h3>1 Escrevendo para o caso de uso ideal<\/h3>\n<p>Neste exemplo, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-00-ideal-path-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o caso de uso ideal<\/a> \u00e9 quando o usu\u00e1rio carrega as op\u00e7\u00f5es, as op\u00e7\u00f5es est\u00e3o presentes, e ent\u00e3o ele precisa realizar uma a\u00e7\u00e3o se as op\u00e7\u00f5es tiverem determinados valores.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options        = get_option( 'acme_date_options' );\n    $event_settings = $options['event'];\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Essa parte deve ser f\u00e1cil de ler, mas n\u00e3o explica nada, exceto o caminho ideal pelo c\u00f3digo.<\/p>\n<h3>2 Fique um pouco na defensiva<\/h3>\n<p>Em seguida, gosto de ter certeza de que as op\u00e7\u00f5es est\u00e3o definidas antes de tentar l\u00ea-las. Em alguns casos, voc\u00ea pode querer exibir um aviso, lan\u00e7ar uma exce\u00e7\u00e3o ou registrar informa\u00e7\u00f5es.<\/p>\n<p>Neste exemplo, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-02-defensive-coding-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vou retornar<\/a>, pois \u00e9 f\u00e1cil de ler e pode ser ajustado com mais facilidade para seu uso.<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! isset( $options['event'])) {\n            return;\n    }\n\n    $event_settings = $options['event'];\n    if (! isset( $event_settings['import']) ||! isset( $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if (( 0 === strcmp( 'yes', $import)) &amp;&amp; (0 === strcmp( 'events', $post_type) )) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Ent\u00e3o, isso lida com as op\u00e7\u00f5es, mas e o caso em que as op\u00e7\u00f5es s\u00e3o definidas, mas n\u00e3o t\u00eam os valores que esperamos? Isso significa que tamb\u00e9m precisamos verificar se eles fazem isso. E, se n\u00e3o, ignore-os, retorne, registre um erro, lance uma exce\u00e7\u00e3o e assim por diante.<\/p>\n<p>Voc\u00ea sabe: A mesma coisa que acima. Exceto, neste caso, eu n\u00e3o vou tomar nenhuma a\u00e7\u00e3o a menos que o c\u00f3digo tenha a informa\u00e7\u00e3o ideal.<\/p>\n<h3>3 Ficando um pouco longo<\/h3>\n<p>Neste ponto, o m\u00e9todo est\u00e1 ficando um pouco longo e est\u00e1 se tornando mais dif\u00edcil de ler. Claro, se voc\u00ea \u00e9 um programador experiente, pode argumentar que &#8220;Isto \u00e9 c\u00f3digo, n\u00e3o \u00e9 ingl\u00eas&#8221;, mas por que n\u00e3o tentar torn\u00e1-lo um pouco mais f\u00e1cil de seguir?<\/p>\n<p>Al\u00e9m disso, torna um pouco mais f\u00e1cil de testar. Mas isso est\u00e1 al\u00e9m do escopo deste post. Tome a avalia\u00e7\u00e3o de op\u00e7\u00f5es como o primeiro exemplo do c\u00f3digo.<\/p>\n<ol>\n<li>Isso \u00e9 algo que pode ser envolvido em sua fun\u00e7\u00e3o que n\u00e3o apenas isola essa verifica\u00e7\u00e3o, mas tamb\u00e9m torna a chamada resultante um pouco mais f\u00e1cil.<\/li>\n<li>Em seguida, pegue o segundo bloco de c\u00f3digo que verifica os valores de op\u00e7\u00e3o ideais. Isso tamb\u00e9m pode ser abstra\u00eddo pelas mesmas raz\u00f5es acima.<\/li>\n<li>E, finalmente, configure uma fun\u00e7\u00e3o para garantir que os valores esperados sejam definidos para cada um dos <a href=\"http:\/\/03-consolidation.php\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">valores especificados<\/a> :<\/li>\n<\/ol>\n<pre><code>&lt;?php\n\nprivate function has_valid_option( $option) {\n  return isset( $option );\n}\n\nprivate function has_valid_values( $value1, $value2) {\n  return! (isset( $value1) &amp;&amp; isset( $value2) );\n}\n\nprivate function can_import_data( $value1, $value2) {\n\n    return (0 === strcmp( 'yes', $value1)) &amp;&amp; (0 === strcmp( 'events', $value2) );\n}<\/code><\/pre>\n<p>Ent\u00e3o agora voc\u00ea tem dois m\u00e9todos menores encapsulando a mesma verifica\u00e7\u00e3o que voc\u00ea estava fazendo.<\/p>\n<h3>4 A Fun\u00e7\u00e3o Final<\/h3>\n<p>Neste ponto, a fun\u00e7\u00e3o final \u00e9 muito mais f\u00e1cil de ler, pois possui duas fun\u00e7\u00f5es auxiliares que encapsulam suas responsabilidades enquanto <a href=\"https:\/\/gist.github.com\/tommcfarlin\/5426f8d7e592eb99a128d663aec87b01#file-04-final-function-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">esta volta a avaliar o caminho ideal<\/a> pelo c\u00f3digo:<\/p>\n<pre><code>&lt;?php\n\nprivate function load_dates() {\n\n    $options = get_option( 'acme_date_options' );\n    if (! $this-&gt;has_valid_option( $options)) {\n        return;\n    }\n\n    $event_settings = $options['event'];\n    if (! $this-&gt;has_valid_values( $event_settings['import'], $event_settings['post-type'])) {\n        return;\n    }\n\n    $import    = $event_settings['import'];\n    $post_type = $event_settings['post-type'];\n\n    if ($this-&gt;can_import_data( $import, $post_type)) {\n        \/\/ This is where you take whatever action you want.\n    }\n}<\/code><\/pre>\n<p>Basta dizer que, quando se trata de refatorar plugins do WordPress, este \u00e9 apenas um exemplo de como fazer apenas um segmento dele. Mas \u00e9 um come\u00e7o, certo?<\/p>\n<h2>Plugins inteiros?<\/h2>\n<p>Eu sei direito? Refatorar plugins do WordPress n\u00e3o \u00e9 brincadeira. Mas se voc\u00ea come\u00e7ar com pequenas fun\u00e7\u00f5es como essa e gradualmente trabalhar na base de c\u00f3digo, fica mais f\u00e1cil.<\/p>\n<p>E se voc\u00ea gastar tempo planejando o projeto desde o in\u00edcio, pode economizar muito tempo voltando e refatorando esse tipo de coisa.<\/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>Refatorar plugins do WordPress \u00e9 um trabalho. Mas se voc\u00ea come\u00e7ar com pequenas fun\u00e7\u00f5es e gradualmente percorrer a base de c\u00f3digo, fica mais f\u00e1cil.<\/p>\n","protected":false},"author":1,"featured_media":220671,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,753,722,920,816,867],"tags":[1170],"class_list":["post-229011","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-codigo-aberto","category-desenvolvedor","category-outro","category-plug-ins","category-wordpress-8","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229011","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=229011"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/229011\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/220671"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=229011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=229011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=229011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}