データと関数の組み合わせでオブジェクト指向を実現する

言語の設計思想として、あらゆるものをオブジェクト指向にしようという発想がある。言語の中で扱われるすべてのものが、オブジェクトとなる。

つまり、オブジェクトが先に存在して、そこにメソッドが生えているという考え方だ。

これは、オブジェクトとメソッドが密結合しているともいえる。

これに対して、もう一つのアプローチをとる言語も存在する。

データと関数の組み合わせでオブジェクト指向を実現する

一方で、オブジェクトというあくまで補助的なもので、まず先に、データと関数が存在して、その組み合わせによって、オブジェクト指向を実現しようという言語がある。

この言語の代表は、Perl, Python, Goである。

これらの言語は、関数の第一引数に、自分自身のオブジェクトを表現するものを受け取る。たとえば$selfという表現で受け取る。

sub foo {
  my ($self) = @_;
}

これらは、不完全なオブジェクト指向というとらえられ方をする場合がこれまでは多かったように思う。

でもね、これは非常に大きな利点を持っている。

C言語との相性

PerlPythonC言語で実装されている。C言語は、知っての通り、オブジェクト指向言語じゃない。構造体と関数の集まりだ。PerlPythonオブジェクト指向ができるけれど、実は、C言語の構造体と関数の集まりをうまく利用して、オブジェクト指向を実現している。C言語の表現を完全に覆ってしまうんじゃなくって、うまく利用して、薄いラッパーをかぶせるような感じで、オブジェクト指向を実現する。

PerlPythonから受け取ったのは「self」という変数名だ。そして、Perlはリファレンスとblessを実装して、「$self->foo」のようなメソッド呼び出しのシンタックスシュガーを作って、オブジェクト指向を表現した。

Perlオブジェクト指向

以下の機能をうまく組み合わせて、Perlオブジェクト指向プログラミングをサポートした。

  • ハッシュ
  • リファレンス
  • パッケージ
  • bless
  • サブルーチン
  • メソッド呼び出し

PerlPythonC言語のラッパーと考えるならば、根本的な仕組みがC言語に近いほうが、親和性が高い。

ユーザーがやりたいことはテキスト処理

ユーザーがやりたいことは、ちょこっとしたログを解析したり、試験データを作ったり、集計したりということで、目的はオブジェクト指向というわけじゃない。

もし、オブジェクト指向を知らなくっても、それが、実現できるのであれば、それでもよいとは思う。オブジェクト指向は、ちょいと難しいし。

やりたいことから始まって、必要になったときに、オブジェクト指向を勉強してもいい。

教条的に、言語全体がオブジェクト指向になっていることに、こだわらなくってもよいと思うんだ。