読者です 読者をやめる 読者になる 読者になる

理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

MooseでPrototypeパターンやってみた

MooseのCookbookは読み終わったので、サボりまくってたデザインパターンをまたやってみようとか思ってみました!


Prototypeパターンがなんで必要なのかって話で

  • ちょっとの違いでいちいちクラス作りまくるのが面倒
  • もう一回同じクラスを作り直すのが面倒
  • フレームワークと生成するインスタンス変数を分ける

とかいうのがあるらしい。なるほどなるほど。恥ずかしながら、こういうのは発想としてなかった感じ。勉強してよかった。
そういえば、今度フレームワーク勉強会に参加するよ!他に参加される方はよろしくおねがいします。


まずcloneしっかり定義しとけ!ていう意味で、Prototype.pmを定義しとく。

package Prototype;
use Moose::Role;
requires 'clone';
1;

それを使うのがこちら。ぼくのidを返してくれるステキなモジュール。cloneもでっちあげる。

package Kiririmode;
use Moose;

with 'Prototype';

has 'name' => ( isa => 'Str', is => 'rw', default => 'kiririmode' );

sub clone {
    my ($self) = @_;
    return Kiririmode->new( name => $self->name() );
}

1;

1個だと味気ないので、Kitoshi.pmも作る。
フィールドをnameからnamaeにしたけど、結局味気ないですね。
"きとし"というのはぼくのもう一個のハンドルなんですけど、もちろんどうでもいい。

package Kitoshi;
use Moose;

with 'Prototype';

has 'namae' => ( isa => 'Str', is => 'rw', default => 'kitoshi' );

sub clone {
    my ($self) = @_;
    return Kitoshi->new( namae => $self->namae() );
}
        
1;

クライアント。これクライアントていうよりは、何となくサーバって感じがするなー。

package Client;
use Moose;

has 'list' => ( is => 'rw', isa => 'HashRef', default => sub{{}} );

sub register {
    my ($self, $name, $obj) = @_;
    $self->list->{ $name } = $obj;
}

sub get_clone {
    my ($self, $name) = @_;
    return $self->list->{ $name }->clone();
}

1;

最後にmain。"きりり"というのはぼくのクソ昔のハンドルなんですけど、やっぱしどうでもいい。

#!/opt/local/bin/perl
use Kiririmode;
use Kitoshi;
use Client;

sub say { print @_, "\n" }

my $kiririmode = Kiririmode->new;
my $kiriri     = Kiririmode->new( name => "kiriri" );
my $kitoshi    = Kitoshi->new;

my $client = Client->new();
$client->register( "kiririmode", $kiririmode );
$client->register( "kitoshi",    $kitoshi );
$client->register( "kiriri",     $kiriri );

my $handle;
$handle = $client->get_clone( "kiririmode" );
say $handle->name(); # kiririmode
$handle = $client->get_clone( "kiriri" );
say $handle->name(); # kiriri
$handle = $client->get_clone( "kitoshi" );
say $handle->namae(); # kitoshi