- 1 名前:デフォルトの名無しさん [03/12/08 21:30]
- オブジェクトを複製または継承によって生成を行う言語,
プロトタイプベース・オブジェクト指向言語について語りましょうよ. 関連リンク >>2
- 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 クラスが無ければプロトタイプベース、 継承しなければクラスベース、 継承してればオブジェクト指向 ってな感じに。俺は違和感あった
- 867 名前:デフォルトの名無しさん mailto:sage [05/01/23 19:49:30 ]
- 無名だろうとクラスにメソッドを定義しないといけないのならクラスベースだよ。
シンタックスの妙でインスタンスベースっぽさを名乗るのは勝手だが。 インスタンス特異と見せかけて特異クラスを使うRubyの特異メソッドもしかり。
- 868 名前:デフォルトの名無しさん mailto:sage [05/01/23 20:03:36 ]
- >>867
んじゃこれどう見る? class Hoge begin proc void Fuga begin 〜 end; end; これがインスタンスベースだって言ったら怒る? この場合はルートのオブジェクトに対して class メッセージを送ってみたんだが すると、Hoge という名のクラス (1st class object) が生成される、という仕組み
- 869 名前:デフォルトの名無しさん mailto:sage [05/01/23 20:05:32 ]
- >>866
まあとにかく、経験則のみで既存概念の再定義をやたら試みようとするのが オブジェクト指向界隈の悪しき慣習だから、オリジナルペーパーや出典を明らか にしない解説の類は眉唾で読まないとね。自分が紹介したり解説している考え方 の出所すらしらずに文章を書いて(カネまでもらってw)いるヤツのなんと多いことか。
- 870 名前:デフォルトの名無しさん mailto:sage [05/01/23 20:10:44 ]
- >>869
>自分が紹介したり解説している考え方の出所すらしらずに >文章を書いて(カネまでもらってw)いるヤツのなんと多いことか。 だって、全部自分の「再発明」なんだもん・・・
- 871 名前:デフォルトの名無しさん mailto:sage [05/01/23 20:15:25 ]
- >>868
classメソッドはどこに定義されているの?
- 872 名前:デフォルトの名無しさん mailto:sage [05/01/23 20:18:52 ]
- >>871
ルートオブジェクト ちなみに、ルートオブジェクトはこの言語の世界が生まれたときには既に存在していました つまり神に相当するオブジェクトです ……ま、でっちあげの脳内言語だけどな
- 873 名前:868 mailto:sage [05/01/23 20:22:14 ]
- 肝心なのは、クラスとインスタンスの間に越えられない壁が有るという事……なのか?
この当たりはよく分からん
- 874 名前:デフォルトの名無しさん mailto:sage [05/01/23 20:26:53 ]
- >>872
じゃあインスタンスベースでいいけど、脳内じゃな… w そもそもHogeとかFugaとか関係ないし。わけわかめ。
- 875 名前:デフォルトの名無しさん mailto:sage [05/01/23 20:45:18 ]
- >>874
うん。脳内。 だけど、基盤は出来てるから class メソッドをちゃんと組み込めばいいだけ。 面倒だからやりたくないけど。
- 876 名前:デフォルトの名無しさん mailto:sage [05/01/23 21:46:04 ]
- 面倒なのがクラスベース
お気軽なのがプロトタイプベース 適当なのがインスタンスベース
- 877 名前:デフォルトの名無しさん mailto:sage [05/01/23 21:49:59 ]
- クラスベース⇔オブジェクトベースだと思ってたけど。
- 878 名前:デフォルトの名無しさん mailto:sage [05/01/23 22:16:50 ]
- >>859
>> んー、それはJavaがクラスベースな言語なんだから当然の話であって、 >でしょ。 >だったら、インスタンスベース言語ならそういう表現ができて当然なんじゃない? 「でしょ」じゃなくってさあ。 クラスベースの言語でも、無名クラスのような表現ができるのとできないのとがあるように、 インスタンスベースの言語でも、こういう表現ができるのとできないのがあっていい。 だから、この表記ができるかどうかの問題と、その言語がインスタンスベースであるか どうかの問題は、直交している、って言ってるの。
- 879 名前:デフォルトの名無しさん mailto:sage [05/01/23 22:19:10 ]
- >>878
『直交』という表現よりも『ニアミス』というか『次元がズレている』っていう表現の方がよくないか? まぁ、書き方は幾らでも考え付くんだ そのなかで『プロトタイプベースって一体何?』って話だよな?
- 880 名前:デフォルトの名無しさん mailto:sage [05/01/23 23:33:57 ]
- >>877
だから対立した考え方じゃないんだってば。クラスベースで、インスタンスが自前の メソッドや属性を自由にできない…という制約をといたのが、インスタンスベースだ。
- 881 名前:デフォルトの名無しさん mailto:sage [05/01/23 23:41:50 ]
- >>876
くどいようですが、インススタンスベースとプロトタイプベースは同じものです。 プロトタイプベースというと、プロトタイプの複製でオブジェクトを生じさせること やプロトタイプチェーンによる委譲といった、特徴だけど、本質ではないところ のみ取りあげて、やたらクラスベースと対比させたがる人が多いので困ります。
- 882 名前:デフォルトの名無しさん mailto:sage [05/01/23 23:45:35 ]
- >>881
『複製でオブジェクトを生じさせる』 を 『クラスに因らないオブジェクト生成』 だと解釈すれば本質だと思うけど
- 883 名前:デフォルトの名無しさん mailto:sage [05/01/24 00:04:49 ]
- それぞれ視点が違うだけなのに困られても・・・。
- 884 名前:デフォルトの名無しさん mailto:sage [05/01/24 00:36:32 ]
- >>882
いや。それが本質じゃないだってば…。orz
- 885 名前:デフォルトの名無しさん mailto:sage [05/01/24 00:44:58 ]
- >>883
プロトタイプの語感からくる間違った認識で議論されるのは困ると思う。 だからインスタンスベースかオブジェクトベースと呼ぼう! A Theory of Object でもオブジェクトベースって言っているしね。 tinyurl.com/3tnke
- 886 名前:823 mailto:sage [05/01/24 12:07:41 ]
- >>863
> 「object まで到達した時点で、既に完成されたオブジェクトが生成され cat に代入される」 > ……なら、クラスベース クラスは存在せず、プロトタイプからコピーする場合でも、クラスベースと呼ぶ?
- 887 名前:823 mailto:sage [05/01/24 12:09:08 ]
- >>865
はい。それ承知の上で、あえて区別分類してみようかと。 というのも、インスタンスベースだからといってプロトタイプという概念が 必然かどうかはまだ議論の余地があると思っています。
- 888 名前:823 mailto:sage [05/01/24 12:12:16 ]
- >>868
> これがインスタンスベースだって言ったら怒る? > この場合はルートのオブジェクトに対して class メッセージを送ってみたんだが > すると、Hoge という名のクラス (1st class object) が生成される、という仕組み クラスが存在する時点でクラスベースとおもわれ・・・ というか、それがインスタンスベースだと言うのならSmalltalkはインスタンスベース?
- 889 名前:823 mailto:sage [05/01/24 12:14:10 ]
- >>878
> クラスベースの言語でも、無名クラスのような表現ができるのとできないのとがあるように、 > インスタンスベースの言語でも、こういう表現ができるのとできないのがあっていい。 もちろん、一般的な定義としてのインスタンスベースならば、その通り。 今議論しているのは、言語表現としてインスタンスベースあるいは プロトタイプベースを定義するのならば、どういう基準になるのだろうか という話。
- 890 名前:823 mailto:sage [05/01/24 12:15:31 ]
- >>880
じゃ、rubyはインスタンスベース? Smalltalkにもいくつかインスタンス毎にメソッド定義できる環境があったけど、 そういうのもインスタンスベース?
- 891 名前:デフォルトの名無しさん mailto:sage [05/01/24 12:26:13 ]
- >>890
Rubyの特異メソッドはインスタンスに定義しているようにみせて、 実は特異クラスという見えない無名クラスに定義しています。 したがって、セマンティックス的にはクラスベースです。 シンタックス的にはインスタンスベースっぽいと言っても構わないでしょう。 Smalltalkの例もしかりです。とにかく、実質クラスにメソッドを定義 しなければならなければクラスベースです。
- 892 名前:デフォルトの名無しさん mailto:sage [05/01/24 12:49:09 ]
- rubyだとクラスってオブジェクトの1種じゃなかったっけ
- 893 名前:デフォルトの名無しさん mailto:sage [05/01/24 13:01:00 ]
- >>892
RubyもSmalltalkもクラスはまた別のクラスのインスタンスです。 Rubyは特異メソッドでクラスメソッドを“持っている”ように見えますが これも特異クラスの暗黙の介在が必要です。したがって、こうしたクラスも それ自体が自身で起動できるメソッドを持てているわけではないのです。
- 894 名前:823 mailto:sage [05/01/24 13:25:32 ]
- >>891
> Smalltalkの例もしかりです。とにかく、実質クラスにメソッドを定義 > しなければならなければクラスベースです。 いや、Smalltalkの例の場合には、インスタンスにスクリプトをつけられる環境で、 それは無名クラスではなく、インスタンスがスクリプトのメソッド辞書を持っていた。 また、pythonの場合には特異クラスではなく、これまたオブジェクトのスロットに 直接バインドできる。 rubyはよく知らん。
- 895 名前:デフォルトの名無しさん mailto:sage [05/01/24 15:34:14 ]
- >>894
インスタンスにメソッドをバインドできても、それを起動するための しくみをクラスに仕込まなければならないならば、結局は同じことです。 繰り返しになりますが、そうした機構をもってインスタンスベース的と 宣伝するぶんには差し支えないと思います。 Pythonにはインスタンスベースの素養が十分あると言って良いと思います。
- 896 名前:823 mailto:sage [05/01/24 15:47:59 ]
- >>895
> インスタンスにメソッドをバインドできても、それを起動するための > しくみをクラスに仕込まなければならないならば、結局は同じことです。 いや、スクリプトを書く側にとっては、クラスに一切の変更を加えることなく 新しいメソッドを追加できた。
- 897 名前:デフォルトの名無しさん mailto:sage [05/01/24 16:39:29 ]
- >>896
ですから、くどいようだけどそれはRubyの特異メソッドと同じこと。 ユーザーは特異メソッドを使うにあたって特異クラスを意識する 必要は必ずしもないわけだから。ユーザーがクラスの介在を意識しないで 済んでしまうような計らいがあるとき、それはインスタンスベースだと 言い切るのなら、それはそれで構わないと思う。ただ、無用な議論を避ける ために、但し書きは必要でしょうけど。 「自分はシンタックスにおいてインスタンスベースなら、それの言語・ 処理系はインスタンスベースだと解釈する立場だ」…とかね。
- 898 名前:823 mailto:sage [05/01/24 16:45:36 ]
- >>897
> 「自分はシンタックスにおいてインスタンスベースなら、それの言語・ > 処理系はインスタンスベースだと解釈する立場だ」…とかね。 いや、俺の立場がどうこうという問題じゃなくて、 今議論しているのは言語表現上(syntaxだけではなく、constructsの問題)で クラスベースとインスタンスベース(あるいはプロトタイプベース)を区別する 基準はできないだろうか、という話なんだが。 できれば>>822あたりからの流れを読んでもらえると助かる。
- 899 名前:デフォルトの名無しさん mailto:sage [05/01/24 17:26:08 ]
- 結局、
クラスを用いてオブジェクト生成に重みを置くなら「クラスベース」 クラスを用いないオブジェクト生成に重みを置くなら「インスタンスベース」 で良いんじゃない? クラスからのオブジェクト生成後の変更可能性は生成になんら関わらないし、 インスタンスベースが“クラス”オブジェクトを持っていてはいけないという規定も無いし。 自称・他称が違うこともあるだろうが仕様が無い。
- 900 名前:デフォルトの名無しさん mailto:sage [05/01/24 20:18:54 ]
- んで、インスタンスベースのうち、プロトタイプチェーンを持っているのが
「プロトタイプベース」? プロトタイプへの参照を持たず、いっそcloneもできないインスタンスベースの 言語って考えられないわけじゃないよね。現実にあるかどうかは知らんけど。
- 901 名前:デフォルトの名無しさん mailto:sage [05/01/24 21:46:36 ]
- C言語でオブジェクト指向するかの様に、
インスタンスベースやプロトタイプベースでクラス指向する、 って言い方もできるわけだよな。 構文糖衣の差や、クラスの探索等を組み込みでやるか、 自力でやるか程度の違い。 どこで線引きするかなんて個人の解釈でしかない。 この議論は無意味だ。
- 902 名前:1 mailto:sage [05/01/24 22:07:56 ]
- >>901
あなたにとって無意味かもしれないけど少なくとも私にとっては無意味じゃありませんね。 「プロトタイプベース」「インスタンスベース」についてはこのスレを見てもわかるように 言葉の定義がまだはっきりしていません。 (誰かが定義したしないという話ではなく広く一般に知れ渡った定義がはっきりしていないということ) それを手探りで徐々に輪郭を作っていく議論は有益だと思いますよ。 ちょっと発散気味かもしれませんけど。
|

|