W.I.S. Laboratory
menu-bar

Perl


Perlでダックタイピングしてみる

Perlでダックタイピングしてみた。

Perlのオブジェクト指向は、他のオブジェクト指向型言語をやってきた人にとってはとても奇異に見えると思う。
手続き型言語からオブジェクト指向型言語に成長したので、JavaやRubyなどの生まれながらにオブジェクト指向な言語から見ると「取ってつけた感」があるが、よく見ていくとPerlのオブジェクト指向設計はとても良くできていると感心させられる点が多数ある。
基本設計を壊さず、予約語を可能な限り増やさず、上手いアイデアでOOPを実現している。

Perlのオブジェクトは連想配列そのものだ。
「class」という予約後は追加されていないので、「package」で代用する。
クラス変数はパッケージ変数であり、コンストラクタは「new」という名前のサブルーチンだ。(必ずしもnewでなくてもいい)
このサブルーチンの引数にパッケージ名を渡し、サブルーチン内で連想配列をひとつ作る。
この連想配列をメンバ変数群として扱う。
要するに正確には変数ではなく、連想配列の要素(キーと値が結びついたもの)が「メンバ変数」になる。
その連想配列とパッケージ名をbless関数で関連付け、そのリファレンスを返す。
これがインスタンスだ。
メソッドはサブルーチンとして記述する。
先程の連想配列とパッケージ名を関連付けたリファレンスを第1引数としてサブルーチンに与えることでデータとコードを紐付ける。
すべてのサブルーチン内でその引数を使って連想配列にアクセスすれば、メンバ変数を扱えることになる。
デストラクタは「DESTROY」という特別なサブルーチンであり、リファレンスをundefしたときやガーベージコレクタが走ったときに実行される。

他のオブジェクト指向型言語の用語をPerlに置き換えると以下のようになる。

  • クラス・・・パッケージ
  • オブジェクト・・・連想配列
  • メンバ変数・・・連想配列の要素
  • メソッド・・・サブルーチン


[ 戻る ]
saluteweb