[Cascavel-pm] assinatura de método em Perl

Eden Cardim edencardim em gmail.com
Quinta Novembro 30 13:23:55 PST 2006


On 11/30/06, Alceu R. de Freitas Jr. <glasswalk3r em yahoo.com.br> wrote:
> Olá monges,
>
> Sem querer fazer comparações (e criar um flame war)
> como vocês lidam com a ausência do conceito de
> assinatura de métodos em Perl?
>
> Por exemplo, eu quero executar uma função que vai
> precisar de mais ou menos parâmetros dependendo do
> tipo de autenticação que ela vai usar.
>
> Eu não sei se utilizei a melhor forma, mas acabei
> criando uma classe Credential que guardaria as
> credenciais, fazendo com que a chamada da função seja
> feita corretamente e só implementando um método na
> classe que executa essa função.
>
> Em Java, o conceito de assinatura de método tornaria
> isso mais simples. Alguma dica sobre como implementar
> isso em Perl?

Bem, pelo que eu entendi, você tá querendo obter "method overriding"
(sei lá como se chama isso em português). Se for isso, como sempre,
tem várias formas de fazer, a mais prática que consigo pensar no
momento é com AUTOLOAD:

    sub AUTOLOAD {
        my($self, %param) = @_;
        my $method = our $AUTOLOAD;
        $method =~ s/.*:://;
        if(@{[keys %param]} == 3) {
            goto &threeparam_meth;
        }
        if(@{[keys %param]} == 1) {
            goto &oneparam_meth;
        }
        croak("Couldn't find method $method");
    }

Claro que isso só vai funcionar nas circunstâncias que estou imaginando :).
Você pode fazer uma verificação mais rigorosa dos argumentos, se
precisar, ou então mudar a modelagem da sua solução (é o que eu
faria), tem alguns padrões de projeto que me parecem ser adequados ao
seu problema.

-- 
Eden Cardim
Instituto Baiano de Biotecnologia
Núcleo de Biologia Computacional e Gestão de Informações Biotecnológicas
Laboratório de Bioinformática
--
"you seem to think that 'close enough' is close enough...
please learn to be 'literal' around programming."
merlyn - on irc.freenode.net#perl


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