perlのオブジェクト指向の書き方って難しい。ぱっと見わかりにくい。いや、初心者には全然わからない。

で、色々調べてコードを読んでみて、perlのpackageについて自分なりに頭の中でとりあえず整理がついたので備忘録。


※簡単なクラスを作ってみて、その動きを簡単に整理したものなので、おそらく

もっと高度な書き方や違う方法もあるはず。とりあえず第一歩の理解を忘れないように書いてみました。


<作り方>

perlのクラス設計はpackageという一かたまりで表現されている。

・大文字で始まるクラス名.pmのファイルがクラス(設計図)。

・クラスファイルの一行目は、package 大文字で始まるクラス名

・(インスタンス)メソッドは、サブルーチンで表現する。

・(インスタンス)変数(群)は、1つのハッシュで表現する。keyが変数名、valueが値。


<使い方>

作ったクラスを利用するには、use クラス名 の宣言をすれば良い。


クラスの使い方で一番わかりにくかったblessと$selfと$classについて

・$classに入れられる(shift)されるのは、クラス.pmへの参照。

・$selfに入れられる(shift)されるのは、newメソッドを呼び出された時に生成されたハッシュへの参照。

・bless関数は、$selfと$classを関連付けする関数。


メソッド(振る舞い)はどのインスタンスでも同じだから、どのインスタンスからも大元のクラス名.pmを参照し、書かれているサブルーチンが呼び出され、実行される。

インスタンス変数は、それぞれのインスタンスで個別の値を持つ必要があるから、newで生成される毎にインスタンス変数群即ちハッシュが生成され、それぞれに参照される。


あと、$classとか$selfにshiftされてるのは、perlの仕様ということで今は深く考えない。(呼び出された時にそれ自身の参照が@_の最初に格納されていて云々・・・という感じ。)


と理解すれば、うまいこと参照を使って表現されているなーと腑に落ちました。


で、オブジェクト指向恒例の猫クラスを作ってインスタンスを作ってみました。



sub saysとsub lovesがメソッド定義、sub nameとsub colorがインスタンス変数の代入、出力のアクセサです。アクセサはサブルーチン呼び出し時に値の引数が有れば代入、なければ参照を返してます。

Nekoクラスを利用したコード。Neko.pmは ./TestPackages/Neko.pm に入れていたので、場所を指定したuse文となっています。



実行すると、それぞれの猫がちゃんと喋ってくれました。

neko


<まとめ>
猫はかわいい。

次のステップ、継承、移譲はもう少し書式に慣れてから調べることにする。仕組みを理解し、イディオムを覚えてしまえば、どうって事無いはず・・・。