DEV Community

Victoria Ricarte Bispo Beserra
Victoria Ricarte Bispo Beserra

Posted on • Edited 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.

Top comments (0)