●
クラスとかオブジェクトって一体なんなのか、よくわからない。なぜ分からないかといえば、たぶん、「どんなとき何に使うものなのか」分からないからだ。けれどJavascriptを書いているときその一端がちょっと見えた気がしたので書き留めておく。以下、確証はないが書きやすさのため断定口調で書く。
●
オブジェクトは要するに連想配列のことだ。クラスは連想配列を作るシステム。
連想配列でいうところのキーがクラスのプロパティにあたり、キーに関数を格納したもの(無名関数で実現可)がクラスのメソッドにあたる。 現に、連想配列内のものを呼び出すやり方とオブジェクト内のものを呼び出すやり方は酷似している。どちらも、「連想配列Aの変数V」「オブジェクトOの変数V」という書き方だ。
# PHPの場合
$A = array("V":value, "F":function() {...});
class C() {
public $V = value;
public function F() {
...
}
}
$O = new C();
# 呼び出すとき
$v = $A["V"]; # 「AのV」という意味
$f = $A["F"](); # 「AのF」
$v = $O->V; # 「OのV」
$f = $O->F(); # 「OのF」
どちらも使い方は同じだ。違うのは、使い勝手である。クラスを使って連想配列(オブジェクト)を作るなら長い関数(メソッド)が含まれていても書きやすいし、内部のキーや値(プロパティ)を内部の他の関数内で使ったりもできる。
# 一応試したところやはり通常の連想配列ではこういうことは無理
$arr = array("a"=>1, "b"=>2, "c"=>$arr["a"]);
そんなわけで連想配列とクラス・オブジェクトの関係は、データ保存用のtxtファイルとデータベースのような関係だ。つまり、どっちもやってることは同じなんだが、後者はより複雑で大規模なことができる。
●
思いついたのはJavascriptのオブジェクトリテラルの項目を調べているときだった。Javascriptでは、どうみても連想配列であるもの(Pythonではディクショナリであるもの)をオブジェクトと呼ぶ。「いやそれオブジェクトじゃねーだろ! 連想配列だろ!」と笑ったときのことである。「あれ? 実はオブジェクトなんじゃねーのか、俺が連想配列だと思っていたものも…?」。