✅ Notícias, temas e plug-ins da WEB e do WordPress. Aqui compartilhamos dicas e as melhores soluções para sites.

Os Segundos Dois Pilares da POO

25

Como mencionei no primeiro post desta série, muitas vezes você vai ouvir falar sobre Os Três Pilares da Programação Orientada a Objetos. Você também pode ouvir sobre Os Quatro Pilares da Programação Orientada a Objetos.

E não é que haja um total de sete ou algo assim. Em vez disso, é mais sobre o que as pessoas consideram fundamental para a POO: existem três ou quatro conceitos principais?

Você pode deduzir do artigo anterior (sem falar no título), acredito que sejam quatro.

E neste post, vou cobrir os dois últimos:

  • Herança,
  • e Polimorfismo

Se você já fez algum tipo de programação orientada a objetos antes de ler este artigo, provavelmente já ouviu falar de pelo menos uma delas.

Independentemente disso, vamos dar uma olhada em cada um deles com mais detalhes.

Mais dois pilares da POO

Antes de entrar em cada um deles, quero ter certeza de que você está a par do que abordamos até agora.

Uma palavra sobre análise

Não vou entrar em detalhes, mas toda a razão pela qual estou falando agora sobre fundamentos orientados a objetos é porque estamos entrando em uma fase diferente deste material. Começamos cobrindo a fase de Análise, que incluiu:

  1. Análise, Parte 1
  2. Análise, Parte 2
  3. Entendendo as expectativas do cliente
  4. Declaração de Trabalho
  5. Termos e Condições

Agora para desenvolvimento

E agora estamos na fase de desenvolvimento. Alguns podem chamar isso de fundamentos (mas eu concordo que você não pode fazer um bom desenvolvimento sem os fundamentos, então é isso (.

Se você não leu o post anterior, recomendo fazê-lo antes de continuar, pois aborda os conceitos de Abstração, Encapsulamento e como isso se relaciona com o WordPress.

3 Herança

O conceito de herança é muito fácil 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ção de trabalho para os propósitos deste post:

Herança refere-se à ideia de que uma classe, embora tenha sua própria implementação, literalmente herda propriedades, funções e implementação geral de uma classe pai.

Exemplo 1: um documento

Em termos muito simples, digamos que você tenha uma classe chamada Document e um documento tenha um título e conteúdo. Depois, há uma subclasse de documento que possui atributos para uma data e hora. Poderíamos chamar isso de PostDocument ou PageDocument.

Ou seja, o PageDocument herda as propriedades e atributos de Document ao mesmo tempo que adiciona sua própria implementação a ele. Faz sentido?

Se não, não se preocupe. Nem sempre “clica" no início, então vamos ver outro exemplo.

Exemplo 2: uma mensagem

Digamos que temos uma classe Message. Uma mensagem normalmente tem duas propriedades:

  • 1 Um remetente,
  • 2 Um destinatário.

É justo dizer que existem diferentes tipos de mensagens, certo? Ou seja, talvez tenhamos uma EmailMessage ou talvez tenhamos uma TextMessage.

Uma EmailMessage ainda tem um remetente e ainda tem um destinatário, mas tem muito mais, certo? Tem coisas como:

  • uma linha de assunto,
  • um anexo opcional,
  • outro conjunto de remetentes para quem é enviado,
  • suporte para copiar outras pessoas para a mensagem pública ou privada,
  • e muito mais.

Um TextMessage, por outro lado, não terá necessariamente todos os itens acima. Vamos supor que estamos falando de uma mensagem SMS básica (em vez de uma mensagem rich text em algo como Hangouts, Telegram, iMessage ou qualquer outra coisa que esteja por aí).

Esta aula irá:

  • estar vinculado a um número de telefone,
  • pode incluir um grupo de outros destinatários, todos públicos,
  • uma operadora (que é uma operadora de celular),
  • um número máximo de caracteres que pode conter
  • a capacidade de dividir uma única mensagem em várias mensagens se o número máximo de caracteres exceder uma certa quantidade de caracteres.

Mas ainda levanta questões sobre propriedades e métodos (ou, mais geralmente, implementação, certo?)

Uma palavra sobre implementação

Quando se trata de programação orientada a objetos, temos o que chamamos de modificadores de acesso. Talvez você os tenha lido em outros lugares referidos como, digamos, modificadores de visibilidade ou algo assim.

É tudo a mesma coisa.

Em suma, esses modificadores podem ser definidos como:

Palavras-chave que controlam quais outras classes têm acesso às informações em mãos.

Lucikly, esta parte é simples de entender:

  • propriedades e funções privadas são acessíveis apenas para a classe em que são definidas. Isso significa que PostDocument não pode usar nada em Document que esteja marcado como privado. Para todos os efeitos, o PostDocument nem sabe que essa informação existe.
  • propriedades e funções protegidas são acessíveis à classe na qual são 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ário dos detalhes de implementação privada, o PostDocument pode acessar informações do Document se estiver marcado como protegido.
  • propriedades e funções públicas são acessíveis a qualquer pessoa. Isso não tem nada a ver com herança, na verdade, mas mais com encapsulamento, se houver. Em vez disso, trata-se de decidir o que queremos que outros objetos acessem.

Então, como é tratada a implementação? Isso varia de idioma para idioma, mas o PHP não suporta o que é chamado de “herança múltipla”. Simplificando, uma determinada classe em PHP só pode herdar (ou estender) uma outra classe. Não várias classes (algumas linguagens suportam isso).

Quando você estende uma classe, a subclasse herda todos os métodos públicos e protegidos da classe pai. A menos que uma classe substitua esses métodos, eles manterão sua funcionalidade original.

Em nosso exemplo, não podemos introduzir outra classe como WrittenDocument que herda de PageDocument e também de PostDocument. É um ou outro. E vale a pena notar que, se herdar de PostDocument, também herdará informações de Document porque é uma subclasse de uma subclasse de uma classe.

4 Polimorfismo

Agora que temos uma definição básica de herança, podemos falar sobre polimorfismo. A boa notícia é que é uma palavra grande e estranha para um conceito muito simples.

A má notícia é que não falamos sobre interfaces ou classes abstratas. Estes estão chegando, mas são considerados parte dos quatro pilares, então não se preocupe com eles agora.

Em vez disso, pense assim:

O polimorfismo nos permite fazer referência a uma classe de um tipo quando ela pode ser declarada como outro tipo.

Ainda pode ser confuso, mas lembre-se do nosso, digamos, exemplo de mensagem acima? Podemos instanciar uma classe SMSMessage que estende a classe Message e então chamar certos métodos nela.

O SMSMessage pode ter um método que a classe Message possui. E se a classe tiver sido instanciada como uma instância da classe SMSMessage, ela chamará esse método. Da mesma forma, se ele não tiver um método, mas sua classe pai, Message, o tiver, ele chamará esse método.

Às vezes, é mais fácil entender isso no código, então vamos fazer isso.

Primeiro, vamos definir nossa classe Message :

<?php
class Message
{
  public function send()
  {
    echo "This message is sent from the Message class.n";
  }

  public function receive()
  {
    echo "This message was received from the Message class.n";
  }
}

Então vamos definir nossa classe SMSMessage. Observe que ele não possui uma função receive(). Isso será importante momentaneamente:

<?php
class SMSMessage extends Message
{
  public function send()
  {
    echo "This message is sent from the SMSMessage class.n";
  }
}

Agora, vamos instanciar nossa classe Message e chamar alguns métodos:

<?php
$message = new Message();
$message->send();
$message->receive();

E vamos fazer o mesmo usando a classe SMSMessage:

<?php
$message = new SMSMessage();
$message->send();
$message->receive();

Se você quiser o script completo, você pode vê-lo aqui, baixá -lo e executá-lo localmente.

Herança, Polimorfismo e WordPress

Aqui está a conclusão (e exploraremos isso mais quando entrarmos em interfaces e classes abstratas): Quando uma classe estende outra classe e não possui os detalhes de implementação que sua classe pai possui, a implementação do pai será usada.

Outra maneira de pensar nisso é “trabalhar na cadeia de comando”. Ele começará com a classe mais baixa para o que criamos. Em nosso exemplo acima, esse é o SMSMessage. Se ele não encontrá-lo lá, ele será movido para a classe que ele estende. (E se não encontrá-lo lá e essa classe estender uma classe, ele tentará lá.)

A coisa toda polimórfica é esta: nós instanciamos uma classe de um tipo, SMSMessage, mas ela está usando a implementação de uma classe de outro tipo (que ela herda, sim, mas é diferente mesmo assim).

Aulas de redação no WordPress

Por fim, gostaria de deixar isso: mencionei algo semelhante a isso no post anterior, mas quero reiterar aqui.

Independentemente de quantos desses conceitos o núcleo do WordPress usa, não importa porque podemos escrever código orientado a objetos de alta qualidade no WordPress que interage com o WordPress e que funciona bem com o WordPress (e outros códigos de terceiros – nem sempre, mas muitas vezes).

O que vem a seguir?

Em seguida, veremos interfaces e abstrações.

Eles ainda são fundamentais para a programação orientada a objetos, mas se você entendeu os dois posts anteriores, você está preparado para uma experiência sólida com os próximos conceitos.

E se não, não se preocupe! Você sempre pode falar sobre isso nos comentários ou podemos conversar mais sobre isso por e-mail.

Fonte de gravação: tommcfarlin.com

Este site usa cookies para melhorar sua experiência. Presumiremos que você está ok com isso, mas você pode cancelar, se desejar. Aceitar Consulte Mais informação