26 June
2006

Class::Accessor で setter, getter を自動生成

[Perl] 

しばらく Perl を使っていなかった(ちょこっとしたツールを作るぐらい)のだが、ある目的のために Perl を勉強し直す事にした。これから数日は Perl ネタが続くおそれがある ;-)

で、昨晩に色々と見ていてたどり着いたのが、Perl の Class::Accessor モジュールである。これは、オブジェクトの属性を設定したり(setter) 取り出したり(getter)する Accessor をいちいち作らなくても済むようにできる。


例えば、従業員クラスがあって、名前(name)、salary(給料)という属性を set, get するメソッドをわざわざ

package Emplyee;

sub name {
    my $self = shift;
    if(@_) {
        $self->{name} = $_[0];
    }
    return $self->{name};
}

sub salary {
    my $self = shift;
    if(@_) {
        $self->{salary} = $_[0];
    }
    return $self->{salary};
}

# などなど。

というように書かなくても、

package Employee;
use base qw(Class::Accessor);
Employee->mk_accessors(qw(name role salary));

というように簡単に書けてしまうというもの。

Perl Best Practices 流に書く場合

ついでに、上記のように setter, getter をひとつのメソッドにしてしまうというのは、Perl で良く使われる手法らしいのだが、Damian さんの Perl Best Practices という本には、「setter と getter を分離して、接頭語に set_, get_ をつけるように」ということが書いてあるらしい(本は読んだことないけど。perldoc Class::Accessor に書いてある)。その流儀に従う場合のおまじないが、以下のこれ。

__PACKAGE__->follow_best_practice

このおまじないをつけたときには、

package Employee;
use base qw(Class::Accessor);
Employee->mk_accessors(qw(name role salary));
1;

my $satoshi = new Employee({ name => "Satoshi", salary => 200 });
$satoshi->salary(100); # 減給
print $satoshi->salary, "\n";

というプログラムを

package Employee;
use base qw(Class::Accessor);
__PACKAGE__->follow_best_practice;
Employee->mk_accessors(qw(name role salary));
1;

my $satoshi = new Employee({ name => "Satoshi", salary => 200 });
$satoshi->set_salary(100); # 減給
print $satoshi->get_salary, "\n";

というように書かなければならなくなる。間違った書き方(ひとつめの書き方)をすると、

Can't locate object method "salary" via package "Employee" at test_accessor.pl line 8.

というように、メソッドが見つけられないエラーになる。

Posted by Satoshi at 02:27 | Comments (0) | Trackbacks (0) | このエントリーを含むはてなブックマーク
Comments
There is no comment.
Trackbacks
Please send trackback to:http://www.randynetwork.com/blog/248/tbping
There is no trackback.
Post a comment