質問: money; } } ``` ここで疑問に思うのは、上のプログラムのmoney変数がオブジェクトというよりは、文脈的には明らかにローカル変数であることです。 Personクラスのインスタンスとしてjohnというオブジェクトが存在するように、intクラスのインスタンスとしてmoneyというオブジェクトが存在するという解釈もできますが、そう考えると不自然な点があります。 それは、johnというオブジェクトのフィールドを参照するには`john.money`と書かなくてはならないのに、moneyというオブジェクトは`money`だけで割り当てられている値を参照できるということです。本来は、例えば、`money.value`(valueはフィールドを参照するのに使われる予約語)のように書かないと参照できないようにするのが統一感があってよいのではないでしょうか。めんどくさいですけど... Main()のフィールドとして考えられなくもない...(??) 質問したいことをまとめると以下の2点になります。 1.オブジェクトのくせにフィールドを参照しなくていいって内部的にどうなっているの?省略記法として認められているってこと?数値データはどこに格納されているの? 2.この宇宙のあらゆる値は、何らかのオブジェクトのフィールドとして存在するので、上記の「手続き型っぽく書いてみた場合」のプログラムってオブジェクト指向でも何でもないし、オブジェクト指向とは言えない という認識であってますか? 久しぶりに投稿したからか、なぜかラフな文体になってしまいましたが、回答よろしくお願いします。
回答: 非常に大雑把な回答であることをご容赦句ください。 質問者さんに提案ですが、「特定の言語が提供する文法」と「オブジェクト指向の本質」を分けて考えることをお奨めします。 オブジェクト指向の本質を「外部へ提供する機能をそれ自身が持っている自律性のあるプログラムの構成要素」と考えてはいかがでしょう? フィールドやプロパティーやメソッドはその「オブジェクトが外部へ提供する機能」ですが文法や意味付けが違うのは「使い勝手の差」に過ぎず本質的にそれらは「どれもオブジェクトが外部に提供する機能」であると捉えてもよいと思います。 * a.field aに`field`という名前の属性をちょうだいというとそれを返してくれる * a.filed = something aに`field`という名前に特定の値を結び付けておいてというとそれを覚えておいてくれる * a.method(1) aに`method`という名前の機能を補助的な情報1を渡して何か計算してもらう * a + b aに`+`という名前の機能を補助的な情報bを渡して何か計算してもらう みたいな。 フィールドがあるからオブジェクトだとかメソッドがあるからオブジェクトという捉え方を捨てましょう。あるオブジェクトに対して「なんかして」というと希望通りに振舞ってくれるというのが広義のオブジェクトと捉えればいいと思います。 上記のような様々な「機能」を使う側のユースケースに応じて「フィールド」とか「プロパティー」とか「メソッド」といったパターンにわけて利用者に提供しているのは言語設計者が考えてくれていることですが、そのどれが「オブジェクト指向的でどれがそうでないか」はあまり堅く考えなくてよい気がします。 > > 1.オブジェクトのくせにフィールドを参照しなくていいって内部的にどうなっているの?省略記法として認められているってこと?数値データはどこに格納されているの? > > > 数値をオブジェクトとは違うものと捉えることが「固定観念」であってそういう区別を超えたところに本質があると思います。「数値」も「単なるクラスのインスタンス」と整理した言語は多い(最近よく見るPythonとか)ですが、別にそうなっていないC#やJavaやC++でも数値は言語が規定する「クラス」のインスタンスではないかもしれないけど、ある「型」の実体であることには違いはなく「型」は「クラス」と同様「他の種類のものと区別が付けられ、それぞれが特定の機能を持ったもの=広義のクラス」と捉えることができると思います。 > > 2.この宇宙のあらゆる値は、何らかのオブジェクトのフィールドとして存在するので、上記の「手続き型っぽく書いてみた場合」のプログラムってオブジェクト指向でも何でもないし、オブジェクト指向とは言えない という認識であってますか? > > > この宇宙のあらゆる値はフィールドじゃなくてオブジェクト自身と捉えるのがオブジェクト指向の考え方です。あらゆる値がフィールドと捉えるのは曲解といえましょう。オブジェクトはフィールドがないと値を表せないという固定観念があるようですが、そう捉える必要はないと思います。 だれしも特定の言語の文法から入っていくのでその言語の構文や意味付けにしばられがちです。しかしオブジェクト指向は特定の言語仕様のしばりからは離れた概念だと思います。もちょっと柔軟に(緩ーく)考えてもよいのではないかというのが自分のコメントの趣旨です。