Implementação limpa do padrão de estratégia em Perl
-
09-06-2019 - |
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.
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