[SP-pm] Dúvidas em Perl.

Luis Motta Campos luismottacampos at yahoo.co.uk
Tue Aug 5 15:17:56 PDT 2008


Viviane Oliveira wrote:
> Bom dia Luis! Desculpe estar escrevendo diretamente em seu email
> pessoal, mas eh q aqui vou me sentir mais a vontade, para alguns
> esclareciemtos.

Boa noite, Viviane Oliveira. Nenhum problema em me escrever em privado.
Espero que você não se incomode se eu responder para a lista dos
SPPMers, eu me sinto mais à vontade falando em público.

Você parece ser uma usuária muito nova de listas de discussão, ainda não 
compreendeu a etiqueta da lista. Por isso eu estou sendo polido, 
respondendo à sua mensagem e pedindo a você que não me faça perguntas em 
privado, a não ser que você tenha uma boa razão para isso.

Eu não sou empregado dos Perl Mongers, tenho um trabalho /full/ /time/ 
como todo mundo aqui (bom, a maioria).

Eu faço isso por que eu gosto de ajudar. Dar suporte técnico público, 
gratuito, e de boa qualidade é uma das minhas contribuições para o mundo 
Open Source.

> Referente as minha dúvidas são as seguintes: Eu tenho que usar o use
> CLASS?

Sim.

> É necessaria a criação de metodos de acesso para cada pacote?

Sim.

Claro, você pode desconsiderar as minhas respostas se você achar que não
é preciso ser uma boa programadora. Mas, neste caso, eu aconselho você a
tentar VB ou Java. Quem programa Perl e fala nas listas de discussão 
gosta de codificar com qualidade.

> No exemplo q vc me enviou e de acordo com o q eu entendi (posso ter 
> interpretado errado), nessa linha vc esta criando o objeto. e na
> proxima vc esta serializando.

> my $data = Data::Object->new( nome => 'Luis', sobrenome => 'Motta' );

Sim, esta linha cria um objeto do tipo "Data::Object".

> # Teria como eu usar o objeto direto?
 > Ai no caso ficaria dessa forma:


> my $data = Data::Object->new(pessoa);

Você obviamente não entendeu nada do que foi escrito no package 
Data::Object.

> $data_masher->serialize( $data ) ;

Esta é a parte importante para responder à sua questão: é assim que você 
serializa objetos em Perl.

> ai ficaria algo assim
> 
> #arquivo classe.pm

Sem comentários, o nome do teu arquivo é horrível. Alguém por favor 
aponte a Viviane Oliveira para a documentação que explica como criar 
módulos em Perl? Eu não me lembro mais se é perlmodlib ou outra coisa...

> package Data::Object;
 > use strict;
> use warnings; 
> use Data::Serializer;


Que diabos é isso? Um módulo vazio? :D Isso não funciona, Viviane. Você 
precisa aprender a programar. Alguém, por favor, recomenda um bom livro 
de programação orientada à objetos para a Viviane começar?

> package Pessoa;

Você declarou outro package dentro do mesmo arquivo. A pesar de isso ser 
Perl válido, nós recomendamos que os novatos não tentem usar assim, por 
uma questão de boas práticas e também para evitar os problemas e 
armadilhas relacionadas com isso. Por favor separe as tuas classes uma 
por arquivo, e nomeie os arquivos conforme as classes que eles contém.

Por exemplo, o pacote Data::Object ficaria num arquivo chamado 
"Data/Object.pm" dentro do seu diretório de bibliotecas.

Nunca se esqueça de dizer "use warnings" e "use strict" quando você 
declarar um package novo.

> # Construtor
 > sub new {
 >   $clspss = shift;
 >   $this = ref ($clspss) || $clspss;
 >   $dados = {  nome => '' , telefone =>'', };
> 
>   return bless $dados, $this;
 > }

Meus deuses... por favor, repense os seus nomes. Procure não usar 
notação polonesa quando escrever código, isso não é mais 1970. E também 
procure ser uniforme quando escrever código.

O que é que quer dizer "clspss"?

Nunca construa DAOs que não aceitem atributos no seu construtor - este 
tipo de código não funciona bem no dia-a-dia, e alguém vai encontrar um 
"jeitinho" de colocar dados dentro das classes, e você vai estar a meio 
caminho de um inferno dantesco de manutenção.

 > 1;
> 
> No caso aqui, eu preciso de um arquivo para serializar  eum outro
> para deserializar

Por que? Você tem problemas para entender documentação, ou simplesmente 
não se deu ao trabalho de ler nada.

> #serial.pm   funcao para serializar
 > use Data::Serializer;
 > use strict;
 > use warnings;
> #funcao serializa o objeto
 > sub serialize {
 >   my $serialized = shift;
 >   my $obj = Data::Serializer->new();
 >   $serialized = $obj->serialize($serialized);
 >   return $serialized;
 > }
 >
 > 1;

Um arquivo não é um modulo. Leia Roger Pressman, "Engenharia de 
Software". Especialmente os primeiros capítulos, onde ele explica reuso 
de código, e conceitos básicos sobre módulos ou pacotes. Você precisa 
entender como organizar o software antes de sair criando montes de 
pacotes. Está apenas fazendo confusão.

> # esse arquivo eh onde ocorre a serializacao, onde eh 
 > # chamada a funcao serialize, e a deserializao
 > package Data::Object;
 > use strict;
> use warnings;
 > require("serial.pm");
 > require("classe.pm");

NÃO USE require() SE VOCÊ NÃO SABE O QUE ESTÁ FAZENDO.
Alguém por favor explique os detalhes, sim?

> # esse $pessoa foi utilizado para exemplo, para saber se estava
> # funcionado a serializaco e a deserializacao
 > #no caso teria q ser substituido pelo objeto.
 > my $pessoa = {
 >   nome => 'Marciano',
 >   sobrenome => 'Urano',
 > };

A pesar de ter mais de 10 anos de prática em ler código ruim dos outros, 
eu não consegui entender o que é que aquele "pessoa" tem a ver com isso 
tudo. Seria ótimo se você explicasse o seu problema em palavras simples, 
para o pessoal da lista te ajudar a escrever código para resolver o teu 
problema (que não parece ser nenhuma coisa do outro mundo).

Por favor seja clara e conscisa nos seus exemplos. Eu tenho mais o que 
fazer do que ler emails teus a noite inteira, com todo o respeito.

> #################################################################### 
> Como eu faria pra serializar o objeto aqui?  de que forma posso 
> transferi-lo e passa-lo para as funções? 
> ####################################################################

RTFM: "perldoc Data::Serialize"

 > #chama a sub serialize do arquivo serial.pm e serializa o objeto
> my $serializado = serialize($pessoa); 

 > # chama a sub deserial e deserializa o objeto
> my $deserializado = deserial($serializado);

> #funcao deserializa.
 > sub deserial {
 >   my $deserial = shift;
 >   my $obj = Data::Serializer->new();
 >   $deserial = $obj->deserialize($deserial);
>   return $deserial;
 > }
 > __END__

Que críticos mais leves do que eu comentem isso, por favor. Se eu 
continuar, vou começar a usar termos indelicados.

> Fiz dessa forma, pq seu exemplo, ficou um pouco vago pra mim..

O que está vago no meu exemplo? Por favor responda o email *para* *a* 
*lista* e faça perguntas. Seria muito mais simples de te explicar o que 
está vago lá do que tentar entender tudo o que você fez até aqui.

> Obrigada pela atenção!

Por nada. Obrigado por usar Perl.

Putamplexos.
-- 
Luis Motta Campos is a software engineer,
Perl Programmer, foodie and photographer.


More information about the SaoPaulo-pm mailing list