[SP-pm] Módulo

Luis Motta Campos luismottacampos em yahoo.co.uk
Terça Março 6 00:38:48 PST 2007


On Mar 5, 2007, at 5:37 PM, Thomas Britis wrote:
> Senhores,
> 	Tenho uma pequena dúvida e com certeza vcs podem me ajudar.
> 	Fiz um pequeno teste da seguinte forma:

   Você disse que tinha uma dúvida; em seguida, disse que fez um  
teste, mas não enunciou claramente a sua hipótese. O que você está  
tentando testar? Se você não é capaz de enunciar a sua hipótese de  
teste, certamente não sabe o que está fazendo.

> arquivo: UGLY.pm
>
> package UGLY;
> use strict;
>
> sub new {
>   my $self = {};
>
>   bless $self;
>
>   $self->{oi} = 3;
>   return $self;
> }
>
> arquivo: teste.pl
>
> BEGIN { unshift (@INC, "."); }

   Isto é FEIO. MUITO FEIO.
   Se você precisa acrescentar um diretório ao seu @INC, deveria usar

   use lib "$ENV{VARIAVEL_DE_AMBIENTE_COM_NOME_BEM_ESCOLHIDO}";

   Desta forma, previne burradas e tem certeza do que quer dizer "."  
no seu @INC.

> my $jj = UGLY->new();
>
> print $jj->{oi}, "\n";
>
> Pois bem, imprimiu o 3 como devido. Minha dúvida é: eu posso trabalhar
> com a mesma variavel jj (que é o $self retornado pelo new() do módulo)
> DENTRO do módulo? Explico:
>
> Além da função new() no módulo eu tivesse:
> sub bla {
>   my $self = shift;
>
>   $self->{tchau} = 10;
> }

   Olha, neste trechinho você deu mostras claras de que não sabe  
muito bem o que está fazendo.
   Vamos a isso:
     1. Você pode dar o nome que quiser às suas variáveis. O pessoal  
que veio do Smalltalk, como eu, gosta de usar "$self" por que isso  
lembra a palavra-chave "self" que se usa muito em smalltalk. O  
pessoal que veio do C++, por outro lado, gosta de usar "$this" por  
lembrar da palavra-chave "this" que faz muito sentido para eles (e  
nenhum para mim).
     2. NUNCA, JAMAIS, por motivo algum, escreva qualquer coisa que  
sugira que você espera alguma coisa da estrutura interna do seu  
objeto. Aqui, você espera que seu objeto seja uma referência para um  
hash, o que é um erro de desenho. Também recomendo muito que você  
mantenha seus olhos bem abertos sobre armazenar valores dentro do seu  
hash, um futuro implementador poderia:
       2.1. Trocar seu hash por um array reference (o que quebraria o  
seu método de um jeito muito feio)
       2.2. Ter um efeito colateral (manter um contador de  
referências, por exemplo) associado com um determinado valor  
armazenado no hash, o que vai ficar completamente sem sentido se você  
acessar o valor diretamente, violando o encapsulamento.

> e chamasse no teste.pl:
> $jj->tchau UGLY;

   Você sempre pode obter a classe de um objeto dinâmicamente, o que  
permite que as pessoas extendam a sua classe para derivar novos  
objetos (o que é a única razão para se usar orientação à objetos):

   sub needs_class {
     my $self = shift;
     # ref() calcula dinâmicamente a classe de $self
     my $class = ref $self || Nice::Default;
   }

> ou ainda:
> $jj->tchau ($jj);

   Nenhum sentido nisso, mas você pode fazer. É a mesma coisa que dizer

   tchau( $jj, $jj );

   Se você precisa de uma cópia do objeto, pode achar interessante  
olhar para o módulo Clone, no CPAN, que faz cópias mais adequadas de  
um objeto.

> ou sei lá o que, mas que eu tivesse no arquivo pl (e não no módulo) o

   Olha, Thomas, se você não sabe o que quer, deixa a linha livre,  
sim? ;-) Pode ter gente querendo fazer perguntas interessantes.

> retorno da função bla, ou seja:
> print $jj->{tchau}, "\n";
>
> 	Se fui muito confuso, por favor, me avisem.

   Eu não consegui entender algumas coisas:

   1. O quê você está querendo saber?
   2. Qual era mesmo a hipótese que você enunciou para construir  
aquele teste?
   3. Por que você escreveu este monte de código sem-pé-nem-cabeça?
   4. O que eu estou fazendo aqui, já que não me parece que você  
tenha problemas?

   Eu gostaria muito, muito, muito, que você perdesse seu tempo (como  
eu perdi o meu) para me escrever uma história que fizesse sentido e  
em que você explicasse o que está querendo fazer.

   Putamplexos!
--
Luis Motta Campos is a software engineer,
perl fanatic evangelist, and amateur {cook, photographer}




Mais detalhes sobre a lista de discussão SaoPaulo-pm