Pregunta

¿Cómo escribo una implementación limpia del patrón de estrategia en Perl?Quiero hacerlo de una manera que aproveche las características de Perl.

¿Fue útil?

Solución

Realmente depende de lo que quieras decir con "implementación limpia".Como en cualquier otro lenguaje, puedes usar el sistema de objetos de Perl con polimorfismo para hacer esto por ti.Sin embargo, dado que Perl tiene funciones de primera clase, este patrón normalmente no se codifica explícitamente.El ejemplo de Leon Timmermans

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

lo demuestra con bastante elegancia.

Sin embargo, si está buscando una implementación "formal" como la que haría en C++, así es como se vería usando Perl+.Alce.Esto es sólo una traducción del código C++ de Wikipedia - Patrón de estrategia, excepto que estoy usando el soporte de Moose para la delegación.

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();

Otros consejos

Utilice subreferencias y cierres.Un buen ejemplo perverso de esto.

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

Este artículo puede ser de alguna utilidad.Cubre un ejemplo del uso del patrón de estrategia en Perl. http://www.perl.com/pub/a/2003/08/07/design2.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top