Wednesday, 8 November 2006

Perl のオブジェクト指向



Perl のオブジェクト指向は、package と hash (のreference) を bless で結びつけるだけ。hash (連想配列) 以外でのreferenceでもいいんだけど、hash を使うものでしょう。



 package Class;

 $obj = {attribute=>'value'};

  bless $obj;



hash の中味にはblessは関与しないから、インスタンス変数の継承がどうとかこうとかの問題から、うまく逃げている。めんどくさくなく多重継承を実現する一つの方法だね。誰が、いつ、どこで初期化しても良い。初期化しなくても良い。なくても文句言いません。気軽に多重継承出来る。



必ず、オブジェクトを明示してメソッド呼び出しするので、Java みたいに単なる関数呼び出しとメソッド呼び出しが混乱することもない。 Package の変数は、クラス(static)変数に相当し、インスタンス変数ではないです。



hash が見えるのを嫌う人も多いが、オブジェクトを呼び出す方で任意の属性を付加出来るのは便利。普通のオブジェクト指向言語では許されない。そのあたりがPerlっぽい。 呼出側で、オブジェクトをカスタマイズ出来る。 一方で、hash の処理の重さは気になるね。hash のkeyをquote する必要は、Perl 5 からなくなった。



hash を明示するのは、常に、this.var みたいな書き方をするのに近い。

class Hoge {

 int i;

 Hoge(int i) { this.i = i; }

}

とかに似てる。Perl だったら、

  package Hoge;

 sub new { my ($i) = @_; my $self = {} ; $self->{i} = $i; bless $self; }

かな。

 sub new { my ($i) = @_; bless {i=>$i}; }

でもいい。



Constructor や new がblessという演算子なので、どの関数呼び出しがConstructorかがわからない。自分でオブジェクトの作り方を決める必要がある。new() か、factory pattern を使うのが普通だろう。perldoc perlobj すると、initialize() をConstructorと分けている。



Interface とかabstract class もない。このあたりは、コンパイラのチェックの機能でしかないので、自分で「作っているつもり」になれば良い。document で明示しよう。

No comments: