PerlでOOPの復習 〜Class::Accessor::Fast〜
Perlでのオブジェクト指向の復習を始めました。
Class::Accessor::Fastは便利だと再認識しました。
例えば以下のような、名前(name)とメールアドレス(email)とホームページ(url)をプロパティに持つオブジェクトを作成するコードをClass::Accessor::Fast
で書くと、わずか数行で終わります。
Class::Accessor::Fastを使わない場合は、プロパティが増える度にアクセサを追加しなければなりません。
package MyApp; use strict; use warnings; sub new { my ($class, $args) = @_; my $self = bless { 'name' => $args->{name}, 'email' => $args->{email}, 'url' => $args->{url}, }, $class; return $self; } sub name { my $self = shift; my $name = shift; if ($name) { $self->{name} = $name; } return $self->{name}; } sub email { my $self = shift; my $email = shift; if ($email) { $self->{email} = $email; } return $self->{email}; } sub url { my $self = shift; my $url = shift; if ($url) { $self->{url} = $url; } return $self->{url}; } 1; __END__
これがClass::Accessor::Fastを使うと、
package MyApp; use strict; use warnings; use base qw(Class::Accessor::Fast); __PACKAGE__->mk_accessors(qw(name email url)); 1; __END__
となります。
mk_accessorsによりアクセサを自動生成してくれます。
また、newメソッドも自動的に定義してくれます。
使い方は、どちらのコードを使っても一緒です。
#!/us/bin/perl use strict; use warnings; use MyApp; my $object = MyApp->new({ name => 'user01', email => 'user01@example.com', url => 'http://www.example.com/', }); print "Name : ", $object->name, "\n"; print "Email : ", $object->email, "\n"; print "URL : ", $object->url, "\n"; $object->name('user02'); $object->email('user02@example.com'); print "Changed Nane : ", $object->name, "\n"; print "Changed Email : ", $object->email, "\n"; print "No Change URL : ", $object->url, "\n"; __END__
(実行結果)
Name : user01 Email : user01@example.com URL : http://www.example.com/ Changed Nane : user02 Changed Email : user02@example.com No Change URL : http://www.example.com/
Class::Accessor::Fastを使うと、すっきりしたコードになります。
Class::Accessor::Fast - Faster, but less expandable, accessors - metacpan.org