{"id":230172,"date":"2022-11-21T17:05:00","date_gmt":"2022-11-21T14:05:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230172"},"modified":"2022-11-21T17:07:21","modified_gmt":"2022-11-21T14:07:21","slug":"os-segundos-dois-pilares-da-poo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-segundos-dois-pilares-da-poo\/","title":{"rendered":"Os Segundos Dois Pilares da POO"},"content":{"rendered":"\n<p>Como mencionei no <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-dois-primeiros-pilares-da-poo\/\" title=\"primeiro post desta s\u00e9rie\">primeiro post desta s\u00e9rie<\/a><\/strong>, muitas vezes voc\u00ea vai ouvir falar sobre Os Tr\u00eas Pilares da Programa\u00e7\u00e3o Orientada a Objetos. Voc\u00ea tamb\u00e9m pode ouvir sobre Os Quatro Pilares da Programa\u00e7\u00e3o Orientada a Objetos.<\/p>\n<p>E n\u00e3o \u00e9 que haja um total de sete ou algo assim. Em vez disso, \u00e9 mais sobre o que as pessoas consideram fundamental para a POO: existem tr\u00eas ou quatro conceitos principais?<\/p>\n<p>Voc\u00ea pode deduzir do artigo anterior (sem falar no t\u00edtulo), acredito que sejam quatro.<\/p>\n<p>E neste post, vou cobrir os dois \u00faltimos:<\/p>\n<ul>\n<li>Heran\u00e7a,<\/li>\n<li>e Polimorfismo<\/li>\n<\/ul>\n<p>Se voc\u00ea j\u00e1 fez algum tipo de programa\u00e7\u00e3o orientada a objetos antes de ler este artigo, provavelmente j\u00e1 ouviu falar de pelo menos uma delas.<\/p>\n<p>Independentemente disso, vamos dar uma olhada em cada um deles com mais detalhes.<\/p>\n<h2>Mais dois pilares da POO<\/h2>\n<p>Antes de entrar em cada um deles, quero ter certeza de que voc\u00ea est\u00e1 a par do que abordamos at\u00e9 agora.<\/p>\n<h3>Uma palavra sobre an\u00e1lise<\/h3>\n<p>N\u00e3o vou entrar em detalhes, mas toda a raz\u00e3o pela qual estou falando agora sobre fundamentos orientados a objetos \u00e9 porque estamos entrando em uma fase diferente deste material. Come\u00e7amos cobrindo a fase de <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-analysis\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">An\u00e1lise<\/a><\/strong>, que incluiu:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/programacao-orientada-a-objetos-no-wordpress-analise-parte-1\/\" title=\"An\u00e1lise, Parte 1\">An\u00e1lise, Parte 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/programacao-orientada-a-objetos-no-wordpress-analise-parte-2\/\" title=\"An\u00e1lise, Parte 2\">An\u00e1lise, Parte 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/programacao-orientada-a-objetos-no-wordpress-entendendo-as-expectativas-do-cliente\/\" title=\"Entendendo as expectativas do cliente\">Entendendo as expectativas do cliente<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/programacao-orientada-a-objetos-no-wordpress-declaracao-de-trabalho\/\" title=\"Declara\u00e7\u00e3o de Trabalho\">Declara\u00e7\u00e3o de Trabalho<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/programacao-orientada-a-objetos-no-wordpress-termos-e-condicoes\/\" title=\"Termos e Condi\u00e7\u00f5es\">Termos e Condi\u00e7\u00f5es<\/a><\/li>\n<\/ol>\n<h3>Agora para desenvolvimento<\/h3>\n<p>E agora estamos na fase de <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">desenvolvimento<\/a><\/strong>. Alguns podem chamar isso de fundamentos (mas eu concordo que voc\u00ea n\u00e3o pode fazer um bom desenvolvimento sem os fundamentos, ent\u00e3o \u00e9 isso (.<\/p>\n<p>Se voc\u00ea n\u00e3o leu <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/os-dois-primeiros-pilares-da-poo\/\" title=\"o post anterior\">o post anterior<\/a><\/strong>, recomendo faz\u00ea-lo antes de continuar, pois aborda os conceitos de Abstra\u00e7\u00e3o, Encapsulamento e como isso se relaciona com o WordPress.<\/p>\n<h3>3 Heran\u00e7a<\/h3>\n<p>O conceito de heran\u00e7a \u00e9 muito f\u00e1cil de seguir. Ou seja, uma classe pode herdar atributos de outra classe. Vou dar alguns exemplos disso em um momento, mas deixe-me fornecer uma defini\u00e7\u00e3o de trabalho para os prop\u00f3sitos deste post:<\/p>\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<h4>Exemplo 1: um documento<\/h4>\n<p>Em termos muito simples, digamos que voc\u00ea tenha uma classe chamada Document e um documento tenha um t\u00edtulo e conte\u00fado. Depois, h\u00e1 uma subclasse de documento que possui atributos para uma data e hora. Poder\u00edamos chamar isso de PostDocument ou PageDocument.<\/p>\n<p>Ou seja, o PageDocument <strong>herda<\/strong> as propriedades e atributos de Document ao mesmo tempo que adiciona sua pr\u00f3pria implementa\u00e7\u00e3o a ele. Faz sentido?<\/p>\n<p>Se n\u00e3o, n\u00e3o se preocupe. Nem sempre &#8220;clica&quot; no in\u00edcio, ent\u00e3o vamos ver outro exemplo.<\/p>\n<h4>Exemplo 2: uma mensagem<\/h4>\n<p>Digamos que temos uma classe Message. Uma mensagem normalmente tem duas propriedades:<\/p>\n<ul>\n<li>1 Um remetente,<\/li>\n<li>2 Um destinat\u00e1rio.<\/li>\n<\/ul>\n<p>\u00c9 justo dizer que existem diferentes tipos de mensagens, certo? Ou seja, talvez tenhamos uma EmailMessage ou talvez tenhamos uma TextMessage.<\/p>\n<p>Uma EmailMessage ainda tem um remetente e ainda tem um destinat\u00e1rio, mas tem muito mais, certo? Tem coisas como:<\/p>\n<ul>\n<li>uma linha de assunto,<\/li>\n<li>um anexo opcional,<\/li>\n<li>outro conjunto de remetentes para quem \u00e9 enviado,<\/li>\n<li>suporte para copiar outras pessoas para a mensagem p\u00fablica ou privada,<\/li>\n<li>e muito mais.<\/li>\n<\/ul>\n<p>Um TextMessage, por outro lado, n\u00e3o ter\u00e1 necessariamente todos os itens acima. Vamos supor que estamos falando de uma mensagem SMS b\u00e1sica (em vez de uma mensagem rich text em algo como Hangouts, Telegram, iMessage ou qualquer outra coisa que esteja por a\u00ed).<\/p>\n<p>Esta aula ir\u00e1:<\/p>\n<ul>\n<li>estar vinculado a um n\u00famero de telefone,<\/li>\n<li>pode incluir um grupo de outros destinat\u00e1rios, todos p\u00fablicos,<\/li>\n<li>uma operadora (que \u00e9 uma operadora de celular),<\/li>\n<li>um n\u00famero m\u00e1ximo de caracteres que pode conter<\/li>\n<li>a capacidade de dividir uma \u00fanica mensagem em v\u00e1rias mensagens se o n\u00famero m\u00e1ximo de caracteres exceder uma certa quantidade de caracteres.<\/li>\n<\/ul>\n<p>Mas ainda levanta quest\u00f5es sobre propriedades e m\u00e9todos (ou, mais geralmente, implementa\u00e7\u00e3o, certo?)<\/p>\n<h4>Uma palavra sobre implementa\u00e7\u00e3o<\/h4>\n<p>Quando se trata de programa\u00e7\u00e3o orientada a objetos, temos o que chamamos de modificadores de acesso. Talvez voc\u00ea os tenha lido em outros lugares referidos como, digamos, modificadores de visibilidade ou algo assim.<\/p>\n<p>\u00c9 tudo a mesma coisa.<\/p>\n<p>Em suma, esses modificadores podem ser definidos como:<\/p>\n<blockquote>\n<p>Palavras-chave que controlam quais outras classes t\u00eam acesso \u00e0s informa\u00e7\u00f5es em m\u00e3os.<\/p>\n<\/blockquote>\n<p>Lucikly, esta parte \u00e9 simples de entender:<\/p>\n<ul>\n<li><strong>propriedades e fun\u00e7\u00f5es privadas<\/strong> s\u00e3o acess\u00edveis apenas para a classe em que s\u00e3o definidas. Isso significa que PostDocument n\u00e3o pode usar nada em Document que esteja marcado como privado. Para todos os efeitos, o PostDocument nem sabe que essa informa\u00e7\u00e3o existe.<\/li>\n<li><strong>propriedades e fun\u00e7\u00f5es protegidas<\/strong> s\u00e3o acess\u00edveis \u00e0 classe na qual s\u00e3o definidas e a qualquer classe que seja descendente. Ou seja, qualquer classe que herde dados da classe base ou da classe pai tem acesso a ela. Portanto, ao contr\u00e1rio dos detalhes de implementa\u00e7\u00e3o <strong>privada<\/strong>, o PostDocument pode acessar informa\u00e7\u00f5es do Document se estiver marcado como protegido.<\/li>\n<li><strong>propriedades e fun\u00e7\u00f5es p\u00fablicas<\/strong> s\u00e3o acess\u00edveis a qualquer pessoa. Isso n\u00e3o tem nada a ver com heran\u00e7a, na verdade, mas mais com encapsulamento, se houver. Em vez disso, trata-se de decidir o que queremos que outros objetos acessem.<\/li>\n<\/ul>\n<p>Ent\u00e3o, como \u00e9 tratada a implementa\u00e7\u00e3o? Isso varia de idioma para idioma, mas o PHP n\u00e3o suporta o que \u00e9 chamado de &#8220;heran\u00e7a m\u00faltipla&#8221;. Simplificando, uma determinada classe em <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.inheritance.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHP s\u00f3 pode herdar (ou estender) uma outra classe<\/a>. N\u00e3o v\u00e1rias classes (algumas linguagens suportam isso).<\/p>\n<blockquote>\n<p>Quando voc\u00ea estende uma classe, a subclasse herda todos os m\u00e9todos p\u00fablicos e protegidos da classe pai. A menos que uma classe substitua esses m\u00e9todos, eles manter\u00e3o sua funcionalidade original.<\/p>\n<\/blockquote>\n<p>Em nosso exemplo, n\u00e3o podemos introduzir outra classe como WrittenDocument que herda de PageDocument e tamb\u00e9m de PostDocument. \u00c9 um ou outro. E vale a pena notar que, se herdar de PostDocument, tamb\u00e9m herdar\u00e1 informa\u00e7\u00f5es de Document porque \u00e9 uma subclasse de uma subclasse de uma classe.<\/p>\n<h3>4 Polimorfismo<\/h3>\n<p>Agora que temos uma defini\u00e7\u00e3o b\u00e1sica de heran\u00e7a, podemos falar sobre polimorfismo. A boa not\u00edcia \u00e9 que \u00e9 uma palavra grande e estranha para um conceito muito simples.<\/p>\n<p>A m\u00e1 not\u00edcia \u00e9 que n\u00e3o falamos sobre interfaces ou classes abstratas. Estes est\u00e3o chegando, mas s\u00e3o considerados parte dos quatro pilares, ent\u00e3o n\u00e3o se preocupe com eles agora.<\/p>\n<p>Em vez disso, pense assim:<\/p>\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>Ainda pode ser confuso, mas lembre-se do nosso, digamos, exemplo de mensagem acima? Podemos instanciar uma classe SMSMessage que <strong>estende<\/strong> a classe Message e ent\u00e3o chamar certos m\u00e9todos nela.<\/p>\n<p>O SMSMessage pode ter um m\u00e9todo que a classe Message possui. E se a classe tiver sido instanciada como uma inst\u00e2ncia da classe SMSMessage, ela chamar\u00e1 esse m\u00e9todo. Da mesma forma, se ele n\u00e3o tiver um m\u00e9todo, mas sua classe pai, Message, o tiver, ele chamar\u00e1 esse m\u00e9todo.<\/p>\n<p>\u00c0s vezes, \u00e9 mais f\u00e1cil entender isso no c\u00f3digo, ent\u00e3o vamos fazer isso.<\/p>\n<p>Primeiro, vamos definir nossa classe <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-00-message-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Message<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nclass Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the Message class.n\";\n  }\n\n  public function receive()\n  {\n    echo \"This message was received from the Message class.n\";\n  }\n}\n<\/code><\/pre>\n<p>Ent\u00e3o vamos definir nossa classe <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-01-smsmessage-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">SMSMessage<\/a>. Observe que ele n\u00e3o possui uma fun\u00e7\u00e3o <strong>receive()<\/strong>. Isso ser\u00e1 importante momentaneamente:<\/p>\n<pre><code>&lt;?php\nclass SMSMessage extends Message\n{\n  public function send()\n  {\n    echo \"This message is sent from the SMSMessage class.n\";\n  }\n}<\/code><\/pre>\n<p>Agora, vamos <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-02-functionaldemo1-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">instanciar nossa<\/a><\/strong> classe Message e chamar alguns m\u00e9todos:<\/p>\n<pre><code>&lt;?php\n$message = new Message();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>E vamos fazer o mesmo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-03-functionaldemo2-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">usando a classe SMSMessage:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n$message = new SMSMessage();\n$message-&gt;send();\n$message-&gt;receive();<\/code><\/pre>\n<p>Se voc\u00ea quiser o script completo, voc\u00ea pode v\u00ea-lo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">aqui<\/a><\/strong>, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/48b39d7e5524dadf0037239fef07cc7c#file-04-workingdemo-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">baix\u00e1<\/a> -lo e execut\u00e1-lo localmente.<\/p>\n<h2>Heran\u00e7a, Polimorfismo e WordPress<\/h2>\n<p>Aqui est\u00e1 a conclus\u00e3o (e exploraremos isso mais quando entrarmos em interfaces e classes abstratas): Quando uma classe <strong>estende<\/strong> outra classe e n\u00e3o possui os detalhes de implementa\u00e7\u00e3o que sua classe pai possui, a implementa\u00e7\u00e3o do pai ser\u00e1 usada.<\/p>\n<p>Outra maneira de pensar nisso \u00e9 &#8220;trabalhar na cadeia de comando&#8221;. Ele come\u00e7ar\u00e1 com a classe mais baixa para o que criamos. Em nosso exemplo acima, esse \u00e9 o SMSMessage. Se ele n\u00e3o encontr\u00e1-lo l\u00e1, ele ser\u00e1 movido para a classe que ele estende. (E se n\u00e3o encontr\u00e1-lo l\u00e1 e essa classe estender uma classe, ele tentar\u00e1 l\u00e1.)<\/p>\n<p>A coisa toda polim\u00f3rfica \u00e9 esta: n\u00f3s instanciamos uma classe de um tipo, SMSMessage, mas ela est\u00e1 usando a implementa\u00e7\u00e3o de uma classe de outro tipo (que ela herda, sim, mas \u00e9 diferente mesmo assim).<\/p>\n<h3>Aulas de reda\u00e7\u00e3o no WordPress<\/h3>\n<p>Por fim, gostaria de deixar isso: mencionei algo semelhante a isso no post anterior, mas quero reiterar aqui.<\/p>\n<p>Independentemente de quantos desses conceitos o n\u00facleo do WordPress usa, n\u00e3o importa porque podemos escrever c\u00f3digo orientado a objetos de alta qualidade no WordPress que interage com o WordPress e que funciona bem com o WordPress (e outros c\u00f3digos de terceiros \u2013 nem sempre, mas muitas vezes).<\/p>\n<h2>O que vem a seguir?<\/h2>\n<p>Em seguida, veremos interfaces e abstra\u00e7\u00f5es.<\/p>\n<p>Eles ainda s\u00e3o fundamentais para a programa\u00e7\u00e3o orientada a objetos, mas se voc\u00ea entendeu os dois posts anteriores, voc\u00ea est\u00e1 preparado para uma experi\u00eancia s\u00f3lida com os pr\u00f3ximos conceitos.<\/p>\n<p>E se n\u00e3o, n\u00e3o se preocupe! Voc\u00ea sempre pode falar sobre isso nos coment\u00e1rios ou podemos conversar mais sobre isso por e-mail.<\/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>Aqui, encerro meus dois posts sobre os quatro pilares da POO cobrindo heran\u00e7a e polimorfismo junto com uma demonstra\u00e7\u00e3o funcional.<\/p>\n","protected":false},"author":1,"featured_media":164983,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,846],"tags":[1170],"class_list":["post-230172","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230172","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=230172"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230172\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/164983"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}