{"id":230260,"date":"2022-11-23T19:19:00","date_gmt":"2022-11-23T16:19:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230260"},"modified":"2022-11-23T19:19:21","modified_gmt":"2022-11-23T16:19:21","slug":"olhando-para-o-polimorfismo-em-profundidade","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/olhando-para-o-polimorfismo-em-profundidade\/","title":{"rendered":"Olhando para o polimorfismo em profundidade"},"content":{"rendered":"\n<p>Quando comecei esta s\u00e9rie, falei sobre os quatro pilares da programa\u00e7\u00e3o orientada a objetos. Cada um desses t\u00f3picos est\u00e1 listado e vinculado abaixo.<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-dois-primeiros-pilares-da-poo\/\" title=\"Abstra\u00e7\u00e3o\">Abstra\u00e7\u00e3o<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-dois-primeiros-pilares-da-poo\/\" title=\"Encapsulamento\">Encapsulamento<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-segundos-dois-pilares-da-poo\/\" title=\"Heran\u00e7a\">Heran\u00e7a<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-segundos-dois-pilares-da-poo\/\" title=\"Polimorfismo\">Polimorfismo<\/a><\/strong><\/li>\n<\/ol>\n<p>Neste ponto, eu normalmente gostaria de come\u00e7ar a passar para o pr\u00f3ximo t\u00f3pico. Antes de fazer isso, por\u00e9m, gostaria de passar mais um post explorando o conceito de polimorfismo.<\/p>\n<p>Em minha carreira, at\u00e9 agora, vi poucos t\u00f3picos que d\u00e3o mais confus\u00e3o e problemas aos que entram na programa\u00e7\u00e3o orientada a objetos do que polimorfismo. Ent\u00e3o, eu gostaria de discutir um pouco mais profundamente dentro do contexto da programa\u00e7\u00e3o orientada a objetos e fora de qualquer framework ou aplicativo espec\u00edfico (como WordPress).<\/p>\n<p>Neste post, farei uma r\u00e1pida revis\u00e3o do que discutimos at\u00e9 agora, depois voltarei ao polimorfismo.<\/p>\n<h2>Polimorfismo em profundidade<\/h2>\n<p>Em primeiro lugar, como mencionado, quero revisar rapidamente o que foi discutido at\u00e9 agora, especialmente se voc\u00ea encobriu qualquer um dos posts anteriores.<\/p>\n<p>N\u00e3o se preocupe: nada abaixo se transforma em c\u00f3digo. Em vez disso, ele simplesmente define os termos que usamos para que voc\u00ea tenha uma ideia do que estou me referindo sempre que vir a palavra surgir ao longo desta s\u00e9rie.<\/p>\n<h3>Abstra\u00e7\u00e3o<\/h3>\n<blockquote>\n<p>Abstra\u00edmos a ideia de algo em uma classe. Em vez disso, vamos abstrair ideias em suas classes. E h\u00e1 uma ideia chave aqui: uma classe deve representar um substantivo.<\/p>\n<\/blockquote>\n<h3>Encapsulamento<\/h3>\n<blockquote>\n<p>Encapsulamento \u00e9 realmente apenas uma palavra &#8220;grande&quot; que se refere \u00e0 ideia de gerenciar suas responsabilidades (ou acompanhar seus dados).<\/p>\n<\/blockquote>\n<h3>Heran\u00e7a<\/h3>\n<blockquote>\n<p>Heran\u00e7a refere-se \u00e0 ideia de que uma classe, embora tenha sua pr\u00f3pria implementa\u00e7\u00e3o, literalmente herda propriedades, fun\u00e7\u00f5es e implementa\u00e7\u00e3o geral de uma classe pai.<\/p>\n<\/blockquote>\n<h3>Polimorfismo<\/h3>\n<blockquote>\n<p>O polimorfismo nos permite fazer refer\u00eancia a uma classe de um tipo quando ela pode ser declarada como outro tipo.<\/p>\n<\/blockquote>\n<p>Com isso dito, \u00e9 aqui que acho que as coisas podem ficar um pouco mais complicadas. Nas postagens anteriores, forneci v\u00e1rios exemplos de c\u00f3digo diferentes (e pe\u00e7o que voc\u00ea os revise).<\/p>\n<p>Mas no post de hoje, vou tentar explorar um pouco mais a ideia tanto na explica\u00e7\u00e3o quanto no c\u00f3digo.<\/p>\n<h2>Relativo \u00e0 heran\u00e7a<\/h2>\n<p>Se n\u00e3o for evidente neste ponto, o polimorfismo est\u00e1 altamente relacionado \u00e0 heran\u00e7a. Pense desta forma: se uma classe herdar propriedades e m\u00e9todos de outra classe, ent\u00e3o ela pode &#8220;ficar no lugar&#8221; da classe pai.<\/p>\n<p>Isso significa que se voc\u00ea tem algo como uma\u00a0 classe <strong>Content<\/strong> e duas subclasses, uma sendo uma <strong>Post<\/strong> e outra sendo uma <strong>Page<\/strong>, voc\u00ea pode instanciar a classe usando o\u00a0 tipo de refer\u00eancia <strong>Content.t<\/strong><\/p>\n<p>Mas em tempo de execu\u00e7\u00e3o, ser\u00e1 na verdade uma inst\u00e2ncia do\u00a0 tipo <strong>Post<\/strong>. Faz sentido? Aqui est\u00e1 algum c\u00f3digo como exemplo.<\/p>\n<p>Primeiro, vamos come\u00e7ar definindo uma\u00a0 classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-00-content-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Content<\/a> :<\/p>\n<pre><code>&lt;?php\nclass Content {\n\n   protected $title;\n\n   protected $content;\n\n   protected $metadata;\n\n   public function __construct()\n   {\n     $this-&gt;title = \"Hello World!\";\n     $this-&gt;content = \"This is a sample piece of content.\";\n     $this-&gt;metadata = \"&lt;This is the metadata of the post.&gt;\";\n   }\n\n   public function getTitle()\n   {\n     return $this-&gt;title;\n   }\n\n   public function getContent()\n   {\n     return $this-&gt;content;\n   }\n\n   public function getMetadata()\n   {\n     return $this-&gt;metadata;\n   }\n }\n<\/code><\/pre>\n<p>Ele tem as propriedades gerais que voc\u00ea provavelmente espera \u2013 t\u00edtulo, conte\u00fado e metadados. \u00c9 verdade que essas propriedades s\u00e3o apenas strings, mas podem ser estruturas de dados mais elaboradas em uma situa\u00e7\u00e3o do mundo real.<\/p>\n<p>Agora vamos ver um <strong>Post<\/strong> :<\/p>\n<pre><code>&lt;?php\n\nclass Post extends Content  {\n\n   private $author;\n\n   public function __construct() {\n     parent::__construct();\n     $this-&gt;author = \"Tom McFarlin\";\n   }\n\n   public function getAuthor()\n   {\n     return $this-&gt;author;\n   }\n }\n<\/code><\/pre>\n<p>O que acontece, ent\u00e3o, se voc\u00ea chamar um m\u00e9todo na\u00a0 classe <strong>Post<\/strong>, como <strong>getTitle<\/strong>, que n\u00e3o existe, mas existe na\u00a0 classe <strong>Content<\/strong>? Ent\u00e3o, por causa da heran\u00e7a, ele procurar\u00e1 o m\u00e9todo em <strong>Post<\/strong>, n\u00e3o o encontrar\u00e1, ent\u00e3o come\u00e7ar\u00e1 a procur\u00e1-lo em <strong>Content<\/strong>.<\/p>\n<p>Se for encontrado, ele ir\u00e1 execut\u00e1-lo.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6c3e3d0.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-164720-61e76b6c3e3d0.png\" alt=\"Olhando para o polimorfismo em profundidade\"><\/a><\/p>\n<p>Da mesma forma, podemos fazer algo assim com a\u00a0 classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cd3e2afb65810ed9cf423ad7c8f8e532#file-02-page-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Page<\/a> e os dados de conte\u00fado. Primeiro, instanciamos a classe base e, em seguida, definimos propriedades espec\u00edficas para a <strong>Page<\/strong>. Neste caso, ser\u00e1 uma categoria.<\/p>\n<pre><code>&lt;?php\n\nclass Page extends Content  {\n\n   private $category;\n\n   public function __construct() {\n     parent::__construct();\n     $this-&gt;category = \"Articles\";\n   }\n\n   public function getCategory()\n   {\n     return $this-&gt;category;\n   }\n }\n<\/code><\/pre>\n<p>Agora, quando executamos o c\u00f3digo, podemos come\u00e7ar com o <strong>conte\u00fado:<\/strong><\/p>\n<pre><code>&lt;?php\n\n$content = new Content();\necho $content-&gt;getTitle();<\/code><\/pre>\n<p>Observe que isso se parece com o que esper\u00e1vamos, pois temos um t\u00edtulo e conte\u00fado. Vejamos tamb\u00e9m o <strong>Post<\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/\/ These will work because they reside in the Content base class.\n$post = new Post();\necho $post-&gt;getAuthor();\necho $post-&gt;getTitle();<\/code><\/pre>\n<p>Isso funciona porque temos um autor, mas tamb\u00e9m temos um t\u00edtulo porque ele reside em <strong>Content<\/strong>. Mas se tentarmos chamar <strong>getAuthor<\/strong> em uma inst\u00e2ncia de <strong>Post?<\/strong><\/p>\n<pre><code>&lt;?php\n\n\/\/ These will work because they reside in the Content base class.\n$post = new Post();\necho $post-&gt;getAuthor();\necho $post-&gt;getTitle();<\/code><\/pre>\n<p>Vamos receber um erro porque o m\u00e9todo n\u00e3o reside nessa classe.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164720-61e76b6f7949a.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-164720-61e76b6f7949a.png\" alt=\"Olhando para o polimorfismo em profundidade\"><\/a><\/p>\n<p>Ent\u00e3o o que devemos fazer? Como n\u00e3o temos tipos fortes em PHP, n\u00e3o podemos convert\u00ea-los em um tipo diferente.<\/p>\n<p>Existem padr\u00f5es de design para isso, que discutirei em um conjunto futuro de postagens, mas o PHP n\u00e3o permite isso t\u00e3o facilmente quanto algumas outras linguagens (como C# ou Java).<\/p>\n<h2>Perguntas sobre polimorfismo<\/h2>\n<p>Felizmente, o c\u00f3digo acima lhe d\u00e1 uma ideia de como um tipo concreto como um <strong>Post\u00a0<\/strong> ou uma <strong>P\u00e1gina<\/strong> pode ter implicitamente as propriedades e m\u00e9todos de sua classe base, <strong>Content<\/strong>, usados \u200b\u200bem tempo de execu\u00e7\u00e3o.<\/p>\n<p>Mas tamb\u00e9m levanta algumas quest\u00f5es, n\u00e3o \u00e9? Por exemplo:<\/p>\n<ul>\n<li><strong>Por que o polimorfismo \u00e9 \u00fatil?<\/strong> Em \u00faltima an\u00e1lise, \u00e9 uma quest\u00e3o de flexibilidade. Ou seja, voc\u00ea pode escrever um\u00a0 tipo de <strong>conte\u00fado<\/strong> gen\u00e9rico, mas depois criar um <strong>Post<\/strong> ou uma <strong>P\u00e1gina<\/strong> como vimos acima. Isso nos d\u00e1 todos os benef\u00edcios da classe <strong>Content e tamb\u00e9m a especificidade da classe<\/strong> <strong>Post<\/strong>, por exemplo.<\/li>\n<li><strong>Isso parece ser mais confuso do que flex\u00edvel.<\/strong> De certa forma, \u00e9 confuso porque o c\u00f3digo requer um pouco de rastreamento. Ou seja, voc\u00ea pode come\u00e7ar na\u00a0 classe <strong>Post<\/strong> e ter que procurar o que a\u00a0 classe <strong>Content<\/strong> oferece. Por outro lado, tamb\u00e9m torna muito f\u00e1cil introduzir uma nova\u00a0 subclasse <strong>Content<\/strong> e us\u00e1-la quando for mais adequada em tempo de execu\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>No que diz respeito a superclasses e subclasses, \u00e9 a\u00ed que entra em jogo ter um IDE s\u00f3lido.<\/p>\n<p>\u00c9 sempre bom ter um editor que voc\u00ea goste, claro, mas ter um que possa determinar intuitivamente qual \u00e9 a classe pai, qual \u00e9 a classe base, etc., pode ajudar muito a rastrear, depurar, seguir e escrever novos c\u00f3digo.<\/p>\n<p>Mas isso \u00e9 conte\u00fado para outro post que vir\u00e1 depois que falarmos sobre padr\u00f5es de design.<\/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 analisar o polimorfismo em profundidade para ter uma ideia mais clara de como ele funciona e por que \u00e9 ben\u00e9fico.<\/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,806,846],"tags":[1170],"class_list":["post-230260","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-php-8","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230260","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=230260"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230260\/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=230260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}