オブジェクト指向に関するありがちな間違い。

絶賛炎上中に付き、コメントする余地も無いかもしれないけど、どうにもつっこみたい部分があるので敢えて書く。

実はオブジェクト指向ってしっくりこないんです!:気分はstatic!:エンジニアライフ

みながわさんが、「実はオブジェクト指向ってしっくりこないんです!」といっているのは、単にオブジェクト指向していないから。しっくり来ないどころか、一度たりともオブジェクト指向したことが無い、ということが、文章を読んでわかった。

その最たる物は以下の部分。

 プログラムの記法から見ると、インスタンス宣言って

               クラス名 インスタンス

となっていて、型宣言と非常に似ている。

・・・。この人、型とインスタンスの区別がついてない。インスタンス宣言ってなんだ?じゃあ、型宣言はどういうシンタックスだと思っているのか不思議でならない。クラスとインスタンス、(型とインスタンスも同様)では、思考しているレイヤーが違うのに、そこを混同しているのだろう。

だからこそ、

特に「メンバー関数をstatic宣言すればインスタンス宣言をしなくてもいい」ということ知ってからは、メンバー関数を従来のファンクションのように使っている。

とか、むちゃくちゃなことを書いちゃっている。

エスパーすると、インスタンス宣言てnewのことかな。でも「インスタンス宣言って クラス名 インスタンス名」って書いてるから違うか。ついでに言うと(敢えてCで書くけど)

int x;
int *p;
p = malloc(sizeof(int) * 10);

とかあった場合、xがインスタンス、と言えなくはないが、厳密にいうと間違いである。int x;でメモリ上に確保された領域を指してインスタンスという方が正確。その次に、mallocでヒープにとられ、ポインタpが指す領域は正にインスタンスである。当然、p自身も(xと同じくメモリ上にとられたpが表すメモリ領域が)インスタンスである。

みながわさんがCをわかるのなら(とてもわかっているとは思えないけど)、オブジェクト指向でいう「インスタンス」と「Cで言うオブジェクト」は同じ物を指している。もし、そこがオブジェクト指向を理解する妨げになっているなら指摘しておきたい。


みながわさんのコードって、全てクラス変数、クラスメソッドで作成しているのだろう。せっかくオブジェクト指向をサポートしている言語なのに、その機能を使わないから、面倒くさく思うだけだ。Cでもオブジェクト指向プログラミングはできる。ただし超面倒くさいということと同じだ。

オブジェクトの利点

私が思うオブジェクト指向(プログラミング|設計)の利点は以下につきる。
インスタンスに自身の手続きと状態を持たせることができる」

クラス変数、クラスメソッドは、そのクラスそのものが持つ状態と手続きということになる。インスタンス変数、メソッドを使わないでコーディングすることは可能。しかしそれは、「変数全部グローバルでもプログラム書けるじゃん。どこからでも見えるから、そっちの方がべんりじゃね?」といっていることと同じだ。

なんで、ITにコラム書くような立場の人が、こんなレベルなのか。周りに指摘する人がいなかったのか、哀れに思う。願わくば、現場の足を引っ張らないで欲しい。私がみながわさんの部下だったら、恥じはかかせないようにして、適当にあしらうだろうな。まぁレビュアとして入っても、雰囲気だけはわかるはずだから、逆に煙に巻くこともできると思う。

その結果として、インターネットで全世界に無知を発信してしまうわけだから、どっちがいいかって話だけどね。私も、若手がつっこみ難い存在になってきているから気を付けねば。


本記事に、トラックバックしたかったけど、見あたらないので関連記事を挙げる。
http://d.hatena.ne.jp/babydaemons/20100424/statedesignpattern