理系学生日記

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

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

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

Prototypeパターンがなんで必要なのかって話で -ちょっとの違いでいちいちクラス作りまくるのが面倒 -もう一回同じクラスを作り直すのが面倒 -フレームワークと生成するインスタンス変数を分ける とかいうのがあるらしい。なるほどなるほど。恥ずかしながら、こういうのは発想としてなかった感じ。勉強してよかった。 そういえば、今度フレームワーク勉強会に参加するよ!他に参加される方はよろしくおねがいします。

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

|perl| package Prototype; use Moose::Role; requires 'clone'; 1; ||<

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

|perl| 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にしたけど、結局味気ないですね。 "きとし"というのはぼくのもう一個のハンドルなんですけど、もちろんどうでもいい。

|perl| 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; ||<

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

|perl| 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。"きりり"というのはぼくのクソ昔のハンドルなんですけど、やっぱしどうでもいい。

|perl|

!/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 ||<