« なぜか日記機能 | メイン | EXEpress CX »

2006年04月09日

ツール開発メモ:: Perlでオブジェクトを扱う

    

クラスとかオブジェクト指向とかの話なんだけど、クラスという感じではないし、オブジェクト指向っぽくなくてもいいので、とりあえずオブジェクトを扱うと言うタイトルにした。このタイトルも微妙だけど。
以降、便宜上それはクラスと呼ぶことにする。

それはともかく、時々使いたくなってそのたびに忘れてしまっているのでここにメモしておく。
内容はそんなに確かじゃないかも。

ファイル名とパッケージ名は同じにする。
パッケージ名は単なる名前空間っぽい。詳しくは知らないけど。
ファイル名の拡張子はpmにする。
ファイルの中身は次のような感じ。

package hello;
use strict;
sub new {
    my $className = shift;
    bless {
        Name => undef,
    }, $className;
}
sub setName {
    my $self = shift;
    $self->{Name} = shift;
}
sub print {
    my $self = shift;
    print "Hello ".$self->{Name}."\n";
}
sub DESTROY {
    print "destory.\n";
}
1;

new 関数の名前は何でもいいみたいだけど、new とするのが慣習のよう。
で、この関数の最初の引数にはそのクラスの名前が渡される。
クラスのデータにしたいものを bless 関数でクラスの名前と関連付ける。
bless 関数は出来上がったクラスのインスタンス(?)を返す。
この関数では return が省略されているけど、関数は最後の式の実行結果を返すので、ここでは bless の返り値、つまりクラスのインスタンス(?)が new の返り値になる。
関連付けた後に初期化などしたい場合は、bless の返り値を変数に入れておいて何かして、bless の返り値を入れた変数を return で返せばいい。
bless の第1引数は関連付けたい変数、第2引数はクラス名。
ここでは第1引数にハッシュを渡している。
別にスカラーや配列でもいいけど、クラスのメンバ変数が値1個だけとか、配列になってたりしたら使い辛いので、特に何も考えずにハッシュにしたほうが楽。
効率を重視するのならスカラーや配列のほうが少し速いかもしれないけど、自分の場合ほとんどバッチ処理用にPerl を使うのでそんなに効率は重視しない。CGI とか書く場合には考えたほうがいいかも。
第2引数のクラス名は固定値にしてもいいけど、このクラスを継承したい場合クラス名が変わるので、new 関数の最初の引数で渡される名前と関連付けたほうが良い。
new 関数の中身はそんな感じ。

これからわかるように、perl のクラスは少し変な感じがする。
いくつのかの機能があって、それを組み合わせるとクラスが実現できるって感じだろうか?
クラス以外にも柔軟に対応できそうな気がする。

setName と print 関数はメンバ関数。
最初の引数にはクラスのインスタンスの参照が入ってくる。
ただし、それは new で作ったやつをアローで呼び出した場合。
そうでない場合、例えば hello::print() と呼び出すとそうはならない。この場合は明示的にインスタンスを引数に入れる必要がある。
関数の中身は見たまま。

DESTROY 関数はデストラクタ。

例の中身は以上のような感じ。
で、これを使うには次のようにする。

use hello;
my $helloInst = new hello();
$helloInst->setName( "Kaede" );
$helloInst->print();

特に説明の必要はないだろうから説明は割愛。



投稿者 Takenori : 2006年04月09日 12:48




comments powered by Disqus
Total : Today : Yesterday : なかのひと