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