プログラミングの変数を教えるときの「箱の説明」の是非について。
「お名前は?」「○○です」「何歳ですか?」「5さい」という受け答えができる子に、変数をわざわざ箱に例えて、入れたり出したりする必要があるのだろうか。
2016-06-09 14:20:13blogged. / “変数は「箱」か? - the code to rock” htn.to/tGnQAo
2016-06-10 11:17:27プログラミングの初心者に変数を教えるには「箱」で説明するのがよい。 (メンションなどで理由もいただけるとうれしいです)
2016-06-10 13:48:57@abee2 いいえとしました。箱のイメージをプログラムの動きに正確に当てはめないと、理解できなくなるからです。たとえば、「代入」を表現するとき、「箱に入れる」になりますが、そのとき「複数は入らない」ようにしないと誤解すると思います。そしてそれは「箱」のようなものでないと思います
2016-06-10 14:14:03@abee2 いいえで、自分が箱の例で理解出来なかったからです。 「x=1;とすると、xが1の代わりになる。 x=2とすれば今度は2の代わりになる」くらいで良いんじゃないでしょうか。あとはユーザー入力させるプログラムでも触らせれば有用性も意味も段々と分かってくるような。
2016-06-10 14:17:36@abee2 また、箱のイメージを最初するとき、おそらくは、箱の大きさを固定してしまい、たとえばx = yなど「箱の中に箱を入れる」という表現はなんとも違和感があるんじゃないかと。僕の主観ですが。
2016-06-10 14:21:31@nobkz ありがとうございます。比喩は強力なツールですが、例えるものと例えられたものは同一ではないところが辛いと思います。
2016-06-10 14:29:40@AknEp ありがとうございます。「代わりになる」というのは、代入(代わりに入れる)の意味からしても適当ですね。
2016-06-10 14:31:39@abee2 そうだと思います。結局指導方法の問題になるかな気がします。値を入れる/取り出す、などは箱の説明が上手く行くので、「普通の箱とは違って、プログラムの箱は~」みたいな説明だと上手くいくのかなと考えたりします。
2016-06-10 14:36:02@nobkz 取り出す(参照する)しても中身は無くならないぞとか、生まれたての箱の内部状態はどうなんだとか、気になって仕方ありません。
2016-06-10 14:40:51@abee2 YES です。 ポインタの概念と関数の受け渡しに話を繋げるときに、「値そのもの」ではなく「値を入れた箱」を受け渡すように説明しています。変数の概念が分かりやすくなるように「X ← 10」を図示した後に、コードではC言語では「X=10;」と書く、という感じです。
2016-06-10 14:44:14@moonmile ありがとうございます。その場合、ポインタのアドレスは箱の番号ということになるでしょうか。また、ポインタも変数であるということは、それもまた箱になるのでしょうか。
2016-06-10 15:13:49@abee2 YESです。メモリ上の何番アドレスに変数の「箱」があって、これを値とみるかポインタとみるかの違いを説明して、ポインタの場合は別の箱/アドレスを示している、という感じで繋げてます。こうするとJavaなどのオブジェクトに話に繋がりやすいので。リスト構造とか配列も。
2016-06-10 15:31:19箱の場合は排他的ですね。ボールを箱に入れた時、そのボールは他の箱の中には入っていない筈。でも変数の場合は排他的ではありません。 @abee2
2016-06-10 15:33:14@moonmile そうすると、それは物理的な箱ではなく、概念としての箱になると思いますが、その移行はどのように行われるのでしょうか。物理的な箱のイメージが強すぎて、その移行を妨げたり、誤解を招くことはないでしょうか。
2016-06-10 15:36:41@abee2 NOです。Pythonの変数はオブジェクトに対する参照とされているので箱は違うかなと(他の言語でどう扱われているかはちょっとわからないです)。ラベルというふうに教えています。
2016-06-10 15:55:55@abee2 いいかどうかといわれると「うーん」となりますが、XとかYとか数学用語に拒否反応を示す高校生を相手にするときには、導入のときに「小箱」に入れる感じと表現することがあります。リストは箱が並ぶ棚です。使っていって、変数の性質を理解する感じです。
2016-06-10 16:09:04個人的には『箱』って説明結構わかりやすいと思うんだけどなー C++ でいうと 箱:lvalue(変数) 中身:rvalue(値) x = 10:中身を箱に入れる y = x:x の中身をコピーして新しい箱に入れる z = std::move(y):yの中身をzに移動させる
2016-06-10 16:18:38「変数は箱」という説明で、否定の人達の意見が出たことが多いのですが、理由としはいくつかあって、変数については定番の説明で大多数の方がそれで学習したので、そのおかげで混乱してしまったみたいな体験をされた方が多いのではないでしょうかね?
2016-06-10 16:28:09もうひとつ考えられるのは、「変数」というのは、プログラミングするには当然の機能ですが、そもそもプログラミングの中で高度で複雑な機能なので、そもそも説明が難しいということがあるかもですね。数学でも「変数」は中学から習うもので、もしかしたら学習として後の方にするべきかもしれません。
2016-06-10 16:30:26割当て assignment, 束縛 binding, 代入 substitution, ユニフィケーション unification
2016-06-10 16:33:09