読者です 読者をやめる 読者になる 読者になる

関数はひとつしかない事が問題なの?

id:minekoaさんの
オブジェクト指向関連話でコメント欄。

問題は、「あまりにも当たり前なインスタンスの概念を理解できない奴なんているのか?」ということなのかと思いますが、
その実例は
http://kmaebashi.com/programmer/object/shigoto.html
の「以前、新人向けのJava研修の講師をやったとき」とか「また別の新人君は」あたりで書きました。

2008-08-03 - みねこあ

でひかれていた、
http://kmaebashi.com/programmer/object/shigoto.html
を読んでいたんだけれど、アレレ、って思った。

Cなどの言語では、「関数」もしくはその集合体である「モジュール」に 仕事をさせていたが、オブジェクト指向言語では「オブジェクト」に仕事をさせる。

ふむふむ。

「オブジェクト」と「関数」もしくは「モジュール」の違いは、 それが「複数存在しうるか」ということである。

えええっ。

「関数」や「モジュール」は、「ひとつしかない」ので、 こういうものが何らかのデータを抱えると、そのデータは「ひとつしかない」 ことになる。

と書いてあるけれど、Cでデータをひとつしか持たない関数なんていうのは特異なんじゃないかなぁ、ということ。
例えば、ゲームのキャラクタを操作する関数なら、

void CharacterMoveTo( Character* character, int x, int y );
みたいに(多くの場合)第一引数にそのデータを受け取る筈。

キャラクタ毎に
Character1MoveTo
とか
Character999MoveTo
とかやったら殺される。

ソート関数だって、
void CharacterPrioritySort( CharacterList* characterList, CompareFunc compareFunc );
みたいにデータを引数としたり、関数ポインタを引数としたりする筈で、
データ固定のソート関数なんていうのはあまり見ない。

「関数」だとデータはひとつしかない、なんていう感じに読める書き方は「おかしい」んじゃないですかね?
strtokがそうだとしても世の中で書かれたCの関数のすべてがデータをひとつしかもたない、なんてことはありえない。

データが「ひとつしかない」ということは、いつ書き換えられても 不思議ではないと言うことであり、結局グローバル変数と同じ問題を抱え持つ。

データが「ひとつしかない」わけないのだから、この問題は発生せず、
問題は全くない。

オブジェクト指向言語では「オブジェクト」に仕事をさせる。 オブジェクト(インスタンス)は任意の数作り出すことができるので、 自分専用のオブジェクトを作れば、上の問題を解消できる。

よって、オブジェクト指向を使う必要もない。
というか、インスタンスを任意の数作り出せるのは、Cでも同じだし、
これだとCはまるでインスタンス(メモリ上のデータ)を任意の数つくりだせないみたいだ。
Cは「データ」を使って「関数」や「モジュール」に仕事をさせる。
C++なら「インスタンス(this)」を使って「メンバ関数」に仕事をさせる。
一緒じゃない?

その代わり、「どのオブジェクトに仕事をさせるのか」ということを 常に意識していなければならなくなる。

これはCでも一緒。
メモリ上のインスタンス(データ)がどんな仕事をするかを意識せずにプログラムすることはできない。

同様に、C言語で「グローバル変数」が嫌だからといって、 その変数をstaticでソースファイル内に隠蔽し get_xxx(), set_xxx()という関数を書いたところで、 さして状況が改善されるわけではありません。
このようにすることで、実装変更の自由度が多少増すとか、 デバッグの際にフックがかけやすいという程度のメリットはありますが、 「ひとつしかない」という欠点は直らないからです。

「ひとつしかない」っていう欠点を連呼しているけれど、
それは「関数」や「モジュール」が悪い訳はなく、書いているプログラマが悪い。
欠点は言語にはなく、プログラマにある。
よって、オブジェクト指向言語は必要ない。

ってなことになって頭を抱えるわけだ。
なんてこったい。/(^o^)\

もしかして、これは、

あまりにも当たり前なインスタンスの概念を理解できない奴なんているのか

ということの実例ということかな。