Entry

OOP を動物インスタンスで説明するとわかりづらい

2008年01月15日

常々疑問に思っていることなんですけれど,猫インスタンスにニャーとなかせても,あまり説明になっていない気がしています。いちいち例を出すまでもないんですけど,例えばこんなやつ。

public class Cat {

    public Cat() {
    }
	
    public void walk(int n) {
        System.out.println(n + " step(s) walked.");
    }
    public void mew() {
        System.out.println("mew mew ...");
    }

}

こゆのを例に出しても,実際そこに猫はいませんから,説明を受ける側としては,猫がないている姿を想像しなくちゃいけません。文字列を出力することと,その猫がニャーとなくことは全く違いますもんね。丁寧に説明するなら,この想像を働かせることが OOP と全く関係がないことを話しておく必要があります。んでもって,OOP を理解するよりも,この想像を働かせることの方が,難度としては多分高い。

また,OOP のキモのひとつであるカプセル化についても,この説明だとうまくいきません。もともと,「猫インスタンスがなく」ことがどういうことなのか,誰も知らない(機能として満足に定義されていない)わけですから,カプセル化もへったくれもありません。一方,継承関係はそれっぽく説明できるけれど,これも動物インスタンスに特有の話ではなくて,is-a 関係が認められる例だったらなんでもいいと思うわけです。

そんな話を先日某氏としていて,当然のことながら,じゃあどうやって説明したらいいんだ,とかいった話になったのでした。

あたしゃ思うんですけれど,OOP の説明は,単純に手続型のプログラミングから順を追って説明した方がいいと思うんですね。つまるところ,main 関数1つのバッチっぽいプログラムから作ってもらって,それを関数に分ける練習(機能を抽出する練習)をして,OOP 的なまとまりに分ける練習(機能ごとにメモリのかたまりを作る練習)をする,と。こうした方が,OOP 的な発想の由来がよく分かると思うんです。

「動物インスタンスを作る」といった発想は,どちらかというと上流的なもんで,ともすれば,「クラスだけ作っときゃ,あとは下流の連中がうまくやってくれるだろ……」みたいな,無責任な設計の元になりそうだと思ったりもします(あくまでも,「ともすれば」ですが)。実際,現実の猫がニャーとなくことはみんな知っているけれど,猫インスタンスがニャーとなくことがどういうことなのか,誰も分かりません(定義されていない)。結局のところ,インスタンスの概念を無理矢理実世界に近付けても,あまりいいことはないんじゃないかと思うわけです。いわんや,OOP を知らない人に説明する例としては,なおさら向いていない。

OOP 的な発想の由来は実装の実際あるわけで(多分),少なくとも,わけのわからない機能を,わけの分からないまま下流に投げるためのもんじゃないんじゃない……とも,云々。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN