クラスはオブジェクトであると言い切れない大人の事情

カレーなる辛口Javaな転職日記さん経由、初心者がJavaを“超高速”で学ぶためのコツ | 日経 xTECH(クロステック)。久しぶりに酷すぎる記事を見て呆然。なんですか、これは。

これが日経ソフトウェア2005年2月号に記事だというから、かなり憂鬱。Cマガジンが無くなり、オープンソースマガジンも来月でおしまい、残った日経ソフトウェアがコレかい、・・・というのと、青木淳さんの連載が載っている同じ雑誌にコレかい、・・というので二重にガックシ。

「クラス」メソッドじゃないっ!「静的」メソッドなんだ!!

なんだか「クラス」と「オブジェクト」の違いが難しいそうですが、それって C++ 族なOOPが殆ど「クラス指向」なのに由来してると思います。

クラスとオブジェクトの混乱を取り除く良い方法は、クラスを無くしてしまう*1か、クラスもオブジェクトにしてしまうかです。とてもシンプルな解決方法だと思います。

JavaC++ では クラスはオブジェクトじゃないくせに、クラスメソッドやクラスフィールドのモドキがあります。でもJavaC++ も口が裂けてもそれをクラスメソッド/フィールドとは呼んでいないはずで、C++ではちゃんと「静的メンバ関数」「静的メンバ変数」と正しく読んでいるし、Javaも「静的メソッド」「静的フィールド」と正しく呼んでいたハズ。 つまり C で言う関数内の static な変数とは、関数インスタンスを作らなくても生成されていて、インスタンスの寿命と関係なしにある変数だから、同様にクラスインスタンスを作らなくても生成されていて、クラスインスタンスの寿命と関係なしにあるメソッド・フィールドのことだよ、と言う立ち位置です。

これは、事実上クラスをオブジェクトと脳内で見なしても問題ないくせに、パフォーマンス的にもバッチシという なかなか一般受けの良い仕様なので、広く受け入れられているようです。しかし、クラスをオブジェクトじゃない言うなら、Eiffelみたいに「そんなもん、一切持たないぜっ!」な硬派に貫いてくれた方がよっぽど解りやすいのでは、とも思います。つまり、

「クラス」とは「変数(フィールド)」や「メソッド」をひとまとめにした,一つのプログラム単位でしかありません。そして,その部分だけ言えば,クラスとインスタンスに大きな違いはないのです。

なぁんて世迷い言が出てくるのは、C++Java の「コウモリ的」クラスの定義のせいだと思うのだけれどなぁ*2

C++Java といった、メインストリームな言語には、大人の事情というのが絶対あって、猫の個人的な見解としては、それを考えながら学習するよりは、大人らしくない頑固で一本気が言語*3で学習する方が、よっぽど簡単だと思います。もしくはよっぽどの良書や良い師匠に恵まれるか、良いコードをたくさん読むかです。

いずれにしても、難しいとはおもうのです。

それにしたってヒドイ

しかしこの記事の混乱は、そういう言語周りが元になっているのでは決して無くて、この記事を書いている方が自身もOOPを理解していない(ようにしか思えない)のに、いい加減のやっつけ仕事ででっち上げているからに違い有りません、きっと。だって、

Javaを超高速に学習するには,「オブジェクト指向におけるクラスとは何か」を考えずに,まずはメモリー上のプログラム領域として「クラス」と「インスタンス」を理解するようにしてください。

なんて、

つまり,C言語の先入観が,逆にJava言語の習得に足かせとなることがあるのです。

と同じ人間の口から出てるなんて思えないもの・・・。こんな覚え方をしてどうやったら「Javaらしいプログラム」が書けるのでしょう*4

*1:プロトタイプベースOOPL とか インスタンスベースOOPLとか言われるのがそういう解決をしています。具体的にはSelf とか JavaScript とか。

*2:こんな辺境ブログを見てくださっている方には釈迦に説法だけど、クラスとは「インスタンスの生成器 + インスタンスの責務の委譲先」です(そして、しばしば型と同義)。クラス自身がオブジェクト的性質を持ってるか否かはまた別の話。

*3:だから普及しないし、仕事でなかなか使ってもらえないとも言う(^^;

*4:これがホントに「Javaらしいプログラム」だとするなら「JavaプログラマCOBOLer に続く第二のブランド」と言う噂も、本当なのかもと思ってしまいます。