インスタンスがOOPの本質だと言われて納得できないのでうだうだいうだけのエントリ

id:minekoaさんのところでも色々と

「疑り深いあなた」はインスタンスをOOPの本質と言われて納得できるのか - みねこあ

どうも議論が錯綜している感があるのでシンプルに書くことに挑戦。しかし肥大化。
まず、自分は、

「ずっとずっと先」というほど遠くないようには見えませんか。足りないのは継承とポリモルフィズムだけです。

から感じることは、
オブジェクト指向(とは|に必要なのは)抽象データ型
マルチプルインスタンス)と継承とポリモルフィズムだ」
なんてことは全く思っていません。


これらは所詮言語機能です。
もしこの一言で終わるのならば、長年にわたるオブジェクト指向議論が行われている理由が説明できません。
また、これらが揃っている言語で記述したものがオブジェクト指向になるのだとしたら、
そんなものはいりません。
「マルチプルインスタンスと継承とポリモルフィズムを使っているからオブジェクト指向だ」なんて話はないはずです。
オブジェクト指向って、その先にあるもので、そんなことを延々と語ってきたものではないでしょうか?
故に、誰にも決着をつけられなかったものに決着をつけようという想いもありません。
ここで述べるべきは「インスタンスOOPの本質だなんてとんでもない!」ということです。

抽象データ型は、「型」というくらいで、複数生成を前提にしています。クラスもしかりです。
Isoparametricさんのおっしゃるように、プログラムによって、「あえて複数生成を前提にしない」ことはあるでしょう。でもそれは「あえてオブジェクト指向を使わない」と言っているのと同じでは。

はもの凄く誤解されていると思うのですが、
「あえて複数生成をしなかった」「あえてオブジェクト指向を使わない」のではなく
「複数生成をしないべきであるから複数生成をしない」のです。
自分は、オブジェクト指向及び構造化プログラミングにおいて、
単一なものは単一なものとして適切に表現/設計すべきである、と考えています。
あえて使わなかったのではなく、「使ったからこそ」単一になるのです。
そして、それはオブジェクト指向固有の概念ではないとも考えています。
適切に構造化したとき、1つしかないものは1つしかないように設計されるべきでしょう。
複数ありえないものを複数つくろう(つくれるようにしよう)だなんてことはおかしな話です。


id:kmaebashiさん曰く、

みねこあさんのところに書きましたが、私が言っているのは「マルチプルインスタンスオブジェクト指向の必要条件である」ということです。少なくともC++オブジェクト指向は、抽象データ型の発展形だからです。

僕が言っているのは「マルチプルインスタンスオブジェクト指向以外のプログラムにおいても多くの場合必要条件である」ということです。
違和感を感じたのは「C(の関数)ではまるでマルチプルインスタンスが適切に働かないように書かれていたから」です。
なので、「オブジェクト指向以前」でも有用に使われていましたし、
Cだって昔から1つの関数を使いまわすために使われていますよ、と言いたかったのです。


重ねて言えば、


「マルチプルインスタンスなんてOOPじゃなくても普通に使う概念じゃないですかね?
OOPじゃないと使いこなせないように書いてあるのはなぜ?」です。


自分が「マルチプルインスタンスオブジェクト指向の本質ではない」と思っているのもあるでしょう。
自分は「マルチプルインスタンスはプログラミング全般における基本的概念の1つである」と思っています。


勿論、インスタンスがなければオブジェクト指向をすることは難しいでしょう。
が、それを本質とまで表現するには違和感があり、
インスタンスは単なる方法論を実現するための基礎概念/基礎機能じゃないのかしら? と感じるだけです。


みねこあさんのコメント欄で田辺さんが言っているように

抽象データ型のような普遍的な概念も
クラスのような具体的な機能も、
どちらもOOP(方法論)を遂行する為の道具だと思ってよいでしょうか。

というように普遍的な概念だと考えます。

私は、なんとなく、kmaebashi さんに同調できて
マルチプルインスタンスおよび、それらのメッセージのやり取りが、
オブジェクト指向の核たるイメージ、「真髄」という感じがするんです。

ここで田辺さんはマルチプルインスタンスをあげられていますが、
例えば、FooのインスタンスとFooのインスタンスではなく、
単一しかないFooのインスタンスとBarのインスタンスのメッセージではどうでしょうか?
それは核たるイメージとかけ離れるでしょうか?
複数あるもの同士ではなく、単数と単数、単数と複数では駄目なんでしょうか?


もし駄目だとすると、単数でしか表現できないものがあるとオブジェクト指向が使えなくなってしまいます。
そんなことはないでしょうか。
そもそもオブジェクト自身は相手が単数だとか複数だとか意識しないのではないでしょうか。


必ずしもマルチプルでなければいけないとは自分は思いません。
また、マルチプルであるということは、「複数であらねばならない」ではなく
「複数であるか単数であるかそれともそれ以外であるか適切である」ということを指していて欲しいとも考えます。


実務経験上、ありえないことを無視して常に複数個ありえるように設計されたクラスなんてナンセンスだからです。