間違ったオブジェクト指向

http://d.hatena.ne.jp/scinfaxi/20060811/1155228714

とりあえずプログラミングにおいて、オブジェクト指向が役立つという「事実」は解った。じゃあ、具体的にどう役立つんだろうか。

一言で言えば,生産性や保守性の向上.

「実務的じゃない」って云われそうだけれど、関数型言語に馴染んだ人間にとってはオブジェクト指向*1ってのは何かひどく遠回りなやりかたをしているように思える。

たしかにLISPなどは古い言語であると共に非常に先進的な言語でもあるらしいけれど,関数型とオブジェクト指向って直行した概念じゃなかったっけ?

自分が知っているオブジェクト指向のいいところはメソッドや演算子オーバーロード

いや,おそらくそれらはいずれも本質ではない.*1

Java の入門書を読んだ程度しかないので、こうやって批判するのもアレだけど、

うーん,残念なことに,入門書でその辺りをまともに説明している本はほとんど見たことがない.オブジェクト指向を学びたければ,入門書は捨てることですね.時間と金の無駄です.*2

クロージャ高階関数が許されているのにわざわざイテレータを使うのはどうしてだろう。

それは概念が違うんじゃないかな?

Javaクロージャがないから間違いがあるかもしれないが,「クロージャイテレータを実装する」ことも許されているのでは?イテレータとはそういうデザインパターンであって,クラスとか関数などの言語機能の話ではない.*3

学校にも「オブジェクト指向」という授業があるけれど「自動車」と「トラックやスーパーカー」の関係や「自動車」と「エンジンやタイヤ」の関係の話しかしないのでいまいち利点が見えてこない。

うん.その説明で理解できたと思う方がどうかしている.それはあくまで初心者向けの「たとえ話」であって,実際には何の役にも立たないから.

おまけ

  • SchemeCOBOL では余りに差がありすぎて*1その橋渡しには非常に役立った記憶がある。
  • まさに「世界が違う」という状態。クロージャがないどころか、未だに「関数」の書き方を教わっていない。

http://d.hatena.ne.jp/scinfaxi/20060811/1155223166

えーっと,聞いた話ですが,COBOLは非常に古い言語だけあって『型』や『構造化』,ローカル変数などの概念さえも満足にないらしいです.歴史の古さだけならFortranLISPも引けはとりませんが,COBOLはその中でも異例なほど「古くさい言語」のようです.*4 *5

*1:関数型言語の短所は,括弧が多いことだ.」というような感じ.確かにLISPには括弧が多いけど,それは関数型言語の本質でもない.更に言えば必ずしも欠陥というほどでもない.

*2:http://d.hatena.ne.jp/JavaBlack/20060224#p2
http://d.hatena.ne.jp/JavaBlack/20050909#p1

*3:Javaの場合はイテレータの機能を持つクラスが標準APIに入っていて,それの名前もイテレータとなっているから誤解する可能性はある.Rubyでも昔は「イテレータ」と呼ぶ機能があったな.その後「繰り返さないこともあるのにのにイテレータとはこれ如何に?」ということで「ブロック付きメソッド呼び出し」とやらに変わったはず.その後は知らない.

*4:ある意味で使いたくない言語No1.

*5:さらに恐ろしいことに,それを使っている人達も言語なみに歴史のある老兵たちばかりで,「構造化プログラミング」のような『先進的なプログラミングパラダイム』さえも知らない人も生き残っているとかいないとか.