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 pat tern を使うのが普通
だろう。perldoc perlobj すると、initialize() をConstructorと
分けている。
Interface とかabstract class もない。このあたりは、コンパイ
ラのチェックの機能でしかないので、自分で「作っているつもり」
になれば良い。document で明示しよう。
---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科
ラクダ本では、
> オブジェクトはリファレンスで指された「物」にすぎない
と書かれていますね。
僕は、Perl から OOP に入ったので、何となくリファレンスを憶えて応用して
いったら、それが OOP と呼ばれているものであった、という感じでした。他の
言語の OOP を知らないので、C++ などで OOP が「大袈裟」に喧伝されていたイ
メージから、OOP ってもっと恐ろしい大仰なものかというイメージを脹らませて
いたものでした。
で、Java など OOP で土台から言語仕様をガチガチに固め直してしまったから、
今度はアスペクト志向などという、本末転倒なことになるんじゃないかと。おっ
しゃる通り、Perl だと、OOP のオブジェクトとして扱うことを任意で放棄し
て、呼出し側で、リファレンスとしていじくることができます。
# アスペクト志向という言葉をよく知らないので、外している可能性もあり
# ます。Perl でもアスペクト志向の CPAN モジュールが作られてた気がしま
# す。
> Constructor や new がblessという演算子なので、どの関数呼び出
> しがConstructorかがわからない。自分でオブジェクトの作り方を
> 決める必要がある。new() か、factory pat tern を使うのが普通
> だろう。perldoc perlobj すると、initialize() をConstructorと
> 分けている。
>
> Interface とかabstract class もない。このあたりは、コンパイ
> ラのチェックの機能でしかないので、自分で「作っているつもり」
> になれば良い。document で明示しよう。
POD の中に各ルーチンを埋め込むような感じでコーディングしたりします。
=head1 METHODS
=over
=item new()
This is the constructor.
=cut
sub new () {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
=item hoge()
This is an object method.
=cut
sub hoge() {
(略)
}
=back
--
Masanori HATA