日記
Javaがわかるはずがない from 圏外からのひとこと (13:49)Edit

オブジェクト指向のいやらしさは、howwhyがつながらないことだ。classinterfaceを教えられた時、最初は、それがどういう動きをするのか悩むだろう。確かに、これはifforよりはややこしい。単純なサンプルでも長くてなかなか追えない。だが、howに徹してじっくり読めば初心者にもわからないものではない。

なるほど初心者にはそのあたりが分からないのだという認識を持っておけば、コミュニケーションを取りやすくなるのかな?

となるとオブジェクト指向入門的な文章を書く場合には、オブジェクト志向のプログラミング技術的な使い方よりも先に、その作業上の具体的なメリット実例で紹介するのがよさそうだ。DogクラスがNameというプロパティとRunメソッドとWalkメソッドを持つとか言われたところで、「だから?」って感じだもんな。

それよりも、まず「Pochiという名前と1次元の位置情報を持つ犬がいる。位置情報を+3する。名前をChobiに変更する。さらに位置情報を+1する」コードを書けという例題を出す。するとまあ、

$name = "Pochi";
$x = 0;
$x = $x + 3;
$name = "Chobi";
$x = $x + 1;

みたいなコードが出てくる。

それを今度は、「犬を5匹に増やせ」とか「犬に生年月日と性別と……という情報を持たせろ」という。すると、多分配列を使ってn匹の犬を表現したり、構造体を使って1匹の犬あたりの情報をまとめて扱えるようにしたりする話が出てくる。

structure struct_dog {
$name = "Pochi";
$x = 0;
$gender = "male";
$birth = "2002/3/4";
}
var $dogs[5] as struct_dog;
$dogs[0]->x = $dogs[0]->x + 1;
$dogs[3]->name = "Chobi";
for each $dog as $dogs {
$dog->x = $dog->x + 3;
}

んでもって今度はさらに、「位置情報を+3することをRunという関数で表現し、位置情報を+1することをWalkという関数で表せ」とかいうと、機能を関数単位で記述しつつ、処理したい対象となる変数を引数として渡す話が出てくる。

var $dogs[5] as struct_dog;
Run($dogs[0]);
Walk($dogs[1]);
function Run($dog) {
$dog->x = $dog->x + 3;
}
function Walk($dog) {
$dog->x = $dog->x + 1;
}

んでもって、結局犬に対して処理を行う関数をたくさん用意するのならば、構造体で変数をまとめるだけでなく、関数をまとめる仕組みもあった方がわかりやすいよねってことで、

class class_dog {
$name = "Pochi";
$x = 0;
$gender = "male";
$birth = "2002/3/4";
function Run() {
self->x = self->x + 3;
}
function Walk() {
self->x = self->x + 1;
}
}
$dog = new class_dog();
$dog->Run();
$dog->name = "Chobi";
$dog->Walk();

みたいな感じになってくる。

という流れを踏まえた上で、それぞれのスタイルにおいてさまざまな仕様変更仕様追加などを実装させてみる。多分初期のステップにおけるコードに仕様変更、仕様追加をするのがうんざりすることは十分に体感できるだろう。あと、犬以外の処理単位も同時に利用する実例も体感させていくといい。そのあたりで変数のスコープの話も混ぜておいた方がいいな。

そうやって非構造化構造化オブジェクト志向という流れのメリットを実感させた上で、ようやくオブジェクト指向言語の基礎知識の話をやりはじめると、それを学習する意欲&理解がついてきてくれそうな気がする。

インターフェースとか抽象クラスとか継承とかデザインパターンとかの応用的要素の話も、具体的な体感できる仕様変更・仕様追加を使った実例を挙げつつ伝えていくと効果的だろうな。

ところでこのサンプルコードはいったい何語? VB.NETPHPとObjectPascalを足して4.2で割った感じかな?

Published At2003-04-12 00:00Updated At2003-04-12 00:00