[SP-pm] Verificação de parâmetros em métodos

Ulisses Montenegro ulisses.montenegro at gmail.com
Tue Dec 4 03:19:04 PST 2012


Andre,

Vou pegar como exemplo o segundo método da documentação
do MooseX::Params::Validate:

sub bar {
    my $self = shift;
    my ( $foo, $baz, $gorch ) = validated_list(
        \@_,
        foo   => { isa => 'Foo' },
        baz   => { isa => 'ArrayRef | HashRef', optional => 1 },
        gorch => { isa => 'ArrayRef[Int]', optional => 1 }
    );
    [ $foo, $baz, $gorch ];
}

Então, primeiro o $self é consumido da lista de argumentos (ele sempre vem
como primeiro argumento de toda chamada a um método em uma instância), e
logo em seguida os demais argumentos são fornecidos pelo retorno do
validated_list(). Mas o validated_list precisa saber de onde extrair os
demais valores, e faz isso recebendo uma referência ao demais parâmetros
recebidos pelo método. Se fosse uma assinatura normal, você teria:

my ($self, $foo, $baz, $gorch) = @_;

Deve rolar algum truque com os símbolos para associar 'foo', 'baz' e
'gorch' no hash recebido por validated_list() com $foo, $baz e $gorch, mas
acredito que o motivo pelo qual temos de passar a lista de argumentos, seja
como cópia dos valores ou como referência, é evidente -- validate_list()
precisa saber quais foram os argumentos recebidos e compará-los com os
tipos informados.

Se eu entendi direito a sua pergunta, acho que a minha resposta deve ter
sido menos pior agora. =)


2012/12/4 Andre Carneiro <andregarciacarneiro at gmail.com>

> Hummm... acho que fui vago demais!
>
> Vamos ver se consigo me expressar melhor...
>
>
> A pergunta é a seguinte: tudo o que eu passo de útil para o método
> 'validated_list' não tem nada a ver com \@_. Então por que eu preciso
> passar isso como referência? Referência de que?
>
> Mesmo olhando o código do módulo, não consegui entender direito o que ele
> leva nessa referência, e ainda por cima, o método é estático! Que diabos
> tem dentro desse \@_ ? E como isso vai parar lá, já que não tem instância
> nenhuma do módulo, só um 'use'...(método estático, tá ligado?). Desconfio
> que a resposta tenha a ver com o 'use', mas não tenho certeza.
>
>
> Acho que essa pergunta ficou um pouco 'menos pior'...
>
>
> Eden???
>
>
>
> Cheers!
>
>
>
> 2012/12/3 Hernan Lopes <hernanlopes at gmail.com>
>
>> O que acontece é o seguinte,
>> Veja o exemplo:
>>
>> use Data::Printer;
>>
>> sub params {
>> ##
>> # o usual seria algo assim:
>> # my ( $self, $var1, $var2, $varX ) = @_;
>>
>> ##
>> # mas tb é possível fazer assim:
>> warn p @_; #tem os parametros acima
>> my $self = shift; #tira o primeiro item da lista @_
>> warn p @_; #imprime status atual da lista, sem o primeiro item que acaba
>> de ser retirado
>> my ( $var1, $var2, $varX ) = @_; #associa cada item da lista da esquerda
>> ao correspondente na lista @_ da direita
>> warn p $var1;
>> warn p $var2;
>> warn p $varX;
>> ##
>> # e tambem é possível passar os parametros diretamente para outro metodo
>> com \@_:
>> # $self->metodo( \@_ );
>> # ou, &metodo( \@_ );
>> # etc...
>> }
>>
>> &params( 'SELF', {aa=>2}, {bb=>3}, {cc=>4} );
>>
>> 2012/12/3 Ulisses Montenegro <ulisses.montenegro at gmail.com>
>>
>>> André,
>>>
>>> Faz tempo que não brinco com Perl, mas se a memória não falha,
>>> existiriam dois motivos legítimos para utilizar um parâmetro por referência
>>> (que é o que o \@_ representa, uma referência para o @_):
>>>
>>> 1. Modificar os valores originais, já que o comportamento padrão de Perl
>>> é passagem por valor e não por referência, ou
>>> 2. Evitar a cópia dos valores dos parâmetros (nesse caso seria mais uma
>>> otimização do que uma necessidade)
>>>
>>> Como dizem os americanos, I might be putting my foot in my mouth, mas
>>> acho que seria isso. Para mais detalhes sobre o uso de referências em Perl,
>>> 'perldoc perlref'.
>>>
>>> []'s
>>>
>>>
>>> 2012/12/3 Andre Carneiro <andregarciacarneiro at gmail.com>
>>>
>>>>  Boa noite!
>>>>
>>>>
>>>> Estou fazendo uma pesquisa sobre validação de parâmetros em métodos,
>>>> para módulos que utilizam Moose. Encontrei a seguinte solução abaixo:
>>>>
>>>>
>>>>
>>>>
>>>> http://search.cpan.org/~drolsky/MooseX-Params-Validate-0.16/lib/MooseX/Params/Validate.pm
>>>>
>>>>
>>>>
>>>> No entanto, tem um detalhe que eu não compreendi. Porque eu preciso
>>>> passar \@_ para o método 'validated_list' ?
>>>>
>>>> Dei uma olhada no código, e vi que ele utiliza o primeiro parâmetro que
>>>> é chamado de '$args' dentro do método e existe um algoritmo que faz uma
>>>> série de verificações nessa variável e depois envia para validate_with,
>>>> através do módulo Params::Validate. Lá descobri que 'validate_with' é um
>>>> 'símbolo' que é interpretado como uma sub por um outro método, enfim... Tem
>>>> alguém por aqui capaz de me ajudar a entender esta "bagunça" e,
>>>> principalmente, porque do \@_ ??
>>>>
>>>>
>>>> OBS: Antes de qualquer troll me interpretar mal, repare que coloquei
>>>> 'bagunça' entre aspas, o que significa que não acho que isso realmente seja
>>>> uma bagunça. Por favor, evitem comentários inúteis em cima disso! Já me
>>>> considero velho e sem saco pra flames...  ;-)
>>>>
>>>>
>>>> Obrigado!
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> André Garcia Carneiro
>>>> Software Engineer
>>>> (11)982907780
>>>>
>>>> =begin disclaimer
>>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>>> =end disclaimer
>>>>
>>>>
>>>
>>>
>>> --
>>> “If debugging is the process of removing software bugs, then programming
>>> must be the process of putting them in.” - Edsger Dijkstra
>>>
>>> =begin disclaimer
>>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>>> =end disclaimer
>>>
>>>
>>
>> =begin disclaimer
>>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>
>
> --
> André Garcia Carneiro
> Software Engineer
> (11)982907780
>
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>


-- 
“If debugging is the process of removing software bugs, then programming
must be the process of putting them in.” - Edsger Dijkstra
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20121204/fdfb4cfc/attachment-0001.html>


More information about the SaoPaulo-pm mailing list