オブジェクト指向を教える

オブジェクト指向を理解してもらうためには、さて、どこからスタートすればいいものか・・・。小難しい専門用語の前に、もっと感覚的に、肌で感じてもらうことにしました。

「オブジェクト指向とは」

で検索してみると、各人がいろんな表現や比喩を駆使して、いろんな説明をしています。たしかにどの説明も理解しやすく、そっくりそのままパクッて、生徒に教えちゃおう。なんて思ったりもしました。

・・・しかしまてよ。

私自身は、ある程度オブジェクト指向が何たるかは理解しているからこれらの説明に納得できるけど、まったく何も知らない人は、どうおもうんだろうか!?

というわけで、またもや、「オブジェクト指向とは何か」というとっても基本的なところで悩んでしまいました。やっぱし、人に教えるってのは、なかなか難しいです。

オブジェクト指向=実世界の会話

オブジェクト指向は、「理論」ではないような気がします。もうちょっと感覚的な何かだろうと。
で、こんな寸劇めいたことをやってみました。

 私 :「Aくん、おはよう」
 A君:「・・・」(コクリと、うなずく)

 私 :「Bくん、おはよう」
 B君:「おはようございます」

これで、朝礼という立派なシステムが成立しました。

  はい、これがオブジェクト指向です。

オブジェクト指向プログラミングとは、
「極力、実世界の会話をするようにプログラミングすること」。

継承や実装なんていうテクニックの話は、二の次なのではないでしょうか。こういうテクニックから教えてしまうと、肝心のオブジェクト指向の感覚が身につかない。そして、そういうエンジニアは、世の中に結構多いような気もしています。

では、二の次の話

人間には「あいさつを返す」というルールがあります。これがインターフェースです。

でも「どういう返し方をするか」までは決めてません。だから人それぞれの個性がでます。これがクラスです。

AくんやBくんが、私の「おはよう」を聴いてからそれぞれの返事をするに至るまで、彼らが何を考えたのか過去にどういう教育を受けてきたのかなんてことは私は知りません。これがカプセル化(隠蔽)です。

以上で、オブジェクト指向のほぼ全てを言い表しているのではないでしょうか?

プログラムに直す

この授業では、Javaの実習環境にEclipseを使っています。初めてEclipseを触らせるときに、「なんでもいいからJavaプログラムを作って実行しなさい」という課題を出しました。環境に慣れてもらうためには、実際動かすのが一番手っ取り早いですから。

すると彼らは、こういうプログラムを書きました。2つの引数を足した結果を標準出力に表示する。というものです。

 public class Test{

   public static void main( String[] args ){

     int a = Integer.parseInt( args[0] );
     int b = Integer.parseInt( args[1] );
     int result = a + b;

     System.out.println( result );

   }

 }

はてさて、これは「会話しているようなプログラム」でしょうか?
とうてい「会話」には程遠いです。オブジェクト指向で同じことをするには、次のようなプログラムになるはずです。

 public class Test{

   public static void main( String[] args ){

    //計算機さん、引数を足してちょうだい。
    Calculator calculator = new Calculator();
    int result = calculator.plus(args);

    //プリンターさん、結果を表示してちょうだい。
    Printer printer = new Printer();
    printer.print(result);

   }

 }

このコードを書ける「感覚」を身につけることが、オブジェクト指向のスタートであり、ほぼ全て(と私は思います)。

ここまでの解説は、生徒さん達も良く理解してくれたようです。

次回は

しかし、どうやらCalculatorクラスやPrinterクラスの作り方がわからない模様。Appletは作れるのに、こんな単純なクラスの作り方がわからないとは・・・。Appletの方が100倍むずかしかろうにw

まるで、英語の読み書きはできるけど、会話はできない日本人(私のこと)のようです。・・・ちょと違うか・・・

そんなわけで次回の授業では、Java言語の特訓じゃ!
覚悟しとけよ、ごるぁ!


コメント
osaru326
2006/10/11
僕が社会人になって初めて計算機に触れたときは、生徒さんが書いたような「プログラム」を理解するまでに何ヶ月もかかりました。"System.out.println"って意味不明ですよね^^;;
あの時代にCalculatorやPrinterという概念が存在したら、どれだけ覚えやすかっただろうと感慨にふけってしまいました。
生徒さん達はある程度プログラミングを知っている人たちなのでは?
武田ソフト
2006/10/11
osaruさん、コメントありがとうございます。
生徒さんに「System.out.printlnを日本語で読め」と言ったら、案の定「システムの外に」と読みましたw

#生徒さん達はある程度プログラミングを知っている
Javaの授業では、かなり高度なことをやっているようです。
でも、教科書のコードを書き写してるだけで、未消化のままどんどん進んじゃってる感じ。いざ自分で1から作るとなると、手が止まってしまうようです。
ちゃんと消化できるように、ほんの一押し、キッカケが作れればいいんでしょうね。

コメントしてください

closed.