データと関数の組み合わせでオブジェクト指向を実現する
言語の設計思想として、あらゆるものをオブジェクト指向にしようという発想がある。言語の中で扱われるすべてのものが、オブジェクトとなる。
つまり、オブジェクトが先に存在して、そこにメソッドが生えているという考え方だ。
これは、オブジェクトとメソッドが密結合しているともいえる。
これに対して、もう一つのアプローチをとる言語も存在する。
データと関数の組み合わせでオブジェクト指向を実現する
一方で、オブジェクトというあくまで補助的なもので、まず先に、データと関数が存在して、その組み合わせによって、オブジェクト指向を実現しようという言語がある。
これらの言語は、関数の第一引数に、自分自身のオブジェクトを表現するものを受け取る。たとえば$selfという表現で受け取る。
sub foo { my ($self) = @_; }
これらは、不完全なオブジェクト指向というとらえられ方をする場合がこれまでは多かったように思う。
でもね、これは非常に大きな利点を持っている。
C言語との相性
PerlやPythonはC言語で実装されている。C言語は、知っての通り、オブジェクト指向言語じゃない。構造体と関数の集まりだ。PerlやPythonはオブジェクト指向ができるけれど、実は、C言語の構造体と関数の集まりをうまく利用して、オブジェクト指向を実現している。C言語の表現を完全に覆ってしまうんじゃなくって、うまく利用して、薄いラッパーをかぶせるような感じで、オブジェクト指向を実現する。
PerlがPythonから受け取ったのは「self」という変数名だ。そして、Perlはリファレンスとblessを実装して、「$self->foo」のようなメソッド呼び出しのシンタックスシュガーを作って、オブジェクト指向を表現した。
以下の機能をうまく組み合わせて、Perlはオブジェクト指向プログラミングをサポートした。
- ハッシュ
- リファレンス
- パッケージ
- bless
- サブルーチン
- メソッド呼び出し