Pergunta

Perl possui recursos OOP, mas eles são raramente usados.Como você cria e usa objetos Perl com métodos e propriedades?

Foi útil?

Solução

Você definitivamente deveria dar uma olhada Moose.

package Point;
use Moose; # automatically turns on strict and warnings

has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');

sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}

Moose oferece (entre outras coisas) um construtor, métodos de acesso e verificação de tipo gratuitamente!

Então, no seu código você pode:

my $p = Point->new({x=>10 , y=>20}); # Free constructor
$p->x(15);     # Free setter
print $p->x(); # Free getter
$p->clear();
$p->x(15.5);   # FAILS! Free type check.

Um bom ponto de partida é Moose::Manual e Moose::Cookbook

Se você só precisa do material básico, você também pode usar Mouse que não é tão completo, mas sem a maior parte da penalidade no tempo de compilação.

Outras dicas

alce, definitivamente.

package Person;
use Moose;
has age => ( isa => Int, is => 'rw'); 
has name => ( isa => Str, is => 'rw'); 
1;

Imediatamente, você tem gratuitamente um método new() e métodos acessadores para os atributos que você acabou de definir com 'has'.Então, você pode dizer:

my $person = Person->new();
$person->age(34);
$person->name('Mike');
print $person->name, "\n";

e assim por diante.Não apenas isso, mas seus métodos de acesso são verificados gratuitamente (e você pode definir seus próprios tipos, bem como os padrões).Além disso, você obtém 'estende' para subclasses, 'com' para funções/características e todo tipo de outras coisas excelentes que permitem que você continue com o trabalho real de escrever um código OO robusto e sustentável.

TMTOWTDI, mas este funciona.

Atualmente eu uso Objeto::InsideOut sempre que eu quiser objetos, é muito bom e oferece muitos recursos em relação aos objetos hash abençoados padrão.Dito isto, se eu estivesse iniciando um novo projeto, consideraria seriamente o Moose.

Embora seja bom ler a documentação oficial do PERL, eu gostaria NÃO recomendo tentar definir o papel de sua própria estrutura de objeto ou construir objetos usando hashes, é muito tentador seguir o caminho mais fácil e "atingir o pico" diretamente nas variáveis ​​"privadas" dos objetos, quebrando completamente o encapsulamento, isso voltará a incomodá-lo quando você quiser para refatorar o objeto.

Objetos Perl NÃO são apenas hashes abençoados.São REFERÊNCIAS abençoadas.Eles podem ser (e na maioria das vezes são) referências de hash abençoadas, mas poderiam facilmente ser referências escalares ou de array abençoadas.

O tutorial oficial do Site CPAN é bom.

Há também um bom artigo chamado Cocô de camelo no CodeProject.

Eu recomendo dar uma olhada no Moose se você quiser fazer OO em Perl.No entanto, não é muito útil se você não entende o que significa OO em Perl.Para entender melhor como Perl OO funciona nos bastidores, escrevi uma visão geral em meu blog: http://augustinalareina.wordpress.com/2010/06/06/an-introduction-to-object-oriented-perl/

Do ponto de vista da estrutura de dados, um Objeto é uma referência com alguns recursos extras.O intérprete sabe tratar essas referências especiais como Objetos porque elas foram "abençoadas" com a palavra-chave "abençoar".As referências abençoadas contêm uma bandeira indicando que são um Objeto.Essencialmente, isso significa que você pode definir e chamar métodos neles.

Por exemplo, se você criasse um hashref básico, isso não funcionaria:$hashref->foo();

Mas se você criar um hashref abençoado (também conhecido como Objeto), isso funciona:$blessed_hashref->foo();

Moose é um excelente módulo para OOP em Perl porque cria uma camada OO executável E manipula automaticamente métodos de acesso para que você não precise definir um monte de getters e setters.Se você estiver interessado em usar Devel::Peak para ver como o interpretador Perl armazena objetos, siga o link para a entrada do blog que postei acima.

Por um lado, cada aula é um pacote;você estabelece herança (múltipla, se desejado) definindo a variável do pacote @É UM (de preferência em tempo de compilação);você cria um objeto a partir de um dado existente (geralmente, mas nem sempre, um hash anônimo usado para armazenar variáveis ​​de instância) com abençoar(REFERÊNCIA [, NOME DA CLASSE]);você chama métodos de objeto como $obj->methodname(@ARGS) e métodos de classe como "CLASSNAME"->methodname(@ARGS).A ordem de resolução do método de herança múltipla pode ser alterada usando mro.

Como isso é um tanto minimalista e não força o encapsulamento, existem muitos módulos diferentes que fornecem mais ou diferentes funcionalidades.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top