DEV Community

Victoria Ricarte Bispo Beserra
Victoria Ricarte Bispo Beserra

Posted on • Updated on

Perl Orientado a Objeto Part III

Perl Orientado a Objeto Part I

Perl Orientado a Objeto Part II

Perl Orientado a Objeto Part III

Moo - Orientação de objeto minimalista

Moose: Um jeito mais elegante de usar a Orientação a Objeto no Perl

O Moose fornece um conjunto de funções exportadas que torna o Perl Orientado a Objeto com uma sintaxe que funciona de maneira muito mais simples e bonita. Permitindo que voltemos nossa atenção para a abstração de dados, no lugar de focar nos detalhes de implementação.

⚠️ Este post tem como objetivo implementar orientação a objeto com Perl utilizando o Moose, por tanto ele leva em consideração que você, leitor, tenha conhecimento de lógica e linguagem e programação, saiba algumas definições de orientação a objeto e conheça a sintaxe básica do Perl.

Construtor e atributos com Moose

Seguindo a linha de raciocínio dos exemplos dos artigos passados, agora vamos implementar a classe Performances utilizando o Moose a seguir:

package Performances;

use Moose;

# Declare the attributes
has 'name' => (is  => 'rw', # Declare read and write at runtime
    required => 1, # make the required attribute, value = 0 optional
    default =>'No name', # Attribute default value
);

has 'audience' => (isa =>'Int', # Declare as integer
  is => 'rw',
    required => 1, 
    default => sub { 
        my $self = shift; 
        my $qtd = shift;
        return $qtd if defined $qtd and $qtd > 0;
        return 'No audience or invalid value';
    } # Attribute default value
); # Declare read and write at runtime

Enter fullscreen mode Exit fullscreen mode
package Calculation

use lib ".";
use Performances;

# Calling the constructor and assigning value to attributes
my $performace = Performances->new(audience=>55, name=>"hamlet");

# Introducing the attributes
printf "The play presented was %s  and its audience was %d people\n ",
$performace->name, $performace->audience;
Enter fullscreen mode Exit fullscreen mode

Como podemos observar, ao usarmos o Moose e definirmos os atributos audience e name, o Moose faz a criação internamente, tanto do seu construtor, quanto métodos para atribuir valor aos seus atributos e métodos de leitura.

Para implementar relacionamentos no Perl vamos refatorar nossa classe de Tragedy. Abaixo, podemos observar a partir do código que Tragedy tem uma Performance do tipo específico de Tragedy.

package model::Performances::Tragedy; # Child Class
use Moose;
use lib (".");
use Performances; # Parent Class

use constant # Creating constants for play types
    TYPE_PLAY => {
        "tragedy" => 40,
        "comedy" => 60
    };

has 'performance' => {
    isa => "Performances", # Using @ISA with Moose
    is => "rw",
    default=> sub {
        return Performances->new(type_play => TYPE_PLAY->{tragedy});
    },
    required => 1
};
Enter fullscreen mode Exit fullscreen mode

O Moose é uma ferramenta muito potente e além do básico que aprendemos aqui no https://metacpan.org/ você pode encontrar toda a sua documentação.
Como nem tudo são flores o Moose também tem seus defeitos. Por ser tão potente ele por sí só já é enorme, e por isso pode deixar aplicações simples lentas. Ele gera muito código por trás da sua implementação para facilitar sua programação, então você pode pagar com processamento quando os módulos são carregados pela primeira vez.

Moo: Um subconjunto do Moose

o Moo chegou para pesar menos no seu processamento. Ele implementa um subconjunto de funcionalidades do Moose em um pacote mais simples. Sem implementar toda a API de introspecção do Moose sem perder a interoperabilidade com o Moose.

Caso você use o pacote de introspecção enquanto está usando o Moo, ele infla de maneira transparente o API do Moose dentro da suba classes ou função. Isso torna mais fácil incorporar Moo usando código em uma Moose base de código e vice-versa.

👋🏻 Então pessoal, essa foi a implementação básica do Moose, recomendo que olhem as demais aplicações na sua documentação. A seguir falaremos sobre o MOO. Até a próxima.

Discussion (0)