[表示 : 全て 最新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


766 名前:デフォルトの名無しさん mailto:sage [04/12/29 15:52:03]
>>765
プログラム内で一個しか作らないモノのクラスをつくるのと
プログラム内で一個しか作らないモノのオブジェクトをつくるのと、
何が違う?

767 名前:デフォルトの名無しさん mailto:sage [04/12/29 16:04:22]
>>766
singleton でぐぐるように

という誘導は置いておいて、例えば Web ページ上にボタンが配置されているときに、
そのボタンにメソッドを追加するのはプロトタイプベースのほうがやりやすいよな

768 名前:デフォルトの名無しさん mailto:sage [04/12/29 16:08:25]
静的言語か動的言語かが決定的な分水嶺であって、
クラスが動的な存在であれば、POOもCOOも大した違いはないんじゃないかと。
COOではお仕着せのクラス機構の代わりに、POOではシンプルな委譲機構が提供されているというだけで。

POO知らずにJavaScriptやったとき、「なんじゃこの手抜きなOO機構わ。ハハハ」と思った記憶があります。
それを踏まえてPOOのメリットって言うと、どうなんだろう。

769 名前:デフォルトの名無しさん mailto:sage [04/12/29 16:12:03]
>>767
singleton くらい知ってるわヽ(`Д´)ノウワァァァーン!!
わざわざsingletonなんてしないで無名クラスでやりゃ、
どのみち定義書いてオブジェクトにセットするって手間は変わらんだろっつってんだよ。
おまけにJava/C#なら型チェックもしてくれるぞ。

770 名前:デフォルトの名無しさん [04/12/29 16:18:59]
CLOS and MOP 最強伝説。

771 名前:デフォルトの名無しさん mailto:sage [04/12/29 16:19:53]
ダスキンの掃除用具ですか?>クロスとモップ

772 名前:デフォルトの名無しさん mailto:sage [04/12/29 16:20:19]
>>762
プログラムは作成者の意思を反映させるものという観点からして、
オブジェクトを直接記述できるプロトタイプベースのほうが
クラスを介してしか記述できないクラスベースよりも
その意思を直接反映させることができる、

ということにも気付かないのかなあ。
あいかわらず過去ログでの議論にも目を通してなさそうだし。

773 名前:デフォルトの名無しさん [04/12/29 16:29:03]
c++ぽくやるとすれば中間言語で…

774 名前:デフォルトの名無しさん [04/12/29 16:32:39]
>>772
それはつまり、>>763の最終行でFA、ということでよろしいか?
Aranskのような脳味噌クラス漬けが大半を占める世の中ではメリットとは言えまいて。



775 名前:デフォルトの名無しさん mailto:sage [04/12/29 17:36:46]
>>774
> それはつまり、>>763の最終行でFA、ということでよろしいか?

全然違うよ。
むしろプロトタイプベースの良いところはdirty hackingな状況で発揮される。
モデルがsimple&cleanであることと、記述が直接的であることは全然別問題。


776 名前:デフォルトの名無しさん mailto:sage [04/12/29 17:41:09]
>>775
クラスベースは「設計図から機械を作る」のに対し、
プロトタイプベースは「いっぱいあるジャックにプラグを色々組み合わせていく」イメージとか妄想してみると

クラスベースのほうが綺麗に作れるけど、プロトタイプベースのほうがごちゃごちゃしているが簡単に作れる?

777 名前:デフォルトの名無しさん [04/12/29 18:17:25]
>>775
dirty hackingな状況で発揮されるってことは、
書ける・書けないってとこが最重要で、それもさっくり書けるところがポイントだと思うが、
>>769の通り、クラスが動的なら、クラスベースもプロトタイプベースもさほどの違いはないのではないか?

778 名前:デフォルトの名無しさん mailto:sage [04/12/29 18:22:35]
JavaのMathクラスはクラスの意味が無い

779 名前:デフォルトの名無しさん mailto:sage [04/12/29 18:23:25]
>>778
ツールキットだからな

780 名前:デフォルトの名無しさん mailto:sage [04/12/29 18:25:20]
>>778
class の意味は『分類』だから、別にオブジェクト指向に縛られてなくてもいいんじゃないか?

781 名前:1 mailto:sage [04/12/29 18:45:49]
既に動いてるオブジェクトを使ってプログラミングする時なんか
プロトタイプベースだと綺麗に記述できると思います。
使ったことないけどDOMで便利だっていうのはそういうことですよね。

例えばEmacs Lispなどのいじくり回す必要があるアプリレベルを叩く言語とか。
システムを一から作り上げるのはクラスベースの方がいいかもしれないけど、
システムを表面から操作するのはプロトタイプベースの方がスマートだと思います。
システムの上で別のシステムを動かすことまで考えると一概には言えませんけど。

Smalltalkがクラスベースなのはそのせいかなぁ。
システム記述とシステム操作の言語を統一することを考えた場合、
プロトタイプベースよりクラスベースの方が良さそうだということかなぁ。
それともプロトタイプベースなど考えつかなかったのか。



782 名前:デフォルトの名無しさん mailto:sage [04/12/29 18:51:42]
>>781
> システムを一から作り上げるのはクラスベースの方がいいかもしれないけど、
> システムを表面から操作するのはプロトタイプベースの方がスマートだと思います。

その通りだと思う。
あるいは、記述するだけならプロトタイプベースのほうがhandyでdirectに記述できる。
が、他人に理解してもらおうと思ったらクラスベースのほうが整理しやすいんじゃないかな。

> Smalltalkがクラスベースなのはそのせいかなぁ。
> システム記述とシステム操作の言語を統一することを考えた場合、
> プロトタイプベースよりクラスベースの方が良さそうだということかなぁ。
> それともプロトタイプベースなど考えつかなかったのか。

Kay的には、例えばeToysのようにクラスベース上にインスタンスベースな環境を
構築すればいいだけという(無意識の)見切りがあったんじゃなかろうかと思う。
だが、一般のOO屋は、そこにあるクラス群こそがSmalltalkだと思ってしまった
のではないかと。

783 名前:デフォルトの名無しさん [04/12/29 18:55:21]
ごちゃごちゃ言わんと優れたソフトウェア&システムを作れってことだ。
思想や書き方云々は金にならん。

784 名前:デフォルトの名無しさん [04/12/29 19:50:41]
ごちゃごちゃ言わんと、コードで示せ!


>>783
2chで文句垂れてても金になりませんよ。



785 名前:デフォルトの名無しさん mailto:sage [04/12/29 19:58:13]
>>784
You show: theCode

786 名前:デフォルトの名無しさん mailto:sage [04/12/30 16:13:19]
javascript>>>>>>>>>>>>>>>>>>>>>>>プ(ry

787 名前:デフォルトの名無しさん mailto:sage [04/12/30 19:20:55]
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

788 名前:デフォルトの名無しさん mailto:sage [04/12/30 20:13:59]
>>787
おい、Ruby よりも低級な言語が存在していないぞ

789 名前:デフォルトの名無しさん mailto:sage [04/12/30 21:13:00]
787 名前: デフォルトの名無しさん [sage] 投稿日: 04/12/30 19:20:55
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 788 名前: デフォルトの名無しさん [sage] 投稿日: 04/12/30 20:13:59
>>787
おい、Ruby よりも低級な言語が存在していないぞ


790 名前:デフォルトの名無しさん mailto:sage [04/12/30 21:16:37]
787 名前: デフォルトの名無しさん [sage] 投稿日: 04/12/30 19:20:55
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 788 名前: デフォルトの名無しさん [sage] 投稿日: 04/12/30 20:13:59>>787
おい、Ruby よりも低級な言語が存在していないぞ

791 名前:デフォルトの名無しさん [04/12/31 08:21:43]
Rubyキチガイ顔真っ赤記念晒しage

792 名前:Aransk [04/12/31 17:49:02]
無茶苦茶レベルを落として申し訳ないが
Ioってどうしたら日本語通じるの?
「Io>」プロンプトのあと色々と
やってみたがどうもうまく行かない。
アドオンを付加すれば一応ユニコード
OKみたいなことをHPには書いてあるよう
だけど…。


793 名前:Aransk [04/12/31 19:24:13]
ちょっとレベルを上げます。
どうも良く分からないんですが、プログラミング
パラダイムそのものを考えた場合に
「main メソッドの喪失」
ってどうなんでしょうねぇ。
これはプロトタイプ言語だけではなく
スクリプト系言語全般に言えることで
すが、プログラムの構造化の観点からすれば
逆流はしてますよね。












794 名前:デフォルトの名無しさん mailto:sage [04/12/31 20:28:48]
>>793
当たり前だろ? 構造化とは逆方向を行くのが関数指向や論理指向、もろもろの非手続き指向なんだし
それから、構造化がプログラムの質を上げるというのは必ずしも正しいことじゃないよ



795 名前:デフォルトの名無しさん mailto:sage [04/12/31 20:43:36]
……なんか俺変な事言ったような気がする
ぬるーよろ

796 名前:689 mailto:sage [04/12/31 22:00:05]
>793
main メソッドが消失しているのではなく、トップレベルがmain メソッドに
なっているだけのこと。
スクリプト系は頭から逐次処理されることを想定しているから、
わざわざスタート地点を指定する必要が無いだけですな。

メリット
・プログラムするときに、逐次処理部分と定義部分を分けて考える必要が無い
・処理系を作るのが(逐次処理だけで済むので)ラク

デメリット
・(どの部分をあらかじめ処理していいのかのヒントが少なくなるので)
 最適化しにくい

純粋関数型でも同様だと思う。


797 名前:デフォルトの名無しさん mailto:sage [04/12/31 22:50:11]
main についてはその通りだと思うが、関数型言語の中でも Haskell は main
という関数を定義しないと動かないし、結局は処理系の設計者がどう考えて設
計したか、ってだけだと思うんだがな。

つうかAranskにマジレスしても無駄。

798 名前:デフォルトの名無しさん mailto:sage [05/01/01 03:56:59]
>>797
> 結局は処理系の設計者がどう考えて設
> 計したか、ってだけだと思うんだがな。

だよね。
少なくともOOやクラスベース/プロトタイプベースとは直交した概念だと思う。


799 名前:Rubyist! [05/01/01 13:46:26]
おめーらがやってる批評もどきのRubyに対する足引っ張りはな、
十把一絡げの愚図Java,C++,Perlみたいなカス言語フリーク野郎が
Ruby作者matzのような結果を出した人間と自分との格差を認められず
おこがましくも精神的に一矢報いようとするために
仰々しく「批評」とか名付けた浅ましい自己主張で攻撃して
自尊心を慰めてるにすぎない。

実際問題として、お前みたいな奴が考えてるほど
批評された側の役に立ってるわけがないだろ?ボケが。
その口から出るクソが誰かに感謝でもされたか?ああ?
自意識過剰甚だしいんだよ、この自己愛のボケ奴隷が。
数倍マシ?寝言は寝て言えよこの恥知らず野郎。
ネットで万能感むき出しにしてオナってんじゃねーよ。

批判する野党が重要だぁ?プ
公明党にでも投票してろ白痴野郎。

800 名前:デフォルトの名無しさん mailto:sage [05/01/01 16:25:47]
>799
すみません、SELF, NewtonScript, IO, soopy マンセーなんですけど……
(実際に使っているわけじゃないけどね……)
>3-4見た?


801 名前:デフォルトの名無しさん mailto:sage [05/01/01 16:32:54]
>>799
3行目まで読んだ。
>Ruby作者matzのような結果を出した人間

「ような」だと、係る部分が不確かなので、「ように」のほうがいいと思われ。

802 名前:Aransk [05/01/01 17:07:48]
>メリット
>・プログラムするときに、逐次処理部分と定義部分を分けて考える必要が無い
>・処理系を作るのが(逐次処理だけで済むので)ラク
逐次処理と定義部分がごっちゃになって可読性に欠けることが
一つさらに、
処理系に対しても負荷が大きいような気がします。
つまりmainを無くしたことのメリット、デメリットを
冷静に見る必要があると思う次第です。
(RubyやMatzに対して特に含むところはありません。
くれぐれも誤解しないで下さい。)




803 名前:デフォルトの名無しさん mailto:sage [05/01/01 17:40:11]
>>802
> 逐次処理と定義部分がごっちゃになって可読性に欠けることが

「定義する」という動作を逐次処理しているだけの話でしょ。

> 処理系に対しても負荷が大きいような気がします。

どうして?詳細きぼん、ってaranskに言ってもしょうがないか。

804 名前:デフォルトの名無しさん [05/01/01 21:46:47]
>既に動いてるオブジェクトを使ってプログラミングする時なんか
>プロトタイプベースだと綺麗に記述できると思います。
具体例きぼんぬ
妄想で終わらせると机上の空論で終わるよ。

rubyにmainがあろうがなかろうが変わらないでしょ。
最初に必要な全ての関数(クラス)定義を一度読み込まなきゃいけない。
あるいは、関数が現れたら探さなきゃいけない。
rubyだと、ある関数が呼ばれた時にそれがどこの記述されているかを
探さなきゃいけないんで、(最悪見つからないことも・・・)
結局のところ、一番最初にがばって読み込んでから、
処理を開始するのが普通のやり方だと思うけど。

>逐次処理と定義部分がごっちゃになって可読性に欠けることが
そんなことは言語仕様で定めなくても、誰もやらん。

>処理系に対しても負荷が大きいような気がします。
気のせいだろ。

個人的にはJavaの言語仕様がスマートでかっこいい。



805 名前:689 mailto:sage [05/01/02 03:00:35]
>802
>逐次処理と定義部分がごっちゃになって可読性に欠けることが
ああ、スマン。確かに可読性は落ちるけど、書くのがラクなのよ。
取りあえず動くもの作って、その後にリファクタリングで可読性を上げる
というXPチックなことがやりやすいのですな。

あと、C++なんかだとよくやるけど、「使う直前で定義する」つうのも
やりやすくなるよ。定義したものの有効範囲が狭い場合は、むしろ
こっちの方が可読性が高い。


>処理系に対しても負荷が大きいような気がします

そう?
最適化しづらいつうのはあるかもしれないけど、負荷に関しては
こんなところに依存しないと思うけど……

>RubyやMatzに対して特に含むところはありません。
世の中のスクリプト言語って、大抵トップレベルがmain じゃなかったっけ?


806 名前:689 mailto:sage [05/01/02 03:06:16]
>804
>結局のところ、一番最初にがばって読み込んでから、
>処理を開始するのが普通のやり方だと思うけど。

Rubyも全ソースを構文木に加工してから実行するタイプだと思うけど……



807 名前:デフォルトの名無しさん mailto:sage [05/01/02 16:33:11]
rubyだったらスクリプトの末尾に main(*ARGV) if $0 == __FILE__ で十分だと思うけど。

反例として、main関数が必須なスクリプト言語を挙げておくと、pikeがあります。
モジュールやクラス毎にmain関数を定義するのはpythonやJAVAでもよくありますが、
pikeでは、main関数(というよりも、トップレベルに宣言以外のコードを書けないと言う制約)をうまく使い、
プログラム単位で拡張/再利用出来る仕組みを保証しています。

inherit "hello_world";
int main(int argc, array(string) argv) {
write("Hello world version 1.1\n");
return ::main(argc,argv);
}
上の例では、"hello_world.pike"スクリプトを拡張したprogramを作っています。
(rubyなら)requireすればいいのでは、と思われるかも知れないけど、
ここでは、クラスと同じようにprogramも拡張できるという特徴に注目して下さい。

"program"は、pikeでは、コンパイルされたpikeスクリプトを表す型で、
classやobjectと同じようなデータ型のひとつとして扱われています。
pikeでは、programを継承すると、そのprogramのトップレベルで定義した
グローバル変数はインスタンス変数に、関数はメソッドとして扱う様にする事が出来ます

勿論、クラスと同様にインスタンスを作成する事も可能です。
プログラム全体が class { ... } で囲まれている様な感じ、もしくは
JAVAのトップレベルの class 宣言を暗黙的に扱ってると考えるとわかりやすい。

要は、module,class,objectをまとめてハッシュ・データ構造に抽象化してる所、
スロットもjavascript等と同じように、ハッシュ要素の構文糖衣。例 obj.foo == obj["foo"]

808 名前:807 mailto:sage [05/01/02 16:56:29]
-- 807の続き

他の言語で類似例を挙げれば、
例えば、Prothonでもモジュールとオブジェクトの差異をなくすことで、
importしたモジュールをそのままオブジェクトとして扱う事を可能にしていますね。
クラスとオブジェクトのをフラットな関係にしたように、
モジュールもオブジェクトにしてしまえば区別する必要がなくなる。
プロトタイプベースと呼んでいいものかどうかわかりませんが、
実装を考えれば自然な発想で、プロトタイプベースに通じるものがあると思います。

話をmain関数に戻します...。

main関数がある(かつ クラスとモジュールの境界がない)と、pike の様に
トップレベルに書かれたコードをclassに見立てて再利用する事が可能になります。
トップレベルに全て書いてしまうと、モジュールとして呼ばれた時にコードが実行されて
しまう為、
プログラム単位での再利用が難くなります。

もっとも、main関数がなくても自分で定義すれば済む話なので、
後はモジュール化さえしっかりしていれば、実際に困る事は殆んどありません。
多くのスクリプト言語では、プログラムがモジュールとして要求されたのか、
単体でよばれたのかを明示的にチェックする事でこの問題を回避しています。

トップレベルがmainな場合の利点は周知のようなので割愛。
main関数のある言語でのプロトタイプっぽい事例ということで、無理矢理繋げてみました。

809 名前:デフォルトの名無しさん mailto:sage [05/01/02 17:40:46]
>>808
> プロトタイプベースと呼んでいいものかどうかわかりませんが、
> 実装を考えれば自然な発想で、プロトタイプベースに通じるものがあると思います。

モジュールはコピれないところがちょっと厳しいけど、
オブジェクト的なエンティティの直接記述という意味では
確かにプロトタイプベース的だよな。

810 名前:デフォルトの名無しさん mailto:sage [05/01/15 15:32:03]
思ったんだけど、プロトタイプベースの真髄を「クラスを必要としないオブジェクトの生成」にあるとすると、
別にクラスベースとオブジェクトベースが相反する概念ってわけじゃないんじゃないか?

クラスから生成したインスタンスをプロトタイプベース並みに改変できるというわけで
クラス=型とみなしての型付けは、やりにくいかもしれないが

811 名前:デフォルトの名無しさん mailto:sage [05/01/15 16:25:05]
>>810
それクラスベースの意味がないと思う。
プロトタイプでも「設計図を渡してそれに沿ったオブジェクトを返す」ってルーチン作ればいいだけだし

812 名前:デフォルトの名無しさん mailto:sage [05/01/15 16:25:46]
javascriptが丁度そんな感じ

813 名前:デフォルトの名無しさん mailto:sage [05/01/15 16:36:00]
>>811
> それクラスベースの意味がないと思う。

どうして?

> プロトタイプでも「設計図を渡してそれに沿ったオブジェクトを返す」ってルーチン作ればいいだけだし

つーか、それってクラスがfirst class objectなOO言語(例えばSmalltalk)そのものじゃん。

814 名前:デフォルトの名無しさん mailto:sage [05/01/15 16:50:03]
>クラスから生成したインスタンスをプロトタイプベース並みに改変できるというわけで
それRubyの特異メソッド(クラス)




815 名前:デフォルトの名無しさん mailto:sage [05/01/17 01:17:36 ]
メソッド起動に関していえば、インスタンスベースとクラスベースの違いは、
オブジェクトがクラスに委譲せずに起動可能なメソッドを持てるかどうかに
尽きます。

816 名前:デフォルトの名無しさん mailto:sage [05/01/17 02:39:52 ]
Rubyが実用とは程遠いことがよくわかった

817 名前:デフォルトの名無しさん mailto:sage [05/01/17 19:14:28 ]
じゃあPythonも一緒?

818 名前:デフォルトの名無しさん mailto:sage [05/01/19 20:28:30 ]
なんかクラスベースとプロトタイプベースの区別がわかんなくなったので、
「実行前にオブジェクトの挙動が決定されるかどうか」
って線引きをしてみたんだけど合ってる?

すると、ruby なんかのスクリプト系がまたよくわかんなくなるんだけど、如何なものか

819 名前:デフォルトの名無しさん mailto:sage [05/01/19 22:07:57 ]
>>818
それは「静的か動的か」の線引きでは?

820 名前:818 mailto:sage [05/01/19 22:19:57 ]
>>819
クラスをコードとして記述できるかどうかの意味で引いてみた
インスタンスをコードに記述することはできないやん

821 名前:デフォルトの名無しさん mailto:sage [05/01/19 23:39:34 ]
何いってんだかさっぱりわからんよ

822 名前:1 mailto:sage [05/01/20 00:19:16 ]
私はソース上のプリミティブな要素がクラスなのかインスタンスなのかを
基準と考えておりますがどうでしょうか。

823 名前:デフォルトの名無しさん mailto:sage [05/01/20 08:14:59 ]
>>822
つまり、実行機構および言語機能による分類ではなく、言語表現による分類であると。
なかなか興味深いと思います。
今まで出てきたプロトタイプベースの特性について、その分類がどのように関与するか
検討してみると面白いかもしれません。

1. 実行時メソッド変更
2. 実行時スロット拡張
3. 実行時プロトタイプ変更

824 名前:デフォルトの名無しさん mailto:sage [05/01/20 14:18:23 ]
>>822 >>823

オブジェクト指向って、まだ良くわかんないんだけど
その話題はなんとなく面白そうなので、もっと展開してほすぃ。



825 名前:デフォルトの名無しさん mailto:sage [05/01/21 09:37:40 ]
別の視点で、継承の実装方法による分類ってのもあったな.

(A) Cloning
(B) 実行時(メソッドのinvoke時)に親から探してくる
(C) コンパイル時に親から探してくる

他には、実行効率と柔軟性の両方を考慮した、実行時にコンパイルする実装もあるけど、
要点は、Cloning or Look-up, オブジェクトが循環構造になるか階層構造をとるかって辺りにあると思う。

(B)の実装では、以下のような概念を導入してプロトタイプ的な柔軟性を実現している
・first class object, meta class
・instance specifit behavior
・dinamically lookup

それに対して、(A)の実装では、これらは設計上自然に備わっている特徴として捉える事が出来る。

826 名前:818 mailto:sage [05/01/22 12:39:40 ]
>>822
なんか、微妙に俺が考えてたものとニアミスしている気がする
俺はつまり、クラスを記述できちゃったらクラスベースと考えたわけだが

827 名前:823 mailto:sage [05/01/22 14:25:14 ]
>>826
俺的には、クラスを記述できるかどうかはあまり本質ではないと思う。

俺は逆に、任意のオブジェクトを1つのリテラル表現として記述できるかどうかが
インスタンスベース言語であるかどうかを判断する表現上の基準になるんじゃないかと
思うのだが。

828 名前:デフォルトの名無しさん mailto:sage [05/01/22 19:52:57 ]
プロトタイプベース初心者です。
www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/p/self/self.html
このへんを読むと、プロトタイプベースの言語では、あるインスタンスの
スロットを探してメソッドがなかったら、その親のスロットを捜しに行くように
読めます(これがプロトタイプチェーン?)。
素人目には、こんなことをしなくても、clone()の時点でスロット全部コピー
すればよさそうに思えるのですが、この動作の利点は何なんでしょうか?
a)スロットのメモリ領域を節約できる(微々たるもんだよなー)
b)親のメソッドを差し替えたり、親にメソッドを追加したとき、
 子からも新しいのを使うことができる。
程度しか思いつきません。
b)は、正直、「こんなことやっちゃっていいの?」と思います。
対話的なプログラミングなら嬉しいかもしれないけれど。


829 名前:デフォルトの名無しさん mailto:sage [05/01/22 19:58:48 ]
プロチ初心者というよりは動的言語初心者未満だな。

830 名前:818 mailto:sage [05/01/22 20:01:41 ]
>>827
え〜!?

「newobj = obj.Clone();」とかやっても、インスタンスを記述したことにならないやん
インスタンスは変数の裏に隠れて移動するだけだし

リテラルとして考えると、「1」とか「"text"」とかは確かに記述できるけど、
それはクラスベースでもプロトタイプベースでも、あまり変わらないし

任意のオブジェクトを記述できる手段として“クラス”があると捕らえているのよ
それを 1st class object と捕らえるとか、そういう話云々は別として

831 名前:828 mailto:sage [05/01/22 20:50:26 ]
>>829
まあそうなんでしょうねえ。

読み返していたら、>>58を見付けました。

> 画面にたくさんのテキストフィールドがあって、
>それのイベントハンドラをいっせいに切り替えるようなこと。
>画面のモードによって、いっせいにフィールドの挙動を変えるようなこと。

たとえば画面上のボタンを押した時点でこういう挙動を起こしたければ、
「スロットまるごとコピー方式」だけじゃうまくいきませんね。

832 名前:デフォルトの名無しさん mailto:sage [05/01/22 22:44:26 ]
>>830
基本的に分かっちゃないくせにぶっちゃう莫迦だなコイツ。放置の方向か?

833 名前:818 mailto:sage [05/01/22 23:03:49 ]
>>832
ああ、俺が馬鹿なのは否定できないし、スルーしても別にかまわないし、
そういえば 827 と 830 は微妙に話が噛み合ってないと今更突っ込みたくもなったけど、

基本的に、リテラルを除けば
「記述できるインスタンス」と「記述できないクラス」は存在しないとは思っている

834 名前:デフォルトの名無しさん mailto:sage [05/01/22 23:10:33 ]
>828
IOのcloneはスロット全部コピーするらしいよ。

効率を考えると全部コピーした方がいいけど、b)の柔軟性も
魅力的。

個人的にはcloneは全コピーで、それとは別にdelegateが
あったほうがいいなあ。



835 名前:828 mailto:sage [05/01/22 23:24:44 ]
>>834
>IOのcloneはスロット全部コピーするらしいよ。

え、そうなの?
俺、↓読んで、てっきり逆だと思ってました。

sumim.no-ip.com:8080/wiki/493
| 実手続きとしてチャイルドを作るときに clone(あるいは clone() )を
| 使用できるものと、clone は copy(shallow copy)と同義で、
| 単にプロトタイプの複製を作るだけのものがありまぎらわしい。
| 実は Io を除き、ほとんどの言語は後者で、むしろこのほうが一般的。
| つまり、我々が一般にイメージするクローン(じつはチャイルド)を
| clone で作ることはできない。


836 名前:デフォルトの名無しさん mailto:sage [05/01/22 23:27:44 ]
>>835
shallow copy って事は、スロットを複製しない浅いコピーって解釈で良いんじゃない?
Io は前者、つまり clone でスロットも複製するって感じで

837 名前:デフォルトの名無しさん mailto:sage [05/01/23 00:46:44 ]
何のための proto かと

838 名前:デフォルトの名無しさん mailto:sage [05/01/23 00:56:56 ]
まあ2chじゃよく見るわけだが。
>>829とか>>832とか>>837とか、具体的なことを何も言わずに、1行かそこらのレスで
何か偉そうなことを言った気になれる奴ってのは楽でいいね。

オレモナー

839 名前:デフォルトの名無しさん mailto:sage [05/01/23 01:27:54 ]
>>834
全部コピーはしてないよ。
proto スロットにプロトタイプとなるオブジェクトが入れられて、
スロットが見付からない際に利用される。

hoge := Object clone
piyo := hoge clone

hoge greet := method("hello" print)
piyo greet # "hello"

hoge greet = method("hoge!!" print)
# ↑コピーするなら、これは効かないはず
piyo greet # "hoge!!"

# piyo の持つスロットは proto 唯一つ。

840 名前:デフォルトの名無しさん mailto:sage [05/01/23 05:01:29 ]
>>828
スロットをコピーするといっても、実態を全部コピーするわけではなく、
その参照をコピーするだけに留めるとクローン生成時のコストは抑えられる。
スロット追加時に、その参照から実態を複製しそこに新しいスロット追加する。


841 名前:823 mailto:sage [05/01/23 07:34:46 ]
>>830
> 「newobj = obj.Clone();」とかやっても、インスタンスを記述したことにならないやん

・・・
そういうのを排除するためにわざわざ「リテラルで」という限定詞を入れたんだけど。

> リテラルとして考えると、「1」とか「"text"」とかは確かに記述できるけど、
> それはクラスベースでもプロトタイプベースでも、あまり変わらないし

例えば、
cat = object {
mew(times) { self.make_sound("mew") }
walk(direction, distance) { self.dir = direction. self.move(distance) }
...
}
みたいな話ができてやっと「インスタンスベース」と言えるんじゃないか、って話な。


842 名前:デフォルトの名無しさん mailto:sage [05/01/23 07:44:00 ]
>>841
javascriptならそれでできるぞ

843 名前:823 mailto:sage [05/01/23 09:22:03 ]
>>842
ですよね。そういうのをインスタンスベース(あるいはプロトタイプベース)と呼ぶのが
言語表現上の分類として適切なのではないかと。

844 名前:デフォルトの名無しさん mailto:sage [05/01/23 09:56:09 ]
rubyもできるぞ

str = "string"



845 名前:デフォルトの名無しさん mailto:sage [05/01/23 10:11:28 ]
>>844
文字列以外のオブジェクトは?

846 名前:823 mailto:sage [05/01/23 10:20:27 ]
>>844
> str = "string"

そういうのを排除するために「任意のオブジェクトを」1つのリテラル表現として
記述できるかどうか、と書いたのだが。

847 名前:デフォルトの名無しさん mailto:sage [05/01/23 10:47:50 ]
>>841
こういうのもリテラルと呼ぶのか

cat = object(
mew(times) { self.make_sound("mew") },
walk(direction, distance) { self.dir = direction. self.move(distance) },
...
);

848 名前:デフォルトの名無しさん mailto:sage [05/01/23 10:52:58 ]
>>836
ちゃう、ちゃう。ここで“前者”はディープコピーではなくて、チャイルド(プロトチェーンに
委譲する、俗に“クローン”と呼ばれているもの)を作ること。Io は clone でチャイルド
を作るけど、SELF などは clone でチャイルドを作らずにシャローコピーを作るってこと。

849 名前:デフォルトの名無しさん mailto:sage [05/01/23 10:57:38 ]
>>846
>>815じゃ駄目なの? これに尽きると思うけど。

850 名前:デフォルトの名無しさん mailto:sage [05/01/23 11:15:20 ]
javaのMathはオブジェクトを直接書いてるように見える。
メソッドも自己完結してる

851 名前:デフォルトの名無しさん mailto:sage [05/01/23 11:25:42 ]
>>850
ぜんぶstaticやん。Mathはネームスペースを提供しているだけだがな。

852 名前:823 mailto:sage [05/01/23 12:14:39 ]
>>849
>>815はメッセージ送信の実行機構による分類でしょ。
もちろんそれはそれで1つの正しい分類だしそれに異存はない。
が、今は言語表現による分類をするとしたら、という話をしているわけ。


853 名前:823 mailto:sage [05/01/23 12:15:58 ]
>>850
javaのMathで「任意の」オブジェクトをリテラル表現できるわけ?
リテラルってのは定数表現だよ、念のため。

854 名前:デフォルトの名無しさん mailto:sage [05/01/23 12:30:45 ]
>>841
字面を見る限り、Javaの無名クラスとどう違うのかって気が…



855 名前:823 mailto:sage [05/01/23 16:47:52 ]
>>854
> 字面を見る限り、Javaの無名クラスとどう違うのかって気が…

だからさ、そこがポイントなわけよ。
Javaの無名クラスはあくまでクラスでしょ。
それをインスタンスに対してできてこそのインスタンスベースじゃない?

856 名前:デフォルトの名無しさん mailto:sage [05/01/23 17:09:42 ]
>Javaの無名クラスはあくまでクラスでしょ。

んー、それはJavaがクラスベースな言語なんだから当然の話であって、
こういう書き方ができるかどうかって事と、
クラスベースかインタスタンスベースかって事は直交した問題なんじゃ?

857 名前:818 [05/01/23 19:08:46 ]
>>841>>854-856
>例えば、 
>cat = object { 
>mew(times) { self.make_sound("mew") } 
>walk(direction, distance) { self.dir = direction. self.move(distance) } 
>... 
>} 
>みたいな話ができてやっと「インスタンスベース」と言えるんじゃないか、って話な。

実は、やっとココで >>818 の話に繋がるんです
仮に cat に代入されるオブジェクトが『実行時、今まさに作られるのならば』インスタンスベース
しかし、オブジェクトを生成する為の“メタオブジェクト”と呼べるものが『既に作られていたのならば』クラスベース
では無いかと思ったわけで

858 名前:デフォルトの名無しさん mailto:sage [05/01/23 19:09:17 ]
すまん age ちまった許して……っていうか石投げないで……

859 名前:823 mailto:sage [05/01/23 19:12:17 ]
>>856
> >Javaの無名クラスはあくまでクラスでしょ。
>
> んー、それはJavaがクラスベースな言語なんだから当然の話であって、

でしょ。
だったら、インスタンスベース言語ならそういう表現ができて当然なんじゃない?


860 名前:デフォルトの名無しさん mailto:sage [05/01/23 19:14:31 ]
>>859
少なくとも Io でそういう表現は出来なかったと思う

861 名前:823 mailto:sage [05/01/23 19:15:42 ]
>>857
> 実は、やっとココで >>818 の話に繋がるんです
> 仮に cat に代入されるオブジェクトが『実行時、今まさに作られるのならば』インスタンスベース

実行時に生成されるかコンパイル時に定数として生成されるかで振舞いが変わるかな?
いずれにせよ、そのオブジェクトの動作はリテラルとして記述された通りなわけで。


862 名前:823 mailto:sage [05/01/23 19:17:03 ]
>>860
> 少なくとも Io でそういう表現は出来なかったと思う

まあそういう例もあるだろうね。
その場合はプロトタイプを使ってオブジェクトを生成するしかないから、
インスタンスベースとプロトタイプベースを区別したほうがいいのかも。

863 名前:818 mailto:sage [05/01/23 19:23:05 ]
>>861
>実行時に生成されるかコンパイル時に定数として生成されるかで振舞いが変わるかな? 
あ、↑みたいに言った方が良かったかも ^-^;

件のコードは、
「object まで到達した時点でオブジェクトが作成され、次いで mew と walk が接続され、そして cat に代入される」
……なら、実行時に作ったということでインスタンスベース
「object まで到達した時点で、既に完成されたオブジェクトが生成され cat に代入される」
……なら、クラスベース
ということで

864 名前:デフォルトの名無しさん mailto:sage [05/01/23 19:36:40 ]
>>862
おいおい。自説大事に生粋のインスタンスベースを例外扱いかよ。
真性だな。



865 名前:デフォルトの名無しさん mailto:sage [05/01/23 19:40:28 ]
>>862
プロトタイプベースとインスタンスベースとオブジェクトベースは
同じものの別の呼び名です。念のため。

866 名前:818 mailto:sage [05/01/23 19:44:09 ]
そういえば俺が見た本の中には
『プロトタイプベース』『クラスベース』『オブジェクト指向』がそれぞれ違う概念として紹介されて棚w

クラスが無ければプロトタイプベース、
継承しなければクラスベース、
継承してればオブジェクト指向

ってな感じに。俺は違和感あった






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

前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