E ai galera? Depois de 3 anos offline por aqui estou de volta!🤗
Meu último post foi voltado para mudanças por aqui, eu tinha começado a programar em JavaScript utilizando TypeScript (NodeJS), um grande desafio. Tinha prometido postar sobre essa trajetória, 😅 mas fiquei atarefada demais no novo trabalho. 🚨 KKKKRY
Agora, voltando para as origens com Perl, vou voltar a fazer publicações pontuais sobre o que aprendi de novo na linguagem e com o que estarei trabalhando por aqui. Vamos passear entre o Perl e o NodeJS durante o ano? 👩🏻💻
E para o come back vamos explorar Corinna
⚠️ATENÇÃO
Este post não tem como objetivo definir orientação a objeto nem sintaxes básicas do perl, por tanto ele leva em consideração que você, leitor, tenha conhecimento básico de perl e saiba orientação a objeto e suas definições.
A partir da versão 5.36 do Perl a linguagem ganhou suporte a um sistema de orientação a objetos que é fruto de anos de colaboração entre a equipe do Corinna e a comunidade Perl. Onde seu maior objetivo é simplificar a orientação a objetos utilizando o Perl.
A gente consegue resumir o Corinna em quatro palavras chaves que vamos utilizar dentro do nosso código fonte:
- class: Para declarar uma classe;
- field: Para declarar um atributo (campo);
- method: Para declarar um método;
- role: Para declarar uma função;
Aplicação
O primeiro passo é garantir que a versão do Perl que estamos utilizando. Como disse anteriormente precisamos de uma versão a cima da 5.36. Em seguida adicione no seu script use experimental 'class';
para ativar o experimental Corinna.
E para começar a implementação de maneira simples vamos declarar a nossa primeira classe:
use v5.36;
use experimental 'class';
class Usuario {
...
}
E para criar uma instância do objeto basta utilizar a seguinte sintaxe:
my $produto = Produto->new();
Passando dentro dos parênteses os atributos que vamos ter declarados dentro da nossa classe.
Na sequência temos a declaração dos atributos, de maneira também muito simples utilizando a palavra chave field:
use v5.36;
use experimental 'class';
class Usuario {
field $nome;
field $email;
}
Além de declarar os nossos atributos vamos precisar adicionar modificadores. Quando definimos apenas com o field ele é criado como uma propriedade privada da nossa classe e para serem acessados e/ou modificados de maneira mais simples podemos utilizar esses modificadores para personalizar seus comportamentos:
- :reader : Para gerar automaticamente um método de leitura;
- :writer : Para gerar automaticamente um método de escrita;
- :param : Para inicializar o atributo diretamente no construtor;
- :default : Para definir um valor padrão;
- :lazy : Utilizado com default, faz com que o valor padrão seja calculado apenas na primeira vez que o atributo é acessado;
- :builder : Para definir um método que será chamado para inicializar ele;
A seguir vou mostrar como podemos utilizar cada modificador:
use v5.36;
use experimental 'class';
class Usuario {
field $nome :reader :param;
field $email :reader :writer :param;
field $status :reader :default('ativo');
field $criado_em :reader :lazy :default(sub { time });
}
# Testando
my $usuario = Usuario->new(nome => 'Victoria', email => 'victoria@example.com');
say $usuario;
# Atualizando o email
$usuario->$email('nova@example.com');
say "\nEmail atualizado: ", $usuario->$email;
Para executarmos o nosso script lembre sempre de salvar com uma extensão .pl como por exemplo main.pl e execute utilizando o seguinte comando no terminal:
perl main.pl
Para implementar um novo método, basta declarar utilizando a palavra mothod e para utilizar basta chamar utilizamos ->methodName()
na classe que instanciamos:
class Usuario {
field $nome :reader :param;
field $email :reader :writer :param;
field $status :reader :default('ativo');
field $criado_em :reader :lazy :default(sub { time });
# Método
method exibir_detalhes {
say "Nome: ", $self->$nome;
say "Email: ", $self->$email;
say "Status: ", $self->$status;
say "Criado em: ", scalar localtime($self->$criado_em);
}
}
# Testando
my $usuario = Usuario->new(nome => 'Victoria', email => 'victoria@example.com');
$usuario->exibir_detalhes();
Existem comportamentos e atributos que precisamos compartilhar entre classes, mas essas classes não estão relacionadas diretamente por herança. Para não repetirmos código, evitar problemas de herança múltipla e separar corretamente as responsabilidades podemos utilizar role. Por exemplo, um comportamento como "validar dados" ou "logar ações" pode ser usado por diferentes classes. Para utilizar uma role basta utilizarmos does após o nome da classe, e é possível utilizarmos mais de uma role nas classes como veremos aqui embaixo:
use v5.36;
use experimental 'class';
role Loggable {
method log($message) {
say "[LOG]: $message";
}
}
role Validacoes {
method validarEmail($email) {
die "Email inválido\n" unless $email =~ /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
return $email;
}
method validarPreco($preco) {
die "Preço inválido: deve ser positivo\n" if $preco < 0;
return $preco;
}
}
class Usuario does Loggable does Validacoes {
field $nome :reader :param;
field $email :reader :writer :param;
field $senha :reader :writer :param;
field $status :reader :default('ativo');
field $criado_em :reader :lazy :default(sub { time });
method logarUsuario($email, $senha) {
$self->validarEmail($email)) # Usa o método do role
$self->log("Pessoa logado com Sucesso!"); # Usa o método do role
}
}
class Produto does Loggable does Validacoes {
field $nome :reader :writer :param;
field $descricao :reader :writer :param;
field $preco :reader :writer :param;
method cadastrarProduto($nome, $descricao, $preco) {
$self->validarPreco($preco); # Usa o método do role
$self->log("Produto cadastrado com Sucesso!"); # Usa o método do role
}
}
# Testando
my $usuario = Usuario->new(nome => 'Victoria', email => 'victoria@example.com','123456');
$usuario->logarUsuario('victoria@example.com','123456');
my $produto = Produto->new(nome => 'Caderno', descricao => '200 folhas e 5 matérias', preco => 30.50);
$produto->cadastrarProduto('Caderno','200 folhas e 5 matérias', 30.50);
Hoje a gente fica por aqui
Aprendemos como usar as quatro palavras chaves do Corinna para a POO com Perl, e em breve vou trazer para vocês novas implementações com mais complexidade e soluções incríveis. Até a próxima.
Fontes:
Repositório do Corinna no GitHub: Este repositório centraliza discussões e propostas para integrar um sistema OO moderno ao núcleo do Perl.
Corinna no Perl Core: Artigo que discute a integração do Corinna ao núcleo do Perl, destacando suas vantagens e implicações.
OVID'S PROGRAMMING, POLITICS, AND PROSE
Corinna "Quickstart" Tutorial: Um tutorial introdutório que oferece uma visão geral prática do uso do Corinna para programação OO em Perl.
GITHUB
Top comments (0)