[#21157] あったらうれしいメソッド to_n, to_n!, to_s! — ogino@...

荻野です。あったらうれしいメソッドということで書いてみます。

16 messages 2000/03/03

[#21159] メソッドの入り口 — ogino@...

荻野です。もうひとつご指導ください。

93 messages 2000/03/03
[#21170] Re: メソッドの入り口 — Shin-ichiro Hara <sinara@...> 2000/03/03

原です。

[#21243] Re: メソッドの入り口 — keiju@... (石塚圭樹) 2000/03/07

けいじゅ@日本ラショナルソフトウェアです.

[#21247] Re: メソッドの入り口 — 中村暁史 Nakamura Akifumi <BXQ04723@...> 2000/03/07

[#21267] 引数コピーとオブジェクト指向 (Re: メソッドの入り口) — Hideto ISHIBASHI <s34204@...> 2000/03/08

石橋秀仁です。

[#21272] Re: 引数コピーとオブジェクト指向 (Re: メソッドの入り口 ) — 中村暁史 Nakamura Akifumi <BXQ04723@...> 2000/03/08

[#21276] Re: 引数コピーとオブジェクト指向 (Re: メソッドの入り口 ) — nobu.nakada@... 2000/03/09

なかだです。

[#21279] Re: 引数コピーとオブジェクト指向 (Re: メソッドの入り口 ) — ogino@... 2000/03/09

oop未満の世界観の荻野です。

[#21282] Re: 引数コピーとオブジェクト指向 — Tomoyuki Kosimizu <greentea@...2.so-net.ne.jp> 2000/03/09

越水です。

[#21285] Re: 引数コピーとオブジェクト指向 — ogino@... 2000/03/10

荻野です。

[#21365] Re: 引数コピーとオブジェクト指向 — Matsuo Hisanori <hisanori@...> 2000/03/13

松尾です。

[#21293] Re: 引数コピーとオブジェクト指向 — Matsuo Hisanori <hisanori@...> 2000/03/10

松尾です。

[#21297] Re: 引数コピーとオブジェクト指向 — ogino@... 2000/03/10

荻野です。

[#21302] Re: 引数コピーとオブジェクト指向 — 土岐 仁謙 <toki@...> 2000/03/10

土岐です。

[#21371] Re: 引数コピーとオブジェクト指向 — Matsuo Hisanori <hisanori@...> 2000/03/13

松尾です。

[#21374] Re: 引数コピーとオブジェクト指向 — TADA Tadashi <sho@...> 2000/03/13

ただただしです。

[#21280] raise non-Exception object — Kenichi Komiya <kom@...3.rim.or.jp>

24 messages 2000/03/09
[#21283] Re: raise non-Exception object — nobu.nakada@... 2000/03/09

なかだです。

[#21315] Re: raise non-Exception object — Kenichi Komiya <kom@...3.rim.or.jp> 2000/03/11

[#21342] Re: raise non-Exception object — nobu.nakada@... 2000/03/12

なかだです。

[#21384] ruby 1.4.4 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

35 messages 2000/03/13

[#21442] 配列内のソート — Takayuki Tanaka <tanaka@...>

こんにちは Tanです。

16 messages 2000/03/15

[#21583] ruby for Web — TAKAHASHI Masayoshi <maki@...>

高橋征義です。

27 messages 2000/03/22
[#21584] Re: ruby for Web — "NAKAMURA, Hiroshi" <nakahiro@...> 2000/03/22

なひです.

[#21649] net-1.1.10 — TAKAHASHI Masayoshi <maki@...>

高橋征義です。net/http 使いたおし中。

17 messages 2000/03/27

[#21669] new version of mod_ruby & eRuby — Shugo Maeda <shugo@...>

前田です。

14 messages 2000/03/28

[ruby-list:21279] Re: 引数コピーとオブジェクト指向 (Re: メソッドの入り口 )

From: ogino@...
Date: 2000-03-09 14:37:57 UTC
List: ruby-list #21279
oop未満の世界観の荻野です。

自分のことをちょっと書くと、プログラミングというのは苦手でしてあまり大
きなものを満足に作れたことがありません。C は一時期主観的には努力をしま
したが、実りませんでした。

 BASIC(PC-8001) -> TurboPascal(PC-9801VM21) ->
 HyperCard(MacintoshIIsi) -> Perl5(Solaris) -> 現在

C++ や Delphi、Java に関しては入門書を読んだ程度の知識しかありません。
一番使い込んだのは HyperCard(HyperTalk) でしょうか。今は Apple からも
見放されていますが、メッセージ駆動方式に非常に感銘をうけました。またス
クリプトもオブジェクトのプロパティだったりして、GUI のボタンをコピーす
るとスクリプトも一緒についてきました。(ここでいうオブジェクトは皆さん
の言うオブジェクト指向のオブジェクトという意味ではないと思いますが)

私の元の質問はたぶん今の話の流れとはちょっとだけ違っていて「あの疑問」
(その2 の部分だと思いますが)というのはメソッドの引数というよりもインス
タンス変数とインスタンス変数が指すオブジェクトのどちらを「カプセル化」
で包むべき(better)なのだろうかという意味でした。

私が使っていた今までの言語たちでは変数は値をその中に持っており、そうで
ない場合はポインタであるという意識を人間が常にもっています。したがって
変数へのアクセスが限られた関数に制限されれば(すれば)、その中身も当然に
「カプセル」で守られています。

Ruby のような言語では(こういった理解では不正確でしょうが)、オブジェク
トというのは直接は手の届かない空間に浮かんでいて、ただ変数という窓を通
してのみアクセスできます。この窓はメソッドが呼ばれるときにコピー分裂を
行うので、メソッドの中で引数で渡された窓からみえるオブジェクトには少な
くともメソッドを呼んだ側の窓も空いているはずです。

(もちろんマルチスレッドでなければメソッドの実行中にメソッド外の窓から
手を突っ込まれる心配はありませんが、ライブラリとして作っている場合は実
際にプログラムに使われる時点でマルチスレッドかどうかは知る方法がありま
せん。)

個人的には「本当のオブジェクト指向」とか「本当のオブジェクト指向が理解
できているか否か」にはあまり興味を持てないというのが心情ですが、効率的
な(というのはもちろん資源の節約と安全性・堅牢性のバランスの問題もある
でしょうが)プログラミングという観点において、窓だけをカプセルに包んで
インスタンス変数から見えるオブジェクト自体は外界と共有するほうが良いの
か、外界には窓を持たない別のオブジェクトを(コピーにより)生成してオブジェ
クト自身もカプセルにつつんだほうが良いのか、お聞きしたくて質問した次第
です。

話のながれから受ける限り Ruby においてはコピーすべきではない、つまりイ
ンスタンス変数はあっても、インスタンスオブジェクトとも呼べば良いのでしょ
うか、オブジェクトの要素としての他のオブジェクトを保持したりしないほう
が、よりオブジェクト指向らしいとされるようです。

Ruby ではない、変数にオブジェクトが入るような言語では変数へのアクセス
を制限すれば全部がカプセルに入るのでこのような心配は不要というかしたく
てもできないわけですが。

こういうことを考えると、そもそも変数がオブジェクトへの参照であるという
Ruby のスタイルが、みなさん(という印象をうけるだけかもしれませんが)の
言われるようにオブジェクト指向と不可分であるかどうかも素人ながら考えて
しまいます。

もちろん Ruby の世界ではこの答えは真なのでしょうが、変数にオブジェクト
が入るような言語(C++はそうですか?)では「本当のオブジェクト指向」は実
現不可能なのかというと、どうなのでしょう? C++では無理としても。

a = b でオブジェクト(値)のコピーが発生するような仕様の言語の場合でも、
a.msg とかメッセージを渡すことはできると思います。多分問題はメソッドが
引数をとる場合にメソッド内で引数を参照する場合には、それはローカル変数
によって参照されるべきだと思いますし、変数ごとにオブジェクトが独立だと
すると本当のオブジェクトの引渡しというのは不可能になります。しかしなが
らメソッドが必要としているのは他のオブジェクト自身ではなく、そこから引
き出せる情報だという観点をもつと、まだ他の道もあるように思います。

[1] メソッドに引数として値(ポインタを含む)を引き渡す方式
 (変数に値が入るような言語)

[2] メソッドに引数としてオブジェクトへの参照を引き渡す方式 (Ruby?)
 (変数に参照が入るような言語)

[3] メソッドに引数として他のオブジェクトからのメッセージを引き渡す方式
 (変数に値が入るような言語)

こんなことを言い出す根底には、Ruby のような変数に参照がはいる言語では
オブジェクトには本名ともいうべき変数名がないわけで、抽象度が高い分、敷
居も高いように思います。このメーリングリストでも Ruby 入門者にどのよう
な説明がわかりやすいかという話題などがでることなどもこのことの裏付けに
なると思うのです。

またメッセージ交換をオブジェクト同士でしたいと思っても、Ruby では受け
取ったメッセージが誰からか知りようがない、だから引数に自分や関係者のオ
ブジェクトへの参照も含めてメッセージを渡さざるを得ない。もちろん、この
ときにオブジェクトのコピーを作るのはばかげていると思います。


個人的な(現時点での)「あの疑問」は言い換えると、

あるオブジェクトが生成されるときに、より小さいオブジェクトを構成部分と
してもつ場合には心情としては与えられたオブジェクトを隔離したいと思うが、
できない(Ruby の場合)とき、与えられたオブジェクトを雛型として自分の一
部を(再)生成するべきか?
もちろん自分にかかわりのあるオブジェクトへの窓口をもっていたい場合は、
単にインスタンス変数が参照を保持しておけばいいというのは分かりますが。

答えとしては、

そもそも Ruby としては変数はオブジェクトへの窓にしかすぎない以上、引数
が指すオブジェクトをコピーしてもあまり意味が無い。そもそも受け取った引
数で参照できるオブジェクト自身が他のオブジェクトへの参照を持っている場
合、実質的なコピーは不可能。

というより、

そんな疑問/心情をもつことがオブジェクト指向を理解していない証拠。

というところでしょうか。


もうすこし「オブジェクト指向」が簡単だったら良いのになぁ、と思うわけで
すが、こればっかりは自分の技量の問題でもあるわけで別にオブジェクト指向
の欠点というわけでもない。さしずめ Ruby は「現時点での最良」とでもいう
べきか。

すくなくとも自分のなかの「カプセル化」とか「メッセージ駆動」とかとRuby 
の構文とは直接の一致を見ていなくて、その構文の後ろに見えるようにイメー
ジトレーニングをしなければならないという感じです。a という変数があり、
それが指しているオブジェクトがあるとすると、Ruby のスクリプトにはオブ
ジェクトが現れないので、一生懸命想像力を働かせて名前もない(クラスはあ
るけど)インスタンスを思い浮かべて a をそれへの窓(名札、ポインタ、etc.)
とイメージする... なかなか難しいです。名前が無いものは記憶できないし。


とりとめがなくてすみません。


-- 
荻野 充 (おぎの みつる) ... 「萩(はぎ)」にあらず
名古屋大学消費生活協同組合

In This Thread