[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 1560] Ruby のポインタ (wasRe: 集約とコンポジション)



お久しぶりです。前橋さんの本は一週間前くらいにやっと読ませていた
だきました:)。やっぱり語りがおもしろいです^^。
# 私より後に書きはじめてるのに先に発売されてるし^^;;

In article <20010302202958.540e00d3.32460@xxxxxxxxxxx>
前橋 和弥 wrote:
>フィールドはたいていprivateにするわけで、そんなところがどう
>なってようがそれは実装詳細だ、という考え方は、それはそれで確
>かにわかります。
>
>が、Cプログラマ上がりの私なんかからすると、やっぱり「一番大
>切なのはデータ構造だろう」という意識もあります。Cのソースを
>読むのなら、まずはヘッダファイルからデータ構造を把握すること
>を考えますね。
>
>で、Javaのソースを読むときも、まずはフィールドを見てオブジェ
>クト間の構造をつかもうとするわけなんですが、よく考えると、
>クラスのソースを見るときに「まずprivateなメンバから」見るっ
>てのは、なんか間違ってるような気もします。
>
>でも、またよく考えてみると、UMLでクラス図を書く場合にも、こ
>のクラスはこのクラスへの参照を持ってるとか、関係が1:1である
>とか1:nであるとかは非常に重要な情報であるわけです。そして、
>それがソースに直接現れるのは、やっぱりprivateフィールドであ
>るわけで...
>
>なんかそこはかとなく矛盾を感じてしまいます。

関係は重要だけど、それが例えばLinkedListで実現してるかArrayListで
実現してるかみたいなことは、*利用者が*データ構造を見る上で重要
じゃないということと思います。
ListかSetかみたいなことは利用者からも重要なので、外部仕様に本来書
かれるべきことと思いますし、UMLはそういうのも表現すると思います。
# たぶん^^知らない
クラス構成を表すUMLみたいなものが、利用者が理解するに足るだけの
データ構造を表しているはず、というものかなと。

そのクラスをメンテナンスしようとするひとはもちろん
privateフィールドも全部見るわけですが・・・。

C等の場合はデータ同士の関連を把握する際に、絶対必要とは言えない低
レベルな部分から見なければならない、という見方もできる、と思った
けどCでも型定義をうまくやればそういう部分の意識を少なくすることは
できますね・・・。
ま、あくまでアクセス修飾子ということで^^。コンパイラによる静的チ
ェックを助けるのが主目的かなと。
# 最後は曖昧に逃げる

>私に書かせると、「Java言語 『ポインタ』完全制覇」になったり
>しますぜ。いや、マジで。

いろいろ制覇してください:)。たのしみ。

>以下余談ですが、
>
>「C言語 ポインタ完全制覇」に、「JavaにもRubyにもポインタはあ
>る」なんてことを書いたら、ruby-mlでまつもとゆきひろさんに批
>判されたようです。
>
>  http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/27218
>
>てなわけで、こんなページ
>
>  http://member.nifty.ne.jp/maebashi/seiha/hosoku001.html
>
>を書いたんだけど、多分まつもとさんは見てないんだろうなあ。

参照という用語についてちょっと興味深い意見が去年の10月にfjで出て
いました。
news:<87wveqq3nc.wl@xxxxxxxxxxxxxxxxxxx>
なんですけど。えーい引用しちゃえ。

In article <87wveqq3nc.wl@xxxxxxxxxxxxxxxxxxx>
Shugo Maeda wrote:
>> (前提) ここで考慮しているのは「ポインタ値」であり、そのポインタ
>>        値を保持しているような変数/フィールドが「ポインタ(変数/ 
>>        フィールド)」である。つまり、1st class valueとして(一人前
>>        の値として)変数に格納したり受け渡しできたりするもの、とい
>>        うことは前提とする。
>
>ここで「変数は値を格納するものである」ということが前提とされてい
>ますが、この前提を崩すような考え方もできるのではないでしょうか?
>
>上記の考え方によると、よくある比喩ですが、変数は値が入っている箱
>のようなものであり、Javaでいうところの参照型変数では、その箱の中
>にはポインタ値が入っていて、そのポインタ値が何らかの値(オブジェク
>ト)を指し示す、という形で説明されるわけすよね。
>
>このモデルでは、
>
>x = "abc"
>
>は、
>
>|             |
>| ポインタ値 ---> 文字列"abc"
>|             |
>+-------------+
>    変数x
>
>のように図示できます。
>
>ところが、参照型しかない(あるいは実装上即値である場合も、モデル上
>はすべて参照とみなせる)言語(Lisp、CLU、Rubyなど)の場合は、必ずし
>も「変数は値を格納する箱のようなものである」と考える必要はなくて、
>「変数とは何らかの値(オブジェクト)を指し示す名札のようなものであ
>る」というモデルで理解することもできる(し、その方がわかりやすい)
>と思うんです。
>
>図で説明すると、
>
>       変数x ---> 文字列"abc"
>
>のようなモデルです。
>
>このようなモデルを採用できる場合は、「いかなる意味におけるポイン
>タ値も存在しない」と言ってよいと思うのですが、いかがでしょうか。

Rubyが「参照」と呼ぶのはこの考えに基づいているのだと思います。
こう考えると「ポインタ」と「参照」の違いというのも分かるなと。
Rubyなひと(等)にとってはこれは常識と言われればそれは納得出来ま
す。
で、Javaについてですが、結局Javaはスカラ型もあるし、上記モデルで
説明出来ないような配列の構造もあるし(上記記事のフォローで追求し
てらっしゃいます)で、中途半端ではある、という所だと思います。

だから、Javaの参照を(上記のような)参照の概念として説明すると例外
が多く混乱するので、ポインタといってしまった方が理解がスムーズと
は思いますが、「Rubyにポインタはない」については納得出来たなぁと
いうところ。どんなもんでしょ^^。

--
木下 信@ひらつか
http://www.sk-jp.com/