3

Perl で戦略パターンのクリーンな実装を作成するにはどうすればよいですか? Perl の機能を活用した方法で行いたいと考えています。

4

2 に答える 2

5

それは、「クリーンな実装」の意味に大きく依存します。他の言語と同様に、Perl のオブジェクト システムとポリモーフィズムを使用して、これを行うことができます。ただし、Perl にはファースト クラス関数があるため、通常、このパターンは明示的にコーディングされません。Leon Timmermans の例

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

これを非常にエレガントに示しています。

ただし、C++ で行うような「正式な」実装を探している場合は、Perl+ Mooseを使用すると次のようになります。これは、ウィキペディアからの C++ コードの単なる翻訳です-- Strategy pattern。ただし、Moose の委任サポートを使用していることを除きます。

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();
于 2008-09-17T14:17:36.333 に答える
4

サブ参照とクロージャを使用します。これの良いパーリッシュの例

sort { lc($a) cmp lc($b) } @items
于 2008-09-16T23:21:53.973 に答える