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.

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

新しいコメントの投稿

このフィールドの内容は非公開にされ、公表されることはありません。
  • HTMLタグは使用できません
  • 行と段落は自動的に折り返されます。

書式オプションに関するより詳しい情報...

CAPTCHA
この質問はあなたが人間であるかどうかについて調べる為と、自動化したスパムを防ぐ為のものです。うまくいかない場合は電子メールでお問い合わせ下さい。
イメージ CAPTCHA
画像の中に見える文字を入力して下さい