ikepyonのだめ人間日記

セキュリティに関することを書いていく予定。

最初に学ぶのにいいプログラム言語

プログラム言語は色々あると思うんだけど、オブジェクト指向型の言語を最初に学ぶのはインスタンスとクラス、オブジェクトの概念の理解が必要なので難しいかなぁと思うのですよ。
http://itpro.nikkeibp.co.jp/free/NIP/NIPCOLUMN/20021126/1/
Javaだったら、こんな感じのことが分からないんじゃないかな?

public class Main {
public static void main(String[] args) {
Aclass a;
Aclass aa;
Aclass b;
Aclass bb;

a = new Aclass();
a.setA(5);
aa = a;
System.out.println("aa=a->" + (aa==a));
System.out.println("aa.equal(a)->" + aa.equal(a));
aa.setA(6);
System.out.println("a.a=" + a.getA());
System.out.println("aa.a=" + aa.getA());

b=new Aclass();
bb = new Aclass();
b.setA(7);
bb.setA(7);
System.out.println("bb=b->" + (bb==b));
System.out.println("bb.equal(b) ->" + bb.equal(b));
bb.setA(6);
System.out.println("b.a=" + b.getA());
System.out.println("bb.a=" + bb.getA());

}
}

public class Aclass {
int a = 0;

public void setA(int i) {
a = i;
}

public int getA() {
return a;
}

public boolean equal(Aclass aclass) {
return (a == aclass.getA());
}
}

これを実行した結果が、こんな感じになるけど、なぜ、aとaaは等しいのに、bとbbは等しくないのかが分からないかも知れない。

aa=a->true
aa.equal(a) ->true
a.a=6
aa.a=6
bb=b->false
bb.equal(b) ->true
b.a=7
bb.a=6

まあ、分かっている人には、「aa=a」はインスタンスがコピーされているわけじゃないというのは分かるんだけど、普通の数学の知識だけだと、インスタンスがコピーされていると思うんじゃないかなぁ。
こういったことがあるので、初心者にオブジェクト指向型言語を教えるというのはあまり、お勧めしないんですよ。それに、呪文として教え込むと、ひどいプログラムしかかけなくなると思うし。

最初に理解して欲しいのはアルゴリズムだと思う。きれいなプログラムを書くことも重要だけど、それはまず、どうプログラムを書けばよいか?というのが分かってからだと思うんだよねぇ。

ただでさえ、プログラムの考え方というのは普段の思考とはちょっと違うのに、躓く概念が必要というのは挫折することが多いんじゃないかなぁと。
だから、私はCもポインタがあるので最初に教えるというのは良くないと思うんだよねぇ。