Class::Accessor で setter, getter を自動生成
しばらく 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.
というように、メソッドが見つけられないエラーになる。
