[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