[Cascavel-pm] Parse de Endereço (Was: Re: Separando campos)
Eden Cardim
edencardim em gmail.com
Quinta Março 22 10:13:40 PDT 2007
On 3/20/07, Daniel Ruoso <daniel em ruoso.com> wrote:
> Olha que hoje pra mim o código não me parece tão ruim assim... Acho que
> os if's encadeados deixam mais claro as operações que estou fazendo...
> Mas, para exercitar, como você faria?
Eu sei que a pergunta não foi pra mim, mas já que o tema da semana é
"padrões de projeto", eu usaria um Chain of Responsability. Seria algo
assim:
<untested code>
package AddressExtractor;
use Moose;
has parsers => (isa 'ArrayRef', is => 'rw', default => sub {[]});
sub add_parser {
push @{shift->parsers}, shift;
}
sub parse {
my($self, $address) = @_;
my @parsed;
foreach my $parser (@{$self->parsers}) {
last if @parsed = $parser->parse($address);
}
return @parsed;
}
package ParserA;
use Moose;
sub parse {
my($self, $address) = @_;
if($address =~ /^rua\,*\s*(.+)$/i) {
my ($t,$l,$n,$c);
#lógica de extração aqui...
return ($t,$l,$n,$c);
}
}
package ParserB;
#etc...
package main;
my $extractor = AddressExtractor->new();
$extractor->add_parser( ParserA->new() );
$extractor->add_parser( ParserB->new() );
my ($t,$l,$n,$c) = $extractor->parse("Av. Foo, etc...");
</untested code>
--
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