Pergunta

Como escrevo uma implementação limpa do padrão de estratégia em Perl?Quero fazer isso de uma forma que aproveite os recursos do Perl.

Foi útil?

Solução

Realmente depende do que você entende por "implementação limpa".Como em qualquer outra linguagem, você pode usar o sistema de objetos do Perl com polimorfismo para fazer isso por você.Entretanto, como Perl possui funções de primeira classe, esse padrão normalmente não é codificado explicitamente.O exemplo de Leon Timmermans de

sort { lc($a) cmp lc($b) } @items

demonstra isso com bastante elegância.

No entanto, se você está procurando uma implementação "formal" como faria em C++, veja como seria usar Perl+alce.Esta é apenas uma tradução do código C++ de Wikipedia - Padrão de estratégia, exceto que estou usando o suporte do Moose para delegação.

package StrategyInterface;
use Moose::Role;
requires 'run';


package Context;
use Moose;
has 'strategy' => (
  is      => 'rw',
  isa     => 'StrategyInterface',
  handles => [ 'run' ],
);


package SomeStrategy;
use Moose;
with 'StrategyInterface';
sub run { warn "applying SomeStrategy!\n"; }


package AnotherStrategy;
use Moose;
with 'StrategyInterface';
sub run { warn "applying AnotherStrategy!\n"; }


###############
package main;
my $contextOne = Context->new(
  strategy => SomeStrategy->new()
);

my $contextTwo = Context->new(
  strategy => AnotherStrategy->new()
);

$contextOne->run();
$contextTwo->run();

Outras dicas

Use subreferências e encerramentos.Um bom exemplo perlish disso

sort { lc($a) cmp lc($b) } @items

Este artigo pode ser de alguma utilidade.Ele cobre um exemplo de uso do padrão de estratégia em Perl. http://www.perl.com/pub/a/2003/08/07/design2.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top