アクセサを生成する



  1. Perl




  2. オブジェクト指向



  3. アクセサ

 今回はアクセッサを作成してみましょう。

1. アクセッサとは何か?

 オブジェクト指向ではデータを直接いじっては駄目です。オブジェクト指向ではオブジェクトに対するアクセスは公開されたメソッドを通じて行うのが正しい作法だからです。

my $book = Book->new;

# 駄目!
$book->{title} = 'aaa';

 データをいじる場合は、アクセッサを通じて行います。アクセッサとは、データを変更したり取得したりするためのメソッドのことを言います。

 以下のようにアクセッサを使ってデータに値を設定するのが正しい作法です。

my $book = Book->new;
$book->title('aaa');

 クラスを作成する側は、アクセッサを作成して公開する義務があります。

2. アクセッサの作成

 では早速アクセッサを作成してみましょう。Perlでは、値を取得するのにも、値を設定するのも同じアクセッサを使って行うというのが一般的です。

 (Perlベストプラスティスという本では、設定のためのアクセッサと取得するためのアクセッサは分けるべきだと書いてありますが、CPANなどの実際で見ると、アクセッサはひとつだけ作ることが好まれているようです。)

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

 $self には、オブジェクトが入ってきます。それで、@_に値があった場合は、$_[0] を $self->{title} に設定しています。

 最後の行で$self->{title} を返却しています。

3. 値が設定された場合は、古い値を返却するアクセッサを作成する

 上記のアクセッサのほかに、値が設定された場合に古い値を返却するように実装しているアクセッサも一般的です。

my $book = Book->new(title => 'aaa');
my $old_val = $book->title('bbb');

 古い値を返すアクセッサは以下のように作成します。

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

 これで、コンストラクタとアクセッサの解説が終わりました。後は好きなメソッドを追加していけばよいだけですね。