[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 23:17 / Filesize : 368 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

プロトタイプベース・オブジェクト指向



1 名前:デフォルトの名無しさん [03/12/08 21:30]
オブジェクトを複製または継承によって生成を行う言語,
プロトタイプベース・オブジェクト指向言語について語りましょうよ.

関連リンク >>2


331 名前:デフォルトの名無しさん mailto:sage [04/02/04 12:55]
動的かどうか、柔軟かどうかはプロトタイプベースかクラスベースかとは直接関係ないんでしょ?
(プロトタイプベースのほうが柔軟にはしやすいのだろうけど)
じゃあ、あとはどっちを使うかは個々人の流儀の問題で、ただの好き好きに過ぎないって事ですか?

世の中でクラスベースが主流なのは何故?
処理系を実装しやすいのか? 静的な型チェックを厳密にできるからか? 単なる歴史的な経緯か?
世の中をclassifyしたがる人間の性か?

332 名前:デフォルトの名無しさん mailto:sage [04/02/04 13:09]
prototype-based の利点が活きるのは、設計が固まる前だと思う。
理想的な water fall で、固まった設計を実装するだけなら、静的な class-based のほうが強そう。
この場合、設計担当の人向きかな、とか。

333 名前:デフォルトの名無しさん mailto:sage [04/02/04 13:26]
>>331
世の中でクラスベースが主流なのは何故?
たまたま大手のソフトウェアベンダが採用したっていう
偶然的理由によるところも大きいんじゃないの?

>>332
開発方法論は言語ニュートラルなものとして作られてるけど
その実はかなり関係してるような印象を受けてる。
最近のものは殆どといっていい程、Java、もしくはC(オプソ?)を
想定したものばかりに見えるけど。。。

334 名前:デフォルトの名無しさん mailto:sage [04/02/04 13:31]
>>308
プロトタイプベースの利点も分からないのに、クラスベースではこうやる、
なんて出せるわけないだろ。

>>332
>理想的なwaterfallで、固まった設計を実装するだけなら、
>静的なclass-basedのほうが強そう。
クラスベースでwaterfallじゃない開発スタイルも存在すると思うんだけど。
>>>333が言うように、JavaとかCを想定したものが多いけどね。

クラスベースの方が直感的で分かりやすいからじゃないかな。
>>1はお怒りのようだからあんまり言いたくないけど、具体例が出てこないから
プロトタイプベースの言語や、開発スタイルがどういうモノなのかピンと来ないし。


335 名前:333 mailto:sage [04/02/04 13:35]
途中で送信しちゃった。

prototype-based言語が有用だとJava派の人に対して主張するなら、
具体的な事例はまだないので、その代りに具体的な開発のシナリオを
出す必要があると思うね。開発方法論のセオリーも含めてさ。
言語だけ純粋に見て、その審美性だけで判断するようなことをしても
現実には全然訴えかけるものがないよ。美的観点だけで普及するなら
関数型言語がとっくに広まってるだろうし。

336 名前:デフォルトの名無しさん mailto:sage [04/02/04 14:17]
>>335
> prototype-based言語が有用だとJava派の人に対して主張するなら、
> 具体的な事例はまだないので、

をい、>>282さんがあれだけ丁寧に・・・>>332さんも同じ主旨の事を言ってるが、
両方無視かいな。
そもそもJava派って何なんだよ。Java以外のクラスベースはカヤの外かいな。
動的型付クラスベース派はどうすりゃいいんだよ(藁


337 名前:デフォルトの名無しさん mailto:sage [04/02/04 15:00]
>>336
具体的な例が(ry…って意見がいくつも出てるんだから、十分な情報じゃないんだろ。


338 名前:デフォルトの名無しさん mailto:sage [04/02/04 16:36]
んー。
言語の実践的な有用性については、大手ベンダーがその環境向けの標準開発環境として
採用するかどうかということだけが問題だけなんで、このスレ的にはどうだろうか。。
ってのは333で既出か。

WEB 方面では JavaScript の他に Macromedia Flash の ActionScript でも prototype.__proto__ による
プロトタイプ継承が使われてますね(ECMA Script準拠なんで当然だけど)。

339 名前:デフォルトの名無しさん mailto:sage [04/02/04 17:51]
>>338
既出だがECMAScriptには__proto__なんてないし、ActionScriptでも6.0から
__proto__は非推奨属性だしそもそも最近のActionScriptはクラス指向だし。。。



340 名前:1 [04/02/04 18:41]
>>334
多分このスレに書き込んでいるほとんどの人はプロトタイプベースOOPL
を使った開発なんてまともにやったことないでしょう.(私も含めて)
Googleでちょっと検索してみればわかると思うけど,ECMAScript以外は
解説サイトすらなかなか見つからない.見つかったら是非教えて欲しい.
そんな状況で圧倒的多数のクラスベース派がプロトタイプベースの明確な
利点がわかる具体例を示せなんて言ってたって時間の無駄だと思う.

>プロトタイプベースの言語や、開発スタイルがどういうモノなのかピンと来ないし。
それはそうでしょう.私も知りたい.
資料もないし,経験者も少ないし.
自分で触ってみるしかないですよ.
触ってみてこれはいいんじゃないかって思ったり
やっぱり使えないっと思うことがあるなら,
そういった情報を共有しようじゃないですか.


341 名前:デフォルトの名無しさん mailto:sage [04/02/04 18:44]
要するに、まだ実用例は無いってことね。

342 名前:デフォルトの名無しさん mailto:sage [04/02/04 20:21]
Newton Message Pad 自体は商業的に失敗したわけだけど、
一応立派な実用例ではあると思う。

343 名前:デフォルトの名無しさん mailto:sage [04/02/04 21:01]
>>330
>それは優れたプログラマが小人数で
>開発するケースにしか使えないと思う。

それで良いんじゃないの?
使い道が分からない人間が無理に使う必要はないでしょ。

>>335
>prototype-based言語が有用だとJava派の人に対して主張するなら、

どちらかというと、Java 派の人にはどこか他所に行って欲しい。
というか過去レス嫁。審美性とか言っちゃって痛杉。

344 名前:デフォルトの名無しさん mailto:sage [04/02/04 21:09]
つまり prototype-based を使ってる俺は優れたプログラマなんですよ、と言いたいわけですね?

345 名前:デフォルトの名無しさん mailto:sage [04/02/04 21:18]
んにゃ。クラスベース言語に疑問を持たない人が興味を持っても、得る物は少ないから
どっか行けと言いたいだけ。

346 名前:デフォルトの名無しさん mailto:sage [04/02/04 21:33]
疑問を持ってるから来てるんだけど、具体例出してくれないんだもん。

347 名前:デフォルトの名無しさん mailto:sage [04/02/04 21:39]
クラスのない世界に興味ある椰子がネ申を囲ってマターリするスレでしょ。
クラスマンセーの人に押しつけもせず、クラスがないデメリットも含めて
冷静に語り合うスレでよいと思われ。

348 名前:デフォルトの名無しさん mailto:sage [04/02/04 21:43]
>>346
処理系の一つも自分で動かしてみようという気はないのか?
自分の疑問に思ったところを他の言語で実装し直してみれば立派な具体例だろう。
その言語はプロトタイプベースである必要も無い。

349 名前:デフォルトの名無しさん mailto:sage [04/02/04 21:46]
>>348
実際にやってみて「別にクラスベースでいいじゃん」と思っただけだが。



350 名前:デフォルトの名無しさん mailto:sage [04/02/04 21:49]
>>349
じゃぁクラスベースで良いんじゃない?
迷わず逝けよ。

351 名前:デフォルトの名無しさん mailto:sage [04/02/04 22:03]
>>346
どんな疑問ですか?
煽りだけど、まじめに答えてくれればなにかのネタになるかも。

352 名前:デフォルトの名無しさん mailto:sage [04/02/04 22:03]
OSchemeが面白そうだからやってみようと思ったら、ダウソできない・・
どっかで落とせませんか?


353 名前:デフォルトの名無しさん mailto:sage [04/02/04 22:07]
C#のdelegateって、プロトタイプとうかスロットぽい?

354 名前:デフォルトの名無しさん mailto:sage [04/02/04 22:12]
>>352
古いし、動かしてみてないけど。他の Scheme リポジトリも見てみて。

ttp://ftp.cs.indiana.edu/pub/scheme-repository/imp/

355 名前:352 mailto:sage [04/02/04 22:14]
自己解決
こっから落とせた
www.cs.indiana.edu/scheme-repository/imp.html

356 名前:352 mailto:sage [04/02/04 22:15]
>>354
ありがとう
同じとこだな(w

357 名前:1 mailto:sage [04/02/04 22:43]
>>353
スロットっていうと名前で参照できるメンバを動的に追加・削除できるようなイメージがあるけど.
マルチキャストデリゲートは機能の追加・削除が行えるけど名前に関しては静的だよね.


358 名前:1 mailto:sage [04/02/04 22:52]
class Hoge {
public delegate void PrintDelegate();
public PrintDelegate Print;
}
Hoge hoge = new Hoge();
hoge.Print += new PrintDelegate(_PrintHello);
hoge.Print += new PrintDelegate(_PrintBye);
hoge.Print();

スロットだとこんな感じ?
class Hoge {
}
hoge.PrintHello = _PrintHello;
hoge.PrintBye = _PrintBye;
hoge.PrintHello();
hoge.PrintBye();


359 名前:デフォルトの名無しさん mailto:sage [04/02/05 01:41]
ん。
んで slot の場合には、例えば
if a.hasSlot('asText') then
 write( a.asText() );
else
 write( "unknown object" );
みたいに、「無い」ということも積極的に使うスタイルになります。
DOM の attribute と似てる。



360 名前:デフォルトの名無しさん mailto:sage [04/02/05 13:42]
世の中には市場の失敗というのもありうるが、だいたいにおいて市場は良いものの方を選択するから、
結局のところ現状のプロトタイプベースより現状のクラスベースのほうが使いやすいのかも。
(一般的なプログラマにとっては)

一部の神にとっては全てを思い通りに動的にできるプロトタイプベースのほうがいいのかもしれんが。

361 名前:デフォルトの名無しさん mailto:sage [04/02/05 14:27]
>>340
> 多分このスレに書き込んでいるほとんどの人はプロトタイプベースOOPL
> を使った開発なんてまともにやったことないでしょう.(私も含めて)

プロトタイプベースは言語よりもむしろ環境として生きるものだと思うなあ。
スクリプトもいいけど、やっぱオブジェクトを記述するメディアとしては
テキストというのは不適合っつーかさ。

>>342
Smalltalk系で言えば、PARTSとかVisualSmalltalkとかあったなあ。
これはクラスベースの環境の上にプロトタイプベース環境を構築したものだから、
ハイブリッドだな。

362 名前:デフォルトの名無しさん mailto:sage [04/02/05 14:44]
>>360
> 結局のところ現状のプロトタイプベースより現状のクラスベースのほうが使いやすいのかも。

むしろ、現状を肯定する材料を無意識に探している人も多いんじゃないかと思われ。

クラスベースのほうがいいという理由として最適化を出した人がいるけど、
それで何パーセントパフォーマンスが上がるのか。その何パーセントかが
クリティカルになるシステムが一体どれだけあるのか。

クラスで整理したほうがいいと言いながら、
後になってから1つのクラスを2つのサブクラスに分割する時の手間は
「仕方ない」で済ませてしまう。動的型付ならともかく、静的型付で新しい
サブクラスに応じて型体系をきちんと見直して、インターフェイス型の
定義を洗い直して変数やメソッドの型を適切に修正したりするのは結構
無視できない量の作業のはずなのに。

そういったことを「言語のために負っている手間」と認識せずに
「本質的に仕方ないこと」と看倣している限りは、周りが皆動いてからで
ないと動かないんだろうな。

363 名前:デフォルトの名無しさん mailto:sage [04/02/05 15:05]
>362
そういったクラスによるデメリットも、プロトタイプベースの動的さ故に生まれるカオスよりは
マシだということなのかもしれない。
普通のプログラマには枠が有ったほうがいいのかも。あまりに動的だと乗りこなせない。


世の中、Smalltalk, C++, Java とクラスベースで来てるから、
単に流れでクラスベースなだけかもしれないけど。
Kay, Stroustrup, Gosling は何故クラスベースを選択したんだろう。好み?

364 名前:デフォルトの名無しさん mailto:sage [04/02/05 15:11]
正直、インターフェース型さえしっかり設計されてれば、
動的だろうが静的だろうが、クラスだろうがプロトタイプだろうが関係ないような。


365 名前:デフォルトの名無しさん mailto:sage [04/02/05 15:59]
>>363
> Kay, Stroustrup, Gosling は何故クラスベースを選択したんだろう。好み?

他の2人はともかく、Alan KayはSqueakのMorphでインスタンスベース風な
環境に取り組んでいるのですが・・・

366 名前:デフォルトの名無しさん mailto:sage [04/02/05 16:19]
>>362
・クラスベースの方が数倍は速い.(実行速度のことね)
・型付けされていればバグが減る.
ちなみに俺はクラスベースの方がいいとは思ってないが,
クラスベース<プロトタイプベースとも思ってない.

367 名前:デフォルトの名無しさん mailto:sage [04/02/05 16:41]
>>366
> ・クラスベースの方が数倍は速い.(実行速度のことね)

これは具体的に何と何の比較?SelfとSmalltalkでこの差が出る?
それともSelfとC++?

どっちかっつーと、クラスベース/プロトタイプベースの比較以上に
プリミティブ型や演算子などの扱いとかのほうが
直接パフォーマンスに効いてくるんじゃないかと思うが。
あと、VMかネイティブコンパイラかのほうが大きいかもしれない。

> ・型付けされていればバグが減る.

プロトタイプベースでも静的型付は可能でしょ。
ただ単に、プロトタイプベースの良さを引き出すためには
多くの言語が動的型付を採用しているというだけの話で。
実際、スロットの動的追加はsubtypingとして元の型のままと看倣せるし、
スロットの変更についても、代入と同様の型チェックを実行するだけの話では?
スロットの削除はコピー生成時からあるスロットに対してのみ削除を禁止して、
動的に追加されたスロットは削除してもいいと思うし。

368 名前:367 mailto:sage [04/02/05 16:55]
つーか、このスレって

(1) 既存のオブジェクト指向プログラミング言語/環境の比較として、
  クラスベースとプロトタイプベースのものに分けて比較する。

(2) オブジェクト指向プログラミング言語/環境を設計するための
  技術要素としてのクラスベース/プロトタイプベースの利点/欠点を
  比較する。

のうち、どっちなんだろ。

最初のころは「プロトタイプベース・スクリプト言語へのクラス導入ハンターイ」
という意見があったんで(2)もアリだと思っていたのだが、
もし(1)のみが焦点ならば、>>367はとんでもなく的外れになるわけだが。

369 名前:デフォルトの名無しさん mailto:sage [04/02/05 17:20]
つか
>実際、スロットの動的追加はsubtypingとして元の型のままと看倣せるし、
動的に追加したら、結局、動的に束縛しなきゃならないわけで、
静的型チェックによる速度向上なんか望めないような。。。




370 名前:デフォルトの名無しさん mailto:sage [04/02/05 17:22]
んー漏れは >>1 にあるように;
>オブジェクトを複製または継承によって生成を行う言語,
>プロトタイプベース・オブジェクト指向言語について語りましょうよ.
という趣旨で参加してますた。
だからクラス付き言語との比較の話は「スレ違いだけど、まぁ仕方ないか」って感じで。

371 名前:デフォルトの名無しさん mailto:sage [04/02/05 17:29]
漏れはクラスベースかプロトタイプベースかは、言語の優劣のような
ものとは無関係だと思うね。
「オブジェクト指向」を純化させると「プロトタイプベース」になる
というのは理解できるけれども、クラスという仕組みはやはり便利だし、
「プロトタイプベース」であることの利点を述べているつもりでも、
実はその言語が「動的変更をどれだけ許すか?」を語っているだけ
じゃないかと思うことが良くある。
そして「動的vs静的」は古来「柔軟性vs効率」の戦いになって不毛。


372 名前:デフォルトの名無しさん mailto:sage [04/02/05 18:02]
JavaScript でプロトタイプベースなOOやってみてるウェブサイトってないですか?

ttp://member.nifty.ne.jp/masarl/article/js-oop.html
ttp://www.tokumaru.org/JavaScript/
以外で。

JavaScriptなのは他にプロトタイプベース言語知らないから。
ドキュメント豊富なのってこいつくらいだよね。SelfだのNewtonScriptだのは全然見かけないし

373 名前:1 mailto:sage [04/02/05 19:16]
>>368 >>370
スレ違いではないと思うけど,あまりクラスベースと比較ばっかしてても
>>371の言う通りではないかなぁ.

# というか個人的につまらないだけですが…w


374 名前:デフォルトの名無しさん mailto:sage [04/02/05 19:54]
>>371
クラスベースでも動的変更は出来るから,
「クラスベース: 静的」「プロトタイプベース: 動的」とは言えない.
プロトタイプベースとクラスベースの本質的違いはそこではない.

375 名前:デフォルトの名無しさん mailto:sage [04/02/05 22:20]
本質とか純化とか優れているとかじゃなくて、もちっと具体的にうれしいのか
説明してくれると嬉しいんだが。RAD だのオブジェクトを触って変更できるって
動的言語なら大抵そうじゃない?オブジェクトを触るっていうけど、別にクラスベース
だって動的言語なら大抵オブジェクトを操作できますよね?一オブジェクトだけ
メソッド追加/変更とか。

理論的にシンプル(概念が少ないから)だから…というくらいしかわかんないなぁ。
で、とりあえずやってみりゃ分かるだろと思って Self ってのを試そうと
思ったんだが x86 じゃ動かないみたいだし。結局 2ch で聞いてしまうわけだ…。

376 名前:デフォルトの名無しさん mailto:sage [04/02/05 22:36]
動的なクラスベースっていうと・・
Smalltalk以外には何があるの?

377 名前:デフォルトの名無しさん mailto:sage [04/02/05 22:51]
そんなのいっぱいあるんじゃねーの?スクリプト系とか。Lisp 系も大抵そうだろう。
違いとかじゃなくてクラスベースだとマズーだけどプロトタイプだとウマーな点を指摘して
やればいいだけんじゃないのかと思われ。

378 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:10]
1オブジェクトだけメソッド追加/変更なんて出来るクラスベース言語ってあるのかな。。
クラス自体を新しく作って、オブジェクトのクラスを変更するんならともかく。

漏れ的にはプロトタイプベースの言語でも大抵なんでもできるんじゃないの、って立場なんで、
逆に 375 の人に「なんでクラス付き言語の方がいいの?」ってのを具体的に聞いてみたい。
広く使われていてライブラリが充実しているので Java がいい、とか、実行速度が速くて
ジェネリックスがやりやすいので C++ がいい、とかさ。

379 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:13]
もういっちょ。
プロトタイプベース言語はクラスベース言語の何かについての反省から生まれてきたわけではないし、
誰も「喪前らクラスベース言語はマズイですよ」とも言ってないわけだから、
「クラスベースだとマズー」→「プロトタイプベース言語でウマー」ってのが無きゃならない・あるはずだ、
ということはないと思うんだけど。



380 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:25]
>>375
> だって動的言語なら大抵オブジェクトを操作できますよね?一オブジェクトだけ
> メソッド追加/変更とか。

クラスベースできるけどその言語本来が狙っているやり方じゃないような。
純粋にクラスベースで1つのオブジェクトだけメソッドやイ変数を追加しようとしたら、
そのために動的にクラスを生成してそのクラスのインスタンスに化けるという操作
が必要になる。
じゃあその動的に生成したクラスの名前はどうするってこととか、どっかシステム中
に元のクラスを参照している部分があったらそこも変更しなきゃいけないのかとか、
結構面倒なことになる。

で、例えばクラス名は適当に番号か何かを付けて自動的に名前を生成しても、
そんな適当な名前がクラスライブラリに混入することはクラスベースで想定していた
「良いプログラミング」とはかけ離れたものになるんじゃないかな?

そういうクラス絡みの「やり難さ」を取り除くには、クラスでの定義とは独立して
メソッドや変数を追加できる機構が必要になると思われ。
俺的には、そういう機構さえあれば、別にクラスが存在していてもいいと思ってる。



381 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:31]
あ、そうなのか!どうやら漏れはとんでもない勘違いをしていたようだ…。
てっきり、クラスベースのなにかを反省して出来たのかと思ったけど、
そうじゃないわけね。うーむ、とりあえず試してみたいがなんか x86 で
動くやつのオススメをキボンヌ。

> 1オブジェクトだけメソッド追加/変更なんて出来るクラスベース言語ってあるのかな
例えば CLOS ではできたYO。基本はクラス単位だけどオブジェクト単位でも定義できる。
ついでにメソッドコンビネーションで特定のメソッドの前後に処理を追加するとかもできるのが面白い
と思った。つまり特定のオブジェクトのあるメソッドの前にだけ処理を挿入とかできるウマー。

ウマーな例:
このオブジェクトはユーザーが触ったやつだから消えるときは知らせよう→削除しますた表示をオブジェクトに追加


382 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:37]
ま、現実的な市場のニーズはないんだけどな。
漏れのような現場の土方には思考の訓練の道具ってだけだな


383 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:37]
>>369
> 動的に追加したら、結局、動的に束縛しなきゃならないわけで、
> 静的型チェックによる速度向上なんか望めないような。。。

いや、他のオブジェクトのメソッドからは、追加したメソッドは叩けないだろ。
静的型チェックしているから。

動的に追加したスロットは、一緒に動的に上書き変更したメソッドの中からしか
叩けないんじゃないかな。
で、それらのスロットを取り除く時には動的チェックするか、あるいは
一緒に動的に追加したスロット群全部をいっぺんに取り除くことにする
って感じでどうよ?
かなり窮屈なプロトタイプベースだが(苦


384 名前:381 mailto:sage [04/02/05 23:40]
>純粋にクラスベースで1つのオブジェクトだけメソッドやイ変数を追加しようとしたら、
>そのために動的にクラスを生成してそのクラスのインスタンスに化けるという操作
>が必要になる。

そんなことは無かったと思うけど…。
(defmethod hoge ((self クラス名)) ....)
(defmethod hoge ((self (eql オブジェクト))) ...)
こんだけなんで、単にメソッド検索時にオブジェクト>クラスな
優先順位になってただけじゃないかなと思われ。

でもクラスがどうのとかはいいからプロトタイプベースの処理系を
オススメしてくれょぅ。触ってみたいんだよぅ。Self が動かなくて
悔しいんだよぅ。x86 で動かせるやつ。OS は Win か Linux か *BSD くらいで。

385 名前:デフォルトの名無しさん [04/02/05 23:42]
JavaScript

386 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:48]
>>381
プロトタイプベース言語は、オブジェクト指向言語の一派というよりも、
ミンスキーのフレーム理論の直接の形式化で、
「オブジェクト」ではなく「フレーム」を基本的なデータ構造としています。
ttp://www.symlab.sys.i.kyoto-u.ac.jp/lecture/ai/ai.PDF
のp38あたりからを参照。

387 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:50]
それがオススメですか。んじゃ遊んでみます。
一応年のため聞くけど、処理系は IE とか Mozilla でいいんですよね?

388 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:53]
>>384
上の方にリンクが載っているが、Io とか Cecil なら x86 でも動くはず。
Win で Cecil 動かしてる人がいるから参考まで。

ttp://www.kmonos.net/alang/etc/cecil.php

389 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:54]
>387ってずいぶん信じやすい香具師なんだな。



390 名前:デフォルトの名無しさん mailto:sage [04/02/05 23:56]
ん。すくなくとも Self の論文は Smalltalk を引き合いにクラスベースの不自然さを
淡々と説いているが…? ただ、結果としてはこのスタンスがまずかった。
オブジェクトベース(aka プロトタイプベース)がまるでクラスベースの対局だという
ような考え方を一般に植え付けてしまったから。

プロトタイプベースって言葉が悪いんだよね。おそらくここで意見を交わし合うべきは
オブジェクトベース(あるいはクラスを意識するならインスタンスベース)のオブジェクト vs
クラスベースのオブジェクトなのであろうかと思うのですが、いかがでしょうか?>1さん

つまり、オブジェクトが自由に値スロットやメソッドスロットを追加できるとき、どんな
メリット(やデメリット)があるのかとか、スロットへのアクセスにはどんな方法がベターか
とか、そんな話で盛り上がった方がおもしろいと、まあ、そんなふうに思うわけです。

プロトタイプベースとくくってしまうと、オブジェクトの移譲先としてプロトタイプが良いか、
クラスが良いかという結局、好みの問題に終始してしまうので不毛かなと。

391 名前:1 mailto:sage [04/02/05 23:56]
>>381
ここにあるSelfのcygwin版,動かないんだよねぇ…
www.gliebe.de/self/index.html

とりあえず,Cecilなんてどうでしょうか?
www.cs.washington.edu/research/projects/cecil/www/Release/
Interpreterをダウンロードして展開すればすぐに遊べますよ.
ここでも見ながら→www.kmonos.net/alang/etc/cecil.php
俺はまだほとんど使ってないけど…コレはかなり楽しそう.


392 名前:1 mailto:sage [04/02/06 00:03]
>>388 マッタリしてたら被ってしまった.ゴメン.
つかレス速っw

>>390
>プロトタイプベースって言葉が悪いんだよね。おそらくここで意見を交わし合うべきは
>オブジェクトベース(あるいはクラスを意識するならインスタンスベース)のオブジェクト vs
>クラスベースのオブジェクトなのであろうかと思うのですが、いかがでしょうか?>1さん
激しく同意です.
ただ私は無知なのでなかなか積極的に話題振ったりできませんが…


393 名前:デフォルトの名無しさん mailto:sage [04/02/06 00:08]
なんというか,クラスベースよりプロトタイプベースの方が純粋にオブジェクト指向
してるとは思えないなぁ.
クラスがない方が自然なの気がするけど,それ以上にプロトタイプのチェインは
不自然な概念だと思う.

394 名前:デフォルトの名無しさん mailto:sage [04/02/06 00:10]
開発環境を聞こうと再び 2ch を覗いたら、なんだ、他にもいっぱいあるじゃないか。
>>389 ちょっと前でも JavaScript って話だったじゃないか……正直 age に騙された。
お前らいい香具師らじゃないか。遊んでみるYO!!

で、>>386 のを脳内解釈したところ、
×クラスベースがあってそれをほにゃほにゃしてプロトタイプベースができた
○プロトタイプベースを実現した。で、クラスと比較して〜
という理解でいいのかな。

395 名前:デフォルトの名無しさん mailto:sage [04/02/06 00:16]
まず,純粋な(クラスもプロトタイプチェインもない)オブジェクトがあって,
でもそれでは,1つ1つのオブジェクトが同じメソッドをバラバラに持ってるのは
効率が悪いから,プロトタイプやらクラスやらが導入されたんじゃないの?

396 名前:デフォルトの名無しさん mailto:sage [04/02/06 00:21]
>>390>>392 に同意
やっぱ焦点はオブジェクト単位のスロット管理のpros/consだわな。
つまり>>384さんの流れで言うと、CLOSもインスタンスベースとしての機能「も」
持っているわけで。


397 名前:デフォルトの名無しさん mailto:sage [04/02/06 00:23]
>>384
何度か出ているけど、CLOS をクラスベースの引き合いに出すのは混乱するから
やめたほうがよいと思いますよ。CLOS のオブジェクトは、スロットこそクラスベース
のオブジェクトと同様にクラスを鋳型にしていますが、メソッドのほうは総称関数という
まったく別の機構で扱われているわけで、誤解を恐れずいうなら、これは抽象データ型
だとかオブジェクト指向とかいった次元を超越した機構なわけですから。

398 名前:380 mailto:sage [04/02/06 00:35]
>>384
まぎらわしい書き方してすまんです。>>380での「純粋にクラスベースで」とは、
「クラスが管理しているスロット定義情報のみで」という意味のつもりでした。
ので、>>834で挙げてもらったCLOSでの例は「純粋にクラスベースで」には
含めないつもりでした。

で、>>381に挙げてもらった例には大枠で賛成です。
特に、言語レベルでbeforeやafterが使えるのはイイねえ。

399 名前:380 mailto:sage [04/02/06 00:43]
>>390
> つまり、オブジェクトが自由に値スロットやメソッドスロットを追加できるとき、どんな
> メリット(やデメリット)があるのかとか、スロットへのアクセスにはどんな方法がベターか
> とか、そんな話で盛り上がった方がおもしろいと、まあ、そんなふうに思うわけです。

もうちょい厳密に言うと、それを言語仕様または処理系レベルでサポートすることの
メリット/デメリットということで、どうでしょうか?

そういうオブジェクトを構築できるかどうかということになると、
クロージャを扱える言語/処理系ならば、そういうクラス/オブジェクトを
ユーザの手で作ることができるわけで、それではむしろデザインパターンと
変わらなくなるような気がするので。




400 名前:380 mailto:sage [04/02/06 00:44]
>>397
> メソッドのほうは総称関数という
> まったく別の機構で扱われているわけで、誤解を恐れずいうなら、これは抽象データ型
> だとかオブジェクト指向とかいった次元を超越した機構なわけですから。

でもマルチメソッド萌え・・・スレ違いスマソ。


401 名前:デフォルトの名無しさん mailto:sage [04/02/06 01:05]
>>399
まあ、それは言わずもがなでしょう。オブジェクト指向におけるオブジェクトの
オールマイティ性(と、同時にそれが苦手とすること)ってのは Smalltalk システムが
早々と明らかにしてしまっていますから、ことさらにここでそれを強調する必要もなかろうかと。

そんなことを言い出したら、Lisp 屋さんが出てきて、そんなのオブジェクトなんか使わんでも
俺たちならもっと巧くやれる!ってなことになりかねない(笑)。

402 名前:デフォルトの名無しさん mailto:sage [04/02/06 01:11]
>>399
スレの流れ的には大賛成だが、

>クロージャを扱える言語/処理系ならば、そういうクラス/オブジェクトを
>ユーザの手で作ることができるわけで、
こっちの方が超ステキ!(キラン

403 名前:デフォルトの名無しさん mailto:sage [04/02/06 12:20]
>>207
Smalltalkでプロトタイプベースとは、おめでてぇや。
Selfが動くVMイメージ持ってるの?

404 名前:デフォルトの名無しさん [04/02/06 12:36]
>>402
禿同

405 名前:デフォルトの名無しさん mailto:sage [04/02/06 14:08]
でもクロージャでオブジェクト作るの結構メンドイんだよな.

406 名前:デフォルトの名無しさん mailto:sage [04/02/06 17:00]
>403

   、ミ川川川彡                 ,ィr彡'";;;;;;;;;;;;;;;
  ミ       彡              ,.ィi彡',.=从i、;;;;;;;;;;;;
 三  ギ  そ  三            ,ィ/イ,r'" .i!li,il i、ミ',:;;;;
 三.  ャ  れ  三    ,. -‐==- 、, /!li/'/   l'' l', ',ヾ,ヽ;
 三  グ  は  三  ,,__-=ニ三三ニヾヽl!/,_ ,_i 、,,.ィ'=-、_ヾヾ
 三  で       三,. ‐ニ三=,==‐ ''' `‐゛j,ェツ''''ー=5r‐ォ、, ヽ
 三.   言  ひ  三  .,,__/      . ,' ン′    ̄
 三   っ  ょ  三   /           i l,
 三.  て   っ  三  ノ ..::.:... ,_  i    !  `´'      J
 三   る  と  三  iェァメ`'7rェ、,ー'    i }エ=、
  三   の   し  三 ノ "'    ̄     ! '';;;;;;;
  三   か  て  三. iヽ,_ン     J   l
  三  !?    三  !し=、 ヽ         i         ,.
   彡      ミ   ! "'' `'′      ヽ、,,__,,..,_ィ,..r,',",
    彡川川川ミ.   l        _, ,   | ` ー、≡=,ン _,,,
              ヽ、 _,,,,,ィニ三"'"  ,,.'ヘ rー‐ ''''''"
                `, i'''ニ'" ,. -‐'"   `/
               ヽ !  i´       /
               ノレ'ー'!      / O


407 名前:デフォルトの名無しさん mailto:sage [04/02/07 00:08]
このスレではプロトタイプベースの作り方なんて話も OK なんですか?
辞書でも用意して、名前と値をぽんぽん追加してくだけでいいんかな。

408 名前:1 mailto:sage [04/02/07 20:15]
>>407
クラスベースでプロトタイプベースを実現する方法ですか?
それともプロトタイプベース言語の実装方法?
どっちにしても興味深いですね.


409 名前:デフォルトの名無しさん mailto:sage [04/02/07 22:05]
え、そうかな。基本的にハッシュでも用意して名前に対応する値や関数を
突っ込むだけでしょ?で、オブジェクト複製用のオペレータがあれば
一応プロトタイプベースデキタ!くらいならスクリプト系言語なら簡単に
できません?他にも何かいるのかな?



410 名前:デフォルトの名無しさん mailto:sage [04/02/07 22:16]
>>409
委譲機構

411 名前:デフォルトの名無しさん mailto:sage [04/02/07 22:25]
委譲するオブジェクトのリストでも持っといて、自分のスロットに
見つからなかったらそっちから順番に検索…とかじゃ駄目っすかね?

412 名前:n [04/02/08 00:08]
class Proto
attr_accessor :slot,:proto,:mixin
def initialize; @slot = Hash.new; @proto = nil; @mixin = Array.new; end
def inherit; obj = Proto.new; obj.proto = self; return obj; end
def call(key); if @slot.key?(key) then @slot[key].call else self.proto.call(key) end;end
def set(key,val); @slot[key]=val; end
def get(key)@slot[key]end
end

foo = Proto.new
foo.set "foo",proc{puts"foo"}
foo.set "hello",proc{puts"Hello,Foo!"}
bar = foo.inherit
bar.set "bar",proc{puts"foo"}
bar.call("foo")
bar.call("hello")
hoge = bar.inherit
hoge.set "hello",proc{puts"Hello,Hoge!"}
fuga = hoge.inherit
fuga.call("foo")
fuga.call("hello")
foo.call("hello")
こんな感じですか?

413 名前:デフォルトの名無しさん mailto:sage [04/02/08 00:10]
なにが?

414 名前:デフォルトの名無しさん mailto:sage [04/02/08 00:20]
>>3-4
聞いたこともない言語ばかりだなぁ

415 名前:デフォルトの名無しさん mailto:sage [04/02/08 03:23]
>>411-412
たとえば、call でそのメソッドを起動したとき、レシーバの get "foo" が "foo" なら "yes"、
そうでなければ "no" と答える "is_foo?" というメソッドスロットを foo に追加できますか?

416 名前:デフォルトの名無しさん mailto:sage [04/02/08 03:53]
追加される proc の側で追加先のオブジェクトを参照できる必要があるね。
python みたいに proc の引数に明示的に self 相当のものが。

417 名前:デフォルトの名無しさん [04/02/08 06:21]
>>405 それは、ひょっとしてギャグで言ってるのか!?
>>406 意味不明過ぎ。

418 名前:デフォルトの名無しさん [04/02/08 06:34]
なんかポインター見失っちゃったんだけど、
Squeak上で動くSelfとか、Smalltalk無しで動くSelfとか、
Sunの研究部門が数年前に出してたっけ?もしかして。

419 名前:デフォルトの名無しさん [04/02/08 06:42]
あ、Self 4.1〜4.2が1,2年前に出たのか。

10年近く前に探しに行った時は、
・Smalltalk VMが必要なバージョンとか、
・Sparc上で動くバイナリしかなくて、
ダウンロードしても実行に困った覚えがあったっけ。

今はMac上に移植されてるのか。おまぃら、いい時代に生きてますね

research.sun.com/research/self/
--------------------------------------------------------------------------------
Self 4.2
Self 4.2 is the most recent public release (June 2003). It features the optimizing compiler on the PowerPC. Jump here to find out more.
--------------------------------------------------------------------------------
Self 4.1
Self 4.1.6 was the most previous public release (September 2002). It runs on the Macintosh as well as on machines from Sun Microsystems, Inc. Jump here to find out more.
--------------------------------------------------------------------------------
Self 4.0
Self 4.0 was a previous public release (July 1995). Jump here to find out more.




420 名前:デフォルトの名無しさん mailto:sage [04/02/08 13:07]
Pythonってクラスベースに入るの?
classといってもオブジェクト生成関数みたいなもんだよね?

421 名前:デフォルトの名無しさん mailto:sage [04/02/08 13:15]
> Pythonってクラスベースに入るの?
Yes.

> classといってもオブジェクト生成関数みたいなもんだよね?
Yes.

ところでPythonはインスタンス固有のメソッド(Rubyでいう特異メソッド)
を作れるのに、多分誰も利用してませんね・・・。

422 名前:420 mailto:sage [04/02/08 13:24]
>>421
俺は結構使ってる.だからクラスベースって言われるのに違和感があった.
こういうのもクラスベースに入るんだね.

423 名前:n [04/02/08 14:54]
>> 415
class Proto
attr_accessor :slot,:proto
def initialize; @slot = Hash.new; @proto = nil end
def inherit; obj = Proto.new; obj.proto = self; return obj end
def call(key,*arg)
if @slot.key?(key) then
return @slot[key].call(self,*arg)
else
obj = self
while obj = obj.proto; if obj.slot.key?(key) then return obj.slot[key].call(self,*arg) end end
end
end
def set(key,val); @slot[key]=val; end
def get(key)@slot[key]end
end

foo = Proto.new
foo.set "foo","foo"
foo.set "is_foo?",lambda{|this|this.get("foo") == "foo" ? "yes" : "no"}
puts foo.call("is_foo?") #=>"yes"
bar = foo.inherit
bar.set "foo","bar"
puts bar.call("is_foo?") #=>"no"
ちょっと強引ですが、こうすればレシーバのメソッドも呼べます。

424 名前:デフォルトの名無しさん mailto:sage [04/02/08 16:35]
>>423
乙。bank_account を組んでみました。

bank_account = Proto.new
bank_account.set "get_balance", proc{|this| this.get "balance"}
bank_account.set "set_balance", proc{|this, x| this.set "balance", x}
bank_account.call "set_balance", 200
bank_account.set "deposit", proc{|this, x| this.call "set_balance", (this.call "get_balance") + x}
bank_account.call "deposit", 50 => 250
bank_account.set "withdraw",
proc{|this, x| this.call "set_balance", [0, (this.call "get_balance") - x].max}
bank_account.call "withdraw", 100 => 150
bank_account.call "withdraw", 200 => 0

my_account = bank_account.inherit
my_account.call "set_balance", 100 => 100
my_account.call "deposit", 50 => 150
my_account.call "withdraw", 100 => 50

425 名前:デフォルトの名無しさん mailto:sage [04/02/08 16:36]
>>424
続き、
stock_account = bank_account.inherit
stock_account.set "get_num_shares", proc{|this| this.get "num_shares"}
stock_account.set "set_num_shares", proc{|this, x| this.set "num_shares", x}
stock_account.call "set_num_shares", 10
stock_account.set "get_price_per_share", proc{|this| this.get "price_per_share"}
stock_account.set "set_price_per_share", proc{|this, x| this.set "price_per_share", x}
stock_account.call "set_price_per_share", 30
stock_account.set "get_balance",
proc{|this| (this.call "get_num_shares") * (this.call "get_price_per_share")}
stock_account.call "get_balance" => 300
stock_account.set "set_balance",
proc{|this, x|
this.call "set_num_shares", Float(x) / (this.call "get_price_per_share")
this.call "get_balance"}
stock_account.call "deposit", 60
stock_account.call "get_num_shares" => 12.0

426 名前:デフォルトの名無しさん mailto:sage [04/02/08 21:12]
>>421-422
どうやって作るの?データは簡単に作れるけどメソッドの追加ができん……

427 名前:デフォルトの名無しさん mailto:sage [04/02/08 21:14]
まったくPythonは素晴らしいね。
Rubyとかいう出来損ないの言語とちがって。

428 名前:デフォルトの名無しさん mailto:sage [04/02/08 21:22]
荒れるからやめれ。

429 名前:デフォルトの名無しさん mailto:sage [04/02/08 21:48]
ヤバイ。 Ruby ヤバイ。まじでヤバイよ、マジヤバイ。Ruby ヤバイ。
まずオブジェクト指向。もうただのオブジェクト指向なんてもんじゃない。純粋オブジェク指向。
オブジェクト指向といとかっても「基本型は別なんでしょ?」とか、もう、そういうレベルじゃない。
何しろ全部オブジェクト。スゲェ!なんか特別扱いとか無いの。数値も文字列も全部オブジェクト。
<!-- しかも他の言語をリスペクトしてるらしい。ヤバイよ、(パク)リスペクトだよ。
だって普通は他の言語をリスペクトしといて機能取り込んだ後叩くとかしないじゃん。
だってリスペクトしたって事はどっちかっつーと恩があるわけじゃん。
リクペクトしといてあとてやーいやーいザマーみろとか言わないっしょ。だから普通はリスペクト元の言語貶したりしない。話のわかるヤツだ。
けど Ruby はヤバイ。そんなの気にしない。貶しまくり。
他言語から心底ウザがられても「悔しがってる」「負けおしみですか?」とかよくわかんないくらい信者強気。ヤバすぎ。 -->
オブジェクト指向っていったけど、もしかしたらオブジェクト指向が最後のパラダイムかもしんない。でも最後って事にすると
「じゃあ、Ruby 最強?」
って事に<!-- 信者の脳内では-->なるし、それは誰も止められない。ヤバイ。誰にも止められないなんて凄すぎる。
あと超ユーザビリティ高い。end で終るから。shift 押さなくて良いんだって。ヤバイ。凄すぎ。括弧は最悪インデントは基地外。怖い。
それに超拡張モジュール書きやすい。GC のおかげらしい。参照カウントとかすると拡張モジュール内でその辺気にしなきゃいけないじゃん?でも Ruby は平気。C スタックとか平気でスキャンしてくれる。C スタックて。小学生でも直接操作しねぇよ、最近。
でも Ruby は全然平気。 C を C のまま扱ってる。凄い。ヤバイ。
とにかく貴様ら、Ruby のヤバさをもっと知るべきだと思います。
そんなヤバイ Ruby で作られたアプリケーションとか超偉い。もっとがんばれ。超がんばれ。



430 名前:デフォルトの名無しさん mailto:sage [04/02/08 21:58]
コピペ厨キターーー微妙に主旨がバラバラな内容なのがヘタレだな

431 名前:デフォルトの名無しさん mailto:sage [04/02/08 22:12]
先日Rubyを齧ってみました。
確かにうんこの味がしました。
Rubyはうんこです。
間違いありません。
Rubyなんて大層な名前はやめて、○んこと改名すべきです。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<368KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef