インスタンスを理解できない関連で、つれづれ

C が ポインタで躓くように、OOPインスタンスで躓くそうな。


・・・・んなバカな。

と思わずに居られなかったのですが、うーん実際そういうもんなのでしょうか。


* * *


先日のエントリーの中で、疑りぶかいあなたのためのオブジェクト指向再入門 を 「これってOOPじゃないよね」などと書いたらば、当の前橋さんよりコメントを戴きました。(ありがとうございます)

あの講義は「OOとはこういうモノだ」的なモノではなく、「OOを学ぶ前に躓くインスタンスを理解しよう」という趣旨であるとのこと。

OOP以前」であることはまったく否定しません。
ただ、「端折ってしまった」というのは私の意図には反します。私がやりたかったのは、「端折った」(==飛ばした)ではなく、「欠けた梯子をつなぐ」ことなんです。
順番として、
(1)マルチプルインスタンス
(2)継承
(3)動的結合
というのが正しいと思われるのなら、「端折った」ではなく、「そこまで行き着けなかった」であることはご理解いただけるのでは

http://d.hatena.ne.jp/minekoa/20080803#c1217876805

なるほど、腑に落ちました。*1


で、それはそれとして、「インスタンスで躓く」というのが、あまりにショックでした。本当に? *2 ――だったので、これをネタにエントリを書こうと思いました。が、Isoparametricさんが既に書かれていました。

関数はひとつしかない事が問題なの? - 神様なんて信じない僕らのために

キャラクタ毎に

Character1MoveTo

とか

Character999MoveTo

とかやったら殺される。

関数はひとつしかない事が問題なの? - 神様なんて信じない僕らのために

あーーー、なんか思い出してきた。そういえば 昔、凄いコードをみたことがあって、同じ装置が二つあるようなのを制御するコードなのですが、

int deviceX_stat;
char deviceX_hogehoge_flg;

void deviceX_hogehoge();
void deviceX_piyopiyp();

   ・
   ・
   ・

みたいな感じのコードがあって、マクロでdeviceX をdevice1とかdevice2とかに置き換えてコードを複製してやんのです。しかも、一人の仕業じゃないのが恐ろしい。

こんなんメンテできるかー!! ・・・殺してやるぅ。

(以上、回想終了)


なるほど、・・・インスタンスが理解できない人、いるところには吹きだまってるかも、と思い直したり、という自己完結です。


* * *


さて、インスタンスの話を聞いて、メイヤー先生の本に「関数の実例(インスタンス)」という話が載っていたなぁと思いました。..み、見つからない。記憶違いだった模様です。

関数は、実行時にインスタンスを作ります。ただ、コールする時に自動的にインスタンスを生成し、リターンするときに自動的にインスタンスを破棄するので、インスタンスが存在することを意識する必要はありません。(再帰するときとかは、コール毎に別のインスタンスがいることを意識する、とかそういうレアケースを除いて)

で、Simula のクラスと そのインスタンスですが、Algol の ブロック(Cのブロックみたいな、アルゴリズムとソレが使うローカル変数のペア)とインスタンスを汎化したものです。(サブルーチンはブロックに名前をつけて再利用可能にしたモノと思いねぇ。)

この汎化は、サブルーチンであることを辞めるぞ、JOJO〜! という話で、肝は、コール/リターン時に 自動的にやっていた インスタンス生成と破棄を、それと連動しないようにしたことです。(と同時に複数のアルゴリズムを持てるようにもしたり..というのは端折る)

それによりサブルーチンじゃない、コルーチンちっくな新たなオモチャをプログラマは手に入れた!・・・なわけで、表現できるものは大きく広がったのですが*3、その代償として、

  • プログラマはコレを、「関数」と「関数の実例」を同一視するようには、扱えなくなった
  • コールスタックという素敵なメモリ管理法をおさらばしなくてはいけなくなった(さらば、自動変数)

わけで、後者は GC が補ってくれるのですが、前者はプログラマに押しつけられることだよね、と言う話だったのかな、と大回りして 前橋さんの講義を漸く理解。(また、そういうことであれば、「入門」でメモリ管理の話に触れるちゃうのもなんとなくわかるような)


ただ、メイヤー先生は、例の本第2版で、オブジェクト指向技術の中心はオブジェクトじゃなくてクラスで(こんな当たり前のコトを論じること自体馬鹿げている、例えば Smalltalkはバカだ)、むしろクラスをそのインスタンスを同一視しろ!――と言う風に書いていたなぁと思ったり。嘘です。

(以上、記憶による脚色ありかも。嘘書いてたらゴメンです)

追記

家に帰って 「オブジェクト指向入門第2版」「オブジェクト指向入門」を引いてみました。

馬鹿馬鹿しくもありがちで破壊的な思い違いをぬぐい去る時間を取ったところで、クラスの中心的な属性に戻り、クラスがオブジェクト技術においてなぜそれほど重要なのかを特に考えてみよう。

は普通に見つかったのですが、「関数の実例」「クラスをそのインスタンスを同一視しろ!」 云々は見つからない...。むしろ後者は「オブジェクトとクラスの区別をはっきりと頭に入れておかなければならない」と全く反対のことを言っています。

捏造のようです。大変申し訳ありません ....orz

*1:ただ、細かいことですが、ここで躓く人は果たして「疑り深い」からわかんなかったのか?とか、「躓く原因」とあんまりリンクしないのではないか、とか気になります

*2:その方面のプロ(?) のJavaBlack さんとか 凪瀬さんとか の話が聞きたいとか思ってしまいましたが、「そんなプログラマ以前は捨てるから居ない」とか「います。そういうのを上手く使えるかが勝利の鍵です。」とか恐ろしい答えが返ってきそうで、やめ

*3:さらに、コレって実はユーザ定義型なんじゃね?、と連鎖はつづく...