DEV Community

Victoria Ricarte Bispo Beserra
Victoria Ricarte Bispo Beserra

Posted on • Updated on

Perl Orientado a Objeto Part II


Como começar a programar em Perl da maneira correta. (Diferente de mim)

Perl Orientado a Objeto Part I

Perl Orientado a Objeto Part II

Perl Orientado a Objeto Part III

Moo - Orientação de objeto minimalista

Os 4 pilares da Programação Orientada a Objetos

Abstração, encapsulamento, herança e polimorfismo são os quatro pilares de qualquer linguagem orientada a objetos. E como aprendemos no post passado o Perl é uma linguagem que da suporte a orientação a objeto a partir da sua versão 5. A seguir vou dar exemplos a vocês de como podemos implementar esses pilares.

⚠️ Este post não tem como objetivo definir orientação a objeto com Perl, mas sim aprofundar conhecimentos prévios que você tenha baseando-se na linguagem. por tanto ele leva em consideração que você, leitor, tenha conhecimento de lógica e linguagem e programação e saiba algumas definições de orientação a objeto.

Abstração

O primeiro pilar fala sobre como vamos representar os objetos dentro no nosso programa, é o que Moose é uma extensão do sistema de objetos da linguagem de programação Perl . Seu propósito declarado [1] é trazer recursos modernos de linguagem orientada a objetos para o Perl 5 e tornar a programação Perl orientada a objetos mais consistente e menos tediosa.vai também facilitar a leitura do nosso código por terceiro. É importante ter clareza ao dar nome a nossas Classes, Atributos e Métodos.

Encapsulamento

O encapsulamento trata da segurança das partes do seu programa. Quem implementa suas classes com seus atributos e usa seus métodos não precisa saber de tudo que se passa dentro da sua construção a não ser o que está na sua API.

Polimorfismo

O polimorfismo é referente a capacidade que a linguagem tem de identificar e diferenciar entidades, métodos ou atributos com mesmo nome de maneira eficiente.

A seguir irei mostrar os principais polimorfismos em Perl:

Substituição

#!/usr/bin/perl
use strict; # Error readability
use warnings;

package controller::Calculation;

use model::Performances;

# We declare entity and assign the value of tragedy with its attributes
my $entity = model::Performances::Tragedy->new('othelo',55); 
# Then we replace entity with the value returned from one of its methods
my $entity = $entity->amount_for();
Enter fullscreen mode Exit fullscreen mode

Sobrecarga

#!/usr/bin/perl
use strict; # Error readability
use warnings;

package model::Performances::Tragedy; # Child Class

use parent 'Performances';  # Parent Class 

sub new { # writing over the Performances builder
    my $this = shift;
    my $class = ref ($this) || $this;
    my $name = shift;
    my $audience = shift;

    my $self = new Performances($name,$audience,TYPE_PLAY->{tragedy});

    return bless $self, $class;

}
Enter fullscreen mode Exit fullscreen mode

Inclusão

Que é o tipo de polimorfismo de herança que veremos a seguir.

Herança

E é aqui onde o POO ganha meu coração🥰
É com a herança que podemos aplicar a abstração e o encapsulamento para melhorar nossos códigos.

  • Evitando repetições “herdando” métodos semelhantes ou re-escrevendo os mesmos;
  • Utilizando os mesmos atributos para diferentes classes (não tão diferentes assim) para evitar classes de linhas quilométricas;

A herança no Perl pode ser implementada com o uso de pacotes no seu código, que como aprendemos anteriormente, os pacotes serão as classes. Cada pacote em perl tem um array especial chamado @ISA que guarda toda a hierarquia de classes pai daquela classe. Veja o código a seguir, continuando a linha de raciocínio anterior:

#!/usr/bin/perl
use strict; # Error readability
use warnings;
use constant # Creating constants for play types
    TYPE_PLAY => {
        "tragedy" => 40,
    };

package model::Performances::Tragedy; # Child Class
@Performances::Tragedy::ISA = ('Performances'); # Parent Class
Enter fullscreen mode Exit fullscreen mode

A atribuição feita na linha “@Performances::Tragedy::ISA = ('Performances');” indica que a classe Tragedy é uma filha da classe Perfomances, por tanto herda todos seus atributos e sub-rotinas.

Entretanto não existe a necessidade de atribuirmos diretamente ao array @ISA todas as heranças de nossas classes, dado que em um sistema mais complexo que possa envolver enrança múltipla ou que a arvore de herança fique muito grande, possamos encontrar dificuldades. Mas ainda podemos encontrar essas atribuições em códigos antigos.

Além de atribuir diretamente ao @ISA, podemos encontrar o uso de base para indicar herança dentro do Perl. Porém esse uso não é mais aconselhado a partir do momento que foi criado o parent, que é uma versão do base mais limpa. A seguir podemos observar um exemplo de como usar o parent na classe Comedy:

#!/usr/bin/perl
use strict; # Error readability
use warnings;
use constant # Creating constants for play types
    TYPE_PLAY => {
        "tragedy" => 40,
        "comedy" => 60
    };
package model::Performances::Comedy; # Class
use parent 'Performances';    # sets @Performances::Comedy::ISA = ('Performances');
Enter fullscreen mode Exit fullscreen mode

Principais características de base e parent:

base faz as seguintes coisas:

  • Adiciona o pacote nomeado a @ISA;
  • Carrega o módulo com o mesmo nome do pacote nomeado usando require (a menos que detecte que o pacote já foi carregado);
  • Não falhará se um módulo com o mesmo nome do pacote não existir;
  • Morre se não houver símbolos no pacote nomeado;
  • Inicializa o [fields]http://perldoc.perl.org/fields.html) do pacote nomeado se eles existirem;

O parent faz as seguintes coisas:

  • Adiciona o pacote nomeado a @ISA;
  • carrega o módulo com o mesmo nome do pacote nomeado usando require (a menos que detecte que o pacote já foi carregado)
  • Não chama a função de importação do pacote nomeado;
  • A opção norequire diz para não fazer o require (então a classe já deve estar carregada). Isso significa que ele não precisa interceptar erros e decidir se eles devem ser suprimidos ou não.

👋🏻 Então pessoal, esses foram os pilares da Programação Orientada a Objetos no perl. Continuem de olho que logo mais farei publicações sobre o Moose e o Moo, suas diferenças e outras aplicações voltadas a essa linguagem de programação tão abrangente. Até a próxima.

Discussion (0)