tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

なんだろう、この違和感、その2

なんだろう、この違和感 - tsucchiの日記の続きみたいなお話。

id:nowokay さんより、

オブジェクト指向を教えない」が「オブジェクト指向禁止」につながらないことに注意してください。
オブジェクト指向」に時間を割くなという意味であって、オブジェクト指向を使うなということではありません。

とのコメントをいただきました。

気持ちは分かるのですが、やはり違和感を感じます。

自分のスタンスはこっち(↓)

Javaを教えろ.しかしオブジェクト指向は教えるな

OOPJavaプログラミングの基本中の基本なんだが....*1

「プログラミングを教える」という目標が共通だったとしても、教える言語に応じて「避けることができない部分」というものがあるのではないか、と思うのです。

C ならメモリモデルっぽい話を避けるわけにはいかないし、Lisp なら再帰かな。Perl だと割と自由だけど、それでも正規表現を無視とかできないな。

で、Java の場合はそれが OOP なのではないか、と思うのです。初心者が、(SJC-P で聞かれるような)重箱の隅みたいな OOP の文法を覚える必要は全然ないと思うのだけど、継承とかポリモーフィズムくらいは分かってないとちゃんと Java を使うことは出来ないんじゃないか、と思うのです。

たとえば、JUnit は3.X の頃は継承なしで使えなかったし、java.util とか javax.swing のライブラリなんかは、継承の知識なしにちゃんと javadoc を読めるとは思えない。スレッドとかGUIとか、あるいはWeb系のフレームワーク使うのなら、抽象クラスとかインターフェースを使ったコールバックの仕組みを(おぼろげでもいいから)押さえてほしい。。。

これが Perl だったら、OOP を後回しにするのは全然 OK だと思う。OOP なしでもある程度言語を使えるから。(他人のコードは読めないから、いつかは覚えなきゃダメだけどね)。

でも JavaOOP を無視したり、後回しにして使える言語だとはとても思えないのです。

古典的な名著の題名にもあるように、「アルゴリズム+データ構造=プログラム」なのです。Java のデータ型には基本型*1以外はクラス型しかないのだから、OOP(少なくともクラス)を教えなければ、プログラミングが文字通りの「片手落ち」になってしまうと思うのですが。

*1:Java の基本型は hashref とか hashref の hashref みたいな複雑な構造を扱えない、本当にプリミティブだ