Cogito Ergo Sum.

我思う故に我あり

久し振りにJava入門

 いつも文句言ってるクセにナンダカンダで毎月買っている「日経ソフトウエア」の最新号(2010年9月号)の特別付録が「完全保存版! コードでわかるJava & オブジェクト指向」で、一気に読んでみた。

 Javaに関しては、もう10年くらい前から数年おきにチャレンジしては決まって最初の壁で挫折していた。統合開発環境を使わず、メモ帳でコードを打ち込んでjavacでコンパイルjavaで実行…、というのは骨が折れる。

 結局Javaは身についていないのだが、1〜2年ほど前にC#で1つプログラムを書き、15年くらい解消されなかった「オブジェクト指向に対する苦手意識」は克服できた。そのためか、今回この特別付録を鼻唄マジりの余裕シャクシャクで読んでいる自分自身を発見。

 以前気付いたことなのだけど、オブジェクト指向の概念がわからない人にとっては本当にわかりづらい概念であるのは、(まぁ、いろんな理由があるんだろうけど)1つはやっぱり説明の仕方が悪いんだと思うんだよね。

 今回の特別付録でも、(Java流の)オブジェクト指向の3大要素として「カプセル化」「継承」「多態性」を挙げているけれど(普通そうだと思うけど)、「クラスを作る立場」からの視点と「クラスを使う立場」からの視点とでは、これらは全然違って見えるものだと思うんだよね(入門レベルとしては、クラスを自分で作って自分で使うわけなので、仕方ないのかもしれないが…)。「カプセル化」と「継承」は「クラスを作る立場」に立ったときに便利な機能、「多態性」は「クラスを使う立場」に立ったときに便利な機能、そうはっきり視点を変えて説明しないと何が便利なのかわかんないと思う。と言うか、オブジェクト指向プログラミグって、やっぱり「1つのプログラムをチームで作っている」状況を思い浮かべないと、何が便利なのかピンとこないものなんじゃないかなぁ。「カプセル化」してクラス内部を隠すのは、自分の作ったクラスを誰かに変な使い方されたら困るからなんだし。初心者が自分1人で行うプログラミングだと、そこら辺の感覚がわかんない。

 入門記事によくある、「如何にも(悪い意味で)手続き指向的」というプログラムをオブジェクト指向風のプログラムに書き換えるような例も、よく見てみると、良い例とそうでもない例がある。継承を利用した「差分プログラミング」みたいなことは、僕は「オブジェクト指向プログラミングとは何か」みたいなことを考えるときにはあんまり本質的なものじゃないような気がする。第1に伝えるべきは、やはり「クラスを使う立場からは一般論的なプログラムを書き、個々のオブジェクト固有の都合に関してはオブジェクト自身に解決させる」ということなんじゃないか(もちろん、そのために「多態性」を用いるわけで、その「多態性」を実現するために「継承」を用いて「差分プログラミング」するわけだけど)。

 それと、僕が1年半ほど前にようやく「オブジェクト指向の勘どころがわかった!」とガッテンしたのは、実は「インターフェースって便利だ!」と気付いたときなんだけど、紙数の少ない入門記事はもちろん、紙数の多いプログラミング入門書でも、インターフェースの説明って、「カプセル化」→「継承」→「多態性」の後にちょこっとオマケ的についてるだけで、本当に面白いところを説明する前に力尽きちゃってるような気がするんだよね(読者も著者も)。だけど、結局「オブジェクト指向って便利だ!」と思わせるためには、最初から「インターフェース」を目指して説明していくのがいいんじゃないのかなぁ。上記特別付録の中で「最近はインターフェース・ベースの設計が主流」と書いてあったので、その点もガッテン(ただ「最近」と言っても、その記事は2007年に書かれたものだったので、「最近」と言うほど「最近」の話ではないんだろうけど)。

 Javaづいてきたので、ついでにこれまで読んでいなかった連載記事「Javaで始めるプログラミング」(都元ダイスケ氏)を第1回から第5回まで通して読んでみたんだけど、変数のことを「ノートに書き込んだ情報につけた付箋のようなもの」と説明していて(「ノートに書き込んだ情報」ってのがインスタンスで、「付箋」が変数ね)フ〜ンと思った。このタイプの説明の仕方を始めて見たのはRubyの入門書だったんだけど、今では、intだとかdoubleだとかcharといった昔ながらの値型の変数より、参照型(オブジェクト型)の変数を扱う方が多いことを考えると、従来の「変数は値を書き込む箱のようなもの」という値型の変数をよくイメージさせる説明の仕方はスタれていって、参照型の変数をイメージしやすい説明の仕方が主流になっていくのかなぁ〜と思っていた。実際にそうなりつつあるということなのかな。