Orientação a objetos em Perl, o básico

oo_perl5

Nos comentários finais sobre o gerador de patches IPS citei o fato do código usar orientação a objetos mas não entrei em muitos detalhes. Agora é momento para complementar com mais informação.

Bem, na minha opinião, a orientação a objetos em Perl não parece a coisa mais bonita de se ver e a sensação que deixa é de que tudo apenas foi “amarradas” para funcionar daquele jeito. Isto é, ao menos em Perl 5, em Perl 6 as coisas estão completamente diferentes mas não tive tempo de estudar com calma.

Porém, digamos que você não tem lá muita opção e precisa juntar programação orientada a objetos com Perl 5. Então o roteiro com o mínimo que você precisa fazer é mais ou menos assim…

Crie uma classe (módulo)

Em Perl uma classe fica dentro de um módulo que é um arquivo de extensão .pm (Perl Module). Na primeira linha válida, ou seja, depois de todo os comentários, coloque:

package «nome da classe»;

E na última linha, termine o arquivo com um True:

1;

Este “1” é uma idiossincrasia da linguagem e sem ele algo terrível e críptico acontece:

X.pm did not return a true value at Y.pl line Z.
BEGIN failed--compilation aborted at Y.pl line Z.

Como há uma convenção para que os módulos comecem com letras maiúsculas, vou chamar minha classe de “Nome”:

package Nome;
use strict;

1;

A classe está criada, mas ainda falta coisa.

Construtor

Hora de criar o método que será o construtor da classe, ele deve ser chamado de  new (aqui parece ser mais uma convenção que uma obrigação) e quase sempre terá esta aparência:

sub new
{
    my ( $class ) = shift;
    my $self = { ... };
    ...
    bless $self, $class;
    return $self;
}

A princípio é uma função comum do Perl, exceto pela existência de um comando novo, o bless. A função dele é transformar a variável $self em um objeto dentro de $class.

Aliás, estes dois nomes são uma convenção minha para o nome das variáveis, você pode usar outros nomes.

Voltando para a classe Nome (“Nome.pm”), ela terá somente dois atributos nome e sobrenome que serão passados durante sua criação:

package Nome;
use strict;

sub new
{
    my ( $class ) = shift;
    my $self = {
        _nome => shift,
        _sobrenome => shift
        };
    bless $self, $class;
    return $self;
}

1;

O que é shift? O comando shift arranca o primeiro elemento de um array e o utiliza como retorno, por exemplo:

#!/bin/perl
@a=( 1,2,3 );
print "O primeiro elemento de 'a' é $a[0]\n";
$b = shift @a;
print "Removi $b do vetor e o armazenei em 'b'\n";
print "E agora o primeiro elemento de 'a' é $a[0]\n";
exit 0;

E em new a primeira coisa que pego é o nome da própria classe e em seguida os valores que serão armazenados nos atributos (use o Data::Dumper para visualizar melhor como a coisa funciona):

package Nome;
use strict;
use Data::Dumper;

sub new
{
    print Dumper(@_);
    my ( $class ) = shift;
    ...
    return $self;
}

Isto ajuda a entender como a classe e os demais parâmetros vão passando de um lado para o outro.

Criando outros métodos

Agora os demais métodos da classe:

sub alteraNome
{
    my ( $self, $nome ) = @_;
    $self->{ _nome }=$nome;
    return $self;
}

sub escreveNome
{
    my ( $self ) = @_;
    return $self->{ _nome };
}

sub escreveNomeCompleto
{
    my ( $self ) = @_;
    return ( uc $self->{_sobrenome} ).", ".$self->{_nome};
}

Nem preciso dizer que eles devem ficar entre o “sub new() { … }” e o “1;“, certo? O primeiro método, alteraNome, cuida de alterar o atributo nome dentro de Nome enquanto que as demais,  escreveNome e escreveNomeCompleto , escrevem o primeiro nome e o sobrenome seguido do nome, respectivamente.

Testando

Este é um programa bem simples e que serve para testar três dos quatro métodos criados:

#!/usr/bin/perl
use strict;
use Nome;

print "Digite seu nome : ";
my $n = <STDIN>;
print "Digite seu sobrenome : ";
my $s = <STDIN>;

chomp $n;
chomp $s;
my $a=Nome->new($n,$s);

print "\nOlá ".$a->escreveNomeCompleto()."!\n";
print "Ou devo usar apenas ".$a->escreveNome()."?\n\n";

exit 0;

E o resultado será algo mais ou menos assim:

$ perl nome.pl
Digite seu nome : Giovanni
Digite seu sobrenome : Nunes

Olá NUNES, Giovanni!
Ou devo usar apenas de Giovanni?

Eu disse que era simples! 🙂

Métodos especiais

Além do new há dois outros métodos que é interessante conhecer. O primeiro é o DESTROY (assim mesmo, grafado todo em caixa alta) que serve para criar o destrutor da classe (ou seja, conterá os procedimentos necessários para quando ela não for mais necessária).

Por exemplo, se no construtor fosse feita a abertura de um arquivo em disco, ou estabelecida uma conexão com um banco de dados ou porta TCP, seria no DESTROY que seriam colocados os procedimentos para fechar o arquivo ou encerrar a conexão.

No exemplo o método poderia ter sido definido assim para deixar o programa mais elegante e educado:

sub DESTROY
{
}

Outro, específico do Perl, é o método AUTOLOAD. Ele serve para capturar chamadas a métodos que não existem e permitir fazer um tratamento adequado, algo como:

our $AUTOLOAD;
sub AUTOLOAD
{
    die "Ei, o método $AUTOLOAD não existe!\n";
}

Assim, ao invés do programa sair com uma mensagem de erro, é possível “contorná-la” com algo mais amigável. Este sujeito é útil para quando se trabalha com herança (algo do qual não falarei agora ).

Finalizando

E para finalizar três exercícios, o primeiro é criar um programa que use o método alteraNome. A forma de usá-lo é esta:

$a=Nome->new('João','Silva');
$a=Nome->alteraNome('José');

O segundo é criar o método alteraSobreNome. O terceiro, claro, é acrescentar um novo atributo à classe Nome.

 

E para saber um pouco mais sobre o assunto:

Anúncios

4 comentários sobre “Orientação a objetos em Perl, o básico

  1. Pingback: Orientação a objetos em PHP, o básico | giovannireisnunes

  2. Pingback: Um pouco mais de Ruby | giovannireisnunes

  3. Pingback: Orientação a objetos em Ruby, o básico | giovannireisnunes

  4. Pingback: Orientação a objetos em Python, o básico | giovannireisnunes

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s