W.I.S. Laboratory
menu-bar

Perl


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

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

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

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

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

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

クラスもメンバ変数もメソッドも無いPerlで、言語仕様をほとんど拡張することなく、ちゃんとOOPとして書けるようになっているのには驚かされた。


[ 戻る ]
saluteweb