オブジェクトとは何か。ただし形而上学と仏教の視点から。

オブジェクト指向のAdventCalendarがあったら書こうと思っていたのが今年は無かったので直接投稿します。

これはオブジェクト指向の元となった考え方を哲学から借りてきて説明する記事です。
オブジェクト指向そのものではありませんが、理解の足しになればと思います。
簡潔をむねとして書いたので分かりにくい場所もあるでしょうがそこはご質問ください。

# オブジェクトについて
## オブジェクトとはなんですか
仏教的の中論（以下単に仏教）では単に全ての物、形而上学では個物です。
個物とは「それは何であるか」の「それ」です。
「東京タワー」は「電波塔」であるというときは東京タワーが個物です。


## オブジェクトは主語（サブジェクト）になりますか
なります。
仏教では全ては物なので主語になるのも当然物です。
形而上学では主語になり述語にならないものこそ個物であると明言されています。


## 物と個物の違いはなんですか
物は存在するもの全てを指しますが、個物は指し示すことができる|状態のあるものです。
現実ではアイデンティティのない「クラス」や数値は個物ではありません。
ソフトウェア的に、クラス定義や数値を表現したオブジェクトは特定できるメモリに展開されるので個物です。
即値はアイデンティティを持たないので個物ではありませんが区別する必要は特にないと思われます。


## 仏教では物にアイデンティティはないのですか
あることにしたほうが便利なので便宜上有ることにしてもいいですが、同一性は保証されないので実際はないです。
インターネットでとあるアドレスにリクエストを飛ばしたとして、応答するサーバの同一性が保証されないのと同じです。


## 物と個物を区別する意味はありますか
UMLなどで属性とオブジェクトを区別している理由がわかるようになります。
属性となりえるオブジェクトは状態を持たないように設計することで複雑さを軽減することができます。
また、偉い人が全てはオブジェクトであるなどと言いつつ状態を持たない値はオブジェクトではないとか
一見矛盾することを言い出したときに何が言いたかったのか分かるようになります。


## 犬や猫は個物ですか
特定の犬や特定の猫は個物ですが、単に犬とか猫とか言った場合には
特定の猫の話をしているのか猫一般の話をしているのか判断ができないので個物とは限らないでしょう。
個物の話をするなら、東京タワーとかスカイツリーのような、固有名詞で特定できるものをお勧めします。


## オブジェクトを分割するとオブジェクトになりますか
仏教では全ては物であるので分割してもやはり物です。
形而上学では個物を分割して個物にすることができます。その場合、元の個物は分かれた個物の合成物であるとします。
属性に分割した場合は分割された属性は個物ではありません。
例えばスカイツリーから送信設備とか展望台を分離した場合はそれらは個物でありスカイツリーは合成物ですが、
スカイツリーから「高さ634m」を分離した場合は「高さ634m」は個物ではなく値です。


## 合成物と合成の要素の個物は同じライフサイクルですか
物理的に合成した場合、全体と部分が物理的に重なるので結果的に同じライフサイクルとなります。
ソフトウェア的に合成した場合、ポインタを含まない構造体などは同様に全体と部分が同じライフサイクルになりますがオブジェクト指向によくある参照を介しての合成では別にそんなことはありません。
もちろん、同じライフサイクルのほうが都合がいいならばそう設計してもいいでしょう。


## 合成と集合の違いはなんですか
形而上学では合成したものは個物、集合は単に個物を集めたものか数学由来の集合です。数学的な意味は数学者に聞いてください。
以下は形而上学の話とします。
自動車はいろいろな部品の合成物であり、単に部品を山にしたよりも高い機能があります。
一方、部品の山はまとまりとして個物ではありますが、部品を取り出したり追加したりするような部品ではなく集団としての機能しかありません。
簡単な見分け方としては合成物がその部分の集合であることより別の機能を持っていること、部分が欠けたときに機能が低下することです。
例えば自動車からタイヤを一つ外すと走行性能が低下しますが、タイヤの山からタイヤを抜いた場合は
総量は変化しますがタイヤの山としての機能は低下しないでしょう。


## あるオブジェクトと別のオブジェクトとはどう関わっていますか
関連があれば直接的に、関連が無ければ間接的に相互作用しているでしょう
仏教ではこれを「縁」と呼びます。
形而上学では特に名付けていません。能動と受動を分けているくらいです。


## なぜ形而上学では特に名付けていないのですか
相互作用は個物特有のものなので形而上学の範囲外だからです。
生物同士の相互作用は対象と状況により違いが大きすぎてアリストテレスも一般化できなかった、と言ってもいいです。


## 相互作用はメッセージですか
メッセージは相互作用ですし相互作用を表現するメカニズムとしては柔軟性が高く非常にいいものですが、
現実で全ての相互作用はメッセージであるとするには根拠が足りないと思われます。


# クラスについて
## クラスとはなんですか
仏教では「識」、つまり「自分にとってそれは何であるとしているか」が最も近いですが、「識」はダックタイピングみたいなものなのでクラスにあたる概念は存在しません。もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルであるとしても不都合はないであろうということです。
形而上学では「それは何であるか」の「何」です。形相と言います。
「東京タワー」は「電波塔」であるというときは電波塔がクラス（形相）です。

仏教にクラスは無いので以下のクラスの話は形而上学のものとなります。


## クラスは設計図ですか
クラスは「それは何であるか」であり、クラス定義は「それはどういったものであるか」ですが設計図そのものではありません。
ですが、クラスを設計図として使うこともできます。あるクラスをもとにしてオブジェクトを生成した場合はそのオブジェクトがそのクラスの性質を持つとして扱えるオブジェクト（インスタンスと呼ばれます）となることを保証できるのでたいへん便利です。


## クラスはイデアですか
イデアとは「今「何」の話をしているか」の「何」であり、クラスは「それは何であるか」の合意なので厳密には違います。
例えば「猫は可愛い」と定義した場合、猫のイデアについて話をして猫のクラスを定義した結果、「猫は可愛い」で合意したという関係となります。
猫のクラスは猫のイデアの今必要な部分だけを定義したものと言ってもいいでしょう。


## クラスを修正した場合にオブジェクトも変更されるのは正しいですか
クラスをもとにオブジェクトを作ったのなら正しいでしょう。現実世界のものは別にクラスから作られたわけではないのでそういったことは起きません。


## クラスによりオブジェクトの性質が定義されるのは個の尊厳への冒涜ではないですか
個体差（状態）があってもいいです。まとめたものと細かく見たもので差分を考えようというのがアリストテレスの基本姿勢です。
人間は一人で一つのクラスであるとかたまに見ることがありますが、それはまとめて扱うのが難しくなるのでやめたほうがいいでしょう。特にJavaなどで個人をクラスで表現しきれないのは単に言語の制限が厳しいからです。


## クラスの継承とはなんですか
継承とは引き継ぐことですから、クラスの継承とは「それは何であるか」を引き継ぐことです。
形而上学的にはクラスを継承した場合、親クラスは類、子クラスは種にあたります。
猫は哺乳類である、といえば親クラスは哺乳類、子クラスは猫です。哺乳類の猫種ですね。
猫はペットである、といえば親クラスはペット、子クラスは猫です。


## UMLの汎化、特化とは違うのですか
汎化、特化は「それは何であるか」の関係性だけに着目した表現です。
クラスの継承は一般的に「それは何であるか」「それはどのようなものであるか」「それはどのように扱えるか」を含みます。
細かく言うと「それは何であるか」が型であり「それはどのようなものであるか」は属性やメソッドの定義であり「それはどのように扱えるか」はインタフェースです。もちろん他にも分ければ色々あります。


## インタフェースの継承とは何ですか
「それはどのように扱えるか」を継承しているということです。
ソフトウェア的には「それは何であるか」と区別する必要はないのでほぼ型と同一視されます。


## 継承の本質はインタフェースですか
いえ継承の本質は引き継ぐことですから何を引き継ぐかは本質ではないでしょう。
システム的には正しく扱うことを目的として継承するのですから最も重要な形象はインタフェースであるということはできるでしょう。


## 猫は哺乳類とペットのどちらですか
そのシステムで都合のいいほうでいいでしょう。


## むしろ猫は哺乳類でありペットでもあるのではないですか
話がややこしくなるのでお勧めできません。
哺乳類である猫とペットである猫との二つに分けて定義しましょう。
哺乳類である猫のインスタンスとペットである猫のインスタンスの二つを作って合わせて一匹の猫であるとすれば解決します。


## 猫は一匹なのにオブジェクトは複数あってもいいのですか
人が色々なペルソナを持つように物にもいろいろな側面があっていいので問題ないです。
アリストテレスは学問の分野を分けることで対応しています。例えば生物学的には市民と奴隷を区別していませんが政治学では市民と奴隷を区別しています。


## 継承と別インスタンスの使い分けの基準は有りますか
同じ分類で同時に複数の種であることはできません。犬であり同時に猫でもあるクラスが欲しかったら新しくクラスを作ってください。
具体的には、それは大雑把に言うとAであり、具体的にはA'である、と言える時にはAは親クラス、A'は子クラスです。
例えばスカイツリーは大雑把に言うと塔であり、具体的には電波塔です。
同時にスカイツリーは観光地でもありますが、スカイツリーは大雑把に言うと観光地であり、具体的には電波塔であるは成立しません。
電波塔は必ず塔ですが、観光地であるとはかぎりませんよね？


# オブジェクトの生成について
## 人は猫の作り方を知りませんか
猫一般の話として、
猫は猫が産んで、飯食って寝てるうちに育って立派な猫になることは多くの人が知っていると思われます。
親猫もいなかったら誰かから貰ってくればいいと思います。


## 作るとはどういうことですか
まだ物理的に完成していない存在を目的のものに完成させることです。
猫は猫として生まれ自分自身を育てて猫にします。
ソフトウェアでは誰かがメモリを割り当ててデータ構造を作っていることでしょう。


## 存在するとはどういうことですか
言及や認識ができるということです。
ある特定の猫はそれに言及したときから存在しますが物理的には存在しないかもしれません。
例えばこれから猫を飼おうとする場合は、きっとどんな猫を飼うか検討することでしょう。
この時点から猫は存在します。猫が物理的にも存在するには誰かから貰ってくる必要があるでしょう。
ソフトウェア的にはメモリアドレスが特定できれば存在していると言えるでしょう


## 存在は無い（nullである）ことができますか
アリストテレスは「偽」とは論理が正しくないことだとしています。
存在し、かつ存在しないというのは偽、つまり言うのはタダだが上手く扱えないからやめとけとなります。


## なぜ猫は物理的に存在する前から存在するのですか
検討した猫と誰かからもらってきた猫は連続していると考えたほうが単純だからです。
猫を飼うつもりだった人が実際に猫をもらってきた場合に、
予定通りに猫を飼うことにしたほうが特に理由もなく猫をもらってきたとするより話が簡単になります。


## 猫は存在する前から猫ですか
少なくとも猫と呼んだ時点では猫です


## 猫から生まれたらそれは子猫ではないですか
時間経過や状態の変化で呼び分けても別に問題はないでしょうが、
いつまで子猫でいつから猫なのかというどうでもいいわりに面倒くさい問題が発生するので
最終的に猫になるから猫でいいんじゃねというのがアリストテレスの主張です。


## なぜ最終的になるものを名前として使うのですか
理由もなくそれ以上変わらないからです。
猫は成長して犬になったりしませんし、猫を飼うつもりだった人も理由なく犬をもらってきたりしないでしょう。


## 猫を飼うつもりだった人が犬をもらってきたらどうするんですか
猫を飼うのはやめて新しく犬を飼うことにしたんじゃないですかね。


## 猫のような生まれるものでなく人が作るものはどう名付ければいいですか
ものの目的を名前にしてください。高いことが目的である建物は塔ですし、テレビ放送用に電波を発信する塔は電波塔です。
よってスカイツリーは電波塔であるというのが良いでしょう。
もちろんスカイツリーは観光地にもなるように設計されていますので、スカイツリーは観光地であるも同時に成立します。


## なぜ目的となるものを名前として使うのですか
理由もなくそれ以上変わらないからです。
目的を名前にすれば目的を達成するために修正が入っても名前を変える必要はありませんし、基本的に修正は目的を達成するために行われるものです。
目的自体が変わったらそれは根本的な設計ミスなので素直にやり直しましょう。


# 形而上学など考え方について
## 形而上学とはなんですか
「それは何であるか」とはどういうことかを考える学問です


## 仏教の中論とはなんですか
「それはなにものでもない」ということを延々と説明した書物です。


## 形而上学を学ぶとどんないいことがありますか
「それは何であるか」をより適切に表現できるようになります。
また、アカデミックな議論はソクラテス―プラトン―アリストテレス師弟の考え方をもとにしているので
学問的な表現と相性がいいのが確実視されます。


## 仏教の中論を学ぶとどんないいことがありますか
執着を捨てることができるようになりますが技術屋にはあまり関係ないですね。
技術屋的には偏見や思い込みから解放され自由に考えることにつながると思われます。


## ソフトウェア開発に形而上学は有効ですか
「それは何であるか」が必要な場面、例えば複雑なものを設計する時には有効でしょう


## 形而上学が役に立たないのはどんなときですか
「それは何であるか」を考える必要が無いほど単純なものやもうわかっているものには役に立ちません。
例えばFizzBuzz問題はこれが何であるかは既に分かっているので、解決に形而上学を採用する必要はないでしょう。


## 形而上学が役に立たないときは何を使えばいいですか
「それは何であるか」がわかっているなら別に何を使っても困ることはないと思いますが適切な手法が欲しいというのなら数学を使ってください。数学は形而上学と直交しており、問題とは関係なく常に役に立ちます。


## なぜ形而上学は数学と直交していると言えるのですか
形而上学は「それは何であるか」を考えるものですが、数学は「それは数学的に何であるか」を考えるものだからであり
「それは何であるか」にかかわらず数学は成立するからです。


## 数学は「それは何であるか」を考えないものですか
はい。「それは何であるか」にかかわらず成立するということは「それが何であれ」成立するということです。
真理はその問題が何であれ常に成立するべきであり、だから数学が最も真理に近いというのがアリストテレスと同時代の数学者集団であるピタゴラス学派の主張です。


## 形而上学は関数型言語というか数学と相性が悪いですか
悪いというか直交していますので、混ぜ方が悪いと混乱を生みます。
オブジェクト指向言語と関数型言語の相性が悪いとの主張がたまに見られますが、そう見えるのはオブジェクト指向というより形而上学由来の問題です。


## 悪い混ぜ方とはどういうものですか
集合は数学的に見れば状態を持たないが形而上学的には単に複数の個物をまとめたものなので状態を持つこともあり得る。
この両者を取り違えるとかそういった話です。
数学は「それは数学的に何であるか」を考えるものですので、数学に数学でないものを混ぜると混乱の元となります。


## 形而上学に数学を混ぜるのは問題ないですか
問題ありません。むしろ道具としての数学は積極的に用いるべきです。


## なら数学だけ使って形而上学は捨ててもいいんじゃないですか
数学で解決できるのは数学的問題なので、システムを数学的問題にできれば形而上学は捨ててもいいんじゃないでしょうか。
ただし、複雑なシステムを開発する時には「それは何であるか」がそもそもわかっていないものなので、「それは数学的に何であるか」よりも「それは何であるか」のほうが先に問題になることが多いと思います。


## 数とはなんですか
数学者に聞いてください。
なお、当時の数学では「それは数であるか」は割とどうでもよかったみたいです。
例えば、「長さ10m」という量があったとして、これは数でしょうか？
アリストテレスはこれを数だとしましたが、ピタゴラス学派では
これを数だと主張する人がいたり、「10」こそが数であって長さは余計だとする人がいたりして、
形而上学本文中で「どっちでもいいから主張を統一してくれ。議論できない」とぼやいています。


# 終わりに

とりあえず思いついたのはこのくらいですが、質問いただければそれなりに回答できるかと思います。
思い出したこともあれば追記しようと思います。

ここではありませんが先日「やる夫で学ぶオブジェクト指向以前」というスレを投下してそこでは順を追った説明をしているので興味を持たれた方はご一読ください。仏教についてももう少しまともに書いてありこの記事よりは読みやすいかと思います。
まとめていただいたのでググれば出てくると思います。