[SP-pm] Duvida primaria

Nelson Ferraz nferraz at gmail.com
Thu Oct 21 02:05:05 PDT 2010


As dispatch tables são úteis quando podemos traduzir as condições em
chaves e valores:

Por exemplo:

if ( $op eq 'foo' ) {
    foo();
} elsif ( $op eq 'bar' ) {
    bar();
} elsif ( $op eq 'baz' ) {
    baz();
}

Pode ser facilmente traduzida para:

my %action = (
    foo => \&foo,
    bar => \&bar,
    baz => \&baz,
);

Depois, basta testar se existe a chave $op em %action, e executá-la:

if ( my $sub = $action{$op} ) {
    $sub->();
}

A principal vantagem não é performance, mas clareza: fica muito mais
fácil de ler e modificar o código quando ele está escrito na forma de
uma tabela, especialmente se você tiver um número considerável de
opções.

No entanto, existem casos em que não podemos fazer um simples lookup.
Veja o exemplo a seguir:

if ( $x == 0 and $y == 0 ) {
    foo();
} elsif ( $x < 0 and $y > 0 ) {
    bar();
} elsif ( $x > 0 and $y < 0 ) {
    baz();
}

É possível converter o código acima em uma lista de testes e ações que
lembra uma dispatch table; algo como:

my @testes = (
    {
        cond => sub { $x == 0 and $y == 0 },
        acao => \&foo,
    },
    {
        cond => sub { $x < 0 and $y > 0 },
        acao => \&bar,
    },
    {
        cond => sub { $x > 0 and $y < 0 },
        acao => \&baz,
    }
);

for my $t ( @testes ) {
    if ( $t->{cond}->() ) {
        $t->{acao}->();
        last;
    }
}


O método acima, ou alguma variação dele, pode ser útil se você tiver
dezenas de condições que obedecem uma lógica simples: SE uma certa
condição for atendida, ENTÃO execute o seguinte código.

Mas, na maioria dos casos mais simples, com duas ou três condições,
não vejo problemas em usar ifs/elsifs, ou given/when.

OBS: Não testei os exemplos acima, avisem se encontrarem algum erro. :)


More information about the SaoPaulo-pm mailing list