アカウント名:
パスワード:
Rubyのが一番お洒落でしょうね。 Class Objectのnewメソッドは、空っぽ(?)のオブジェクトを作ってから、 そのオブジェクトのinitializeメソッドを呼んであげる、っていうだけ。エレガントです。
CLOSもそうですね。newにあたるmake-instanceは クラスを取るメソッドで、それはクラスを引数に
element Pat; activity secretary (redhaired, thumbs); boolean redhaired; integer thumbs; begin ... end; Pat := new secretary (true, 10);
プロトタイプベースに関する話題につける部門名としてはかなりピントがずれている気がします。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
「科学者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、プログラマ「えっ」
JavaScript (スコア:4, 参考になる)
Re:JavaScript (スコア:1)
確かに、class があるほうが分かりやすい気もするけど、個人的にはスクリプト言語としては、プロトタイプベースの方がすきかな。
use Test::More 'no_plan';
Re:JavaScript (スコア:2, 参考になる)
そのクラスの仕組みの導入の仕方が気になるところです。
そのURLを見ましたが、
new Classname(args)という、Java/C++系の文法を採用してるようですし、
>処理を戻す前に B のコンストラクタを呼び出さなければならない。この呼び出しは明示的なものでも暗黙のものでもよい。
とも書いてありますね。
で、俺にとってはこれがかなりカッタルク感じます。
同じクラスベースでも、SmalltalkやRubyのほうがエレガントだと思います。
というのは、あっちは、
○コンストラクタは、単に"インスタンスを作って返す"という実装をされたメソッド(Class Objectの)の1つに過ぎない。
○コンストラクタ(クラスメソッド)が基本Objectを作ってから、
インスタンスメソッドである該当Objectの初期化メソッドを呼ぶ、
という形になっているので、暗黙のうちに呼ばれるだとか、呼び出し義務だとか、といった
めんどくさい決まりごとが、何もない。ソース見たまんまに処理されて、見たまんまのObjectが生成/初期化される。
という仕組みになっているので。
Rubyのが一番お洒落でしょうね。
Class Objectのnewメソッドは、空っぽ(?)のオブジェクトを作ってから、
そのオブジェクトのinitializeメソッドを呼んであげる、っていうだけ。エレガントです。
しかもRubyでは引数省略&複数引数まとめ渡しがが可能なので、
任意個の引数を渡されたnewは、その引数をそのままinitializeにたらい回ししてくれる。
親クラスのコンストラクタを3つ書いたら、子孫クラスも未来永劫3つ書かないとならない(藁)みたいな
面倒なことが、生じないんですね。
閑話休題。そんなわけで、なんていうか、C++系の「new Classname()」っていう文法って、
なんか蕁麻疹が出るんだよなあ。
「Classname.new()」のほうが数段いいなぁ。
言い換えれば、「ClassもObjectだ」という世界にどれだけ近いか?という話とも通じるんだと思う。
#俺言語では、ClassはObjectだし、サブクラス作りもClassのメソッドだし、なのでG7
#しかも特異メソッドも書けるから、ある意味でRubyにもSmalltalkにも勝ってる。
#問題(最大の弱点)は、文法が無いってゆーかPostscript系なので、コードが悲劇的に書きにくいってこと(藁
Re:JavaScript (スコア:1)
ちなみに JavaScript 処理系のことは良く知りませんが、Flash MX 2004 の Action Script 2.0(JavaScript2 とほぼ互換)処理系では、class などの新しい構文は、古い Action Script(JavaScript とほぼ互換)に対するシンタックスシュガーとして実装されているようです。
つまり、プロトタイプベースの言語に、クラスベースの構文の皮をかぶせただけみたいですね。
use Test::More 'no_plan';
Re:JavaScript (スコア:1)
もしその皮をその言語自体で実装できるなら、
「他の皮」も作れて、幸せになれるところですね。
Lisp畑のOOPみたいに、流派が無数(?)に存在できるってのは
(少なくとも技術的には)凄く良好な状態です。
#政治的(藁)には一子相伝のほうが良いんだろうけど、
#そのさい、劣ったほうの子孫だけを残されてしまったら
#目も当てられません…
それにしてもDelphiの落とし所も良かったなあ。
がちがちのコンパイル言語のくせに、
クラスメソッドの多態が出来るっていうのが。
それに前述のようなインスタンス作成手順の明示化(?)も
ある程度達成できていたわけだし。
特定のクラスだけ特殊なメモリマネージメントをしたいと思ったら、
インスタンス確保用のクラスメッセージをOverrideするだけ(^^;とか。
しかもC(++)みたいながちがちNative系の言語でもあるので、
そのOverrideのさい、相当泥臭い書き方を併用できる。
つまり柔軟なOOPと泥臭いコードとが綺麗に同居できるわけで。
Re:JavaScript (スコア:0)
CLOSもそうですね。newにあたるmake-instanceは クラスを取るメソッドで、それはクラスを引数に
Re:JavaScript (スコア:1)
どうなんでしょうね?
どうでもいいといえばいいんですが(^^;
そりゃそうと、後知恵の謗りを覚悟で言うならば、
この手順は「OOP者にとっては凄く自然ってゆーか当然」とも映ります。
クラスの責務は、インスタンスの骨格(メモリ領域)を作り、
そのインスタンスの骨に最低限の自己肉付け能力(=メソッドテーブル)を与える、というところまでで終わり。
で、後はそのインスタンス自体に全部やらせる、ってわけです。
この責務分割のしかたは、無理がないんですよね。
どっかの言語(たしか有ったよね)のように
「コンストラクタ中のこの場面では、thisが参照できません」
みたいな馬鹿げた制約を負わずに済む。
thisを参照したくなるようなタイミングでは既にthisに作業を委譲した「後」である、
という風にデザインしておけば、話が非常にすんなり行きます。
そして、いつ委譲するのが最も自然か?と問われればそれは、
「thisが作られたら出来るだけ速やかに移行(委譲)する」
が答えであるはずです。
この発想は、オブジェクトで考える(^^;人にとっては、どう考えても自然です。
そんなわけで俺としては、起源云々というよりも「自然発生」だと捉えたい、という希望(^^;があります。
希望というのは、そういう自然(^^;な発想をしてくれる言語デザイナが実は少なくない、ということを期待しているという意味でもあります。
逆にいえば、劣った(笑)new Hoge()方式は、誰が起源なんでしょう?
やっぱりC++あたりなのかな?
Delphiが存在できていることを思えば、強型系だろうとコンパイル系だろうとNative系だろうと、
C++方式を採用する「必然」性はあまり無いはず。
#C++の作者が物知らずor狭量だっただけ、という説に一票なのでG7
#いまだにインスタンスを「クラス」と呼ぶ奴が居るので頭抱えてます。
#そういう奴に限って、全般的に捉え方を間違ってやがるし、
#手抜きしても痛痒を感じないし…
#そういうやり方を流布したC++への恨みは、ちょっと少なくないですねえ。
Re:3D OSって・・・ (スコア:1)
SIMULA I です。当時はまだクラスもオブジェクトもなくてそれぞれ
「アクティビティ」や「プロセス」と呼ばれていました。つまり、
アクティビティ「Hoge」の新しいプロセスを変数に束縛するための
文で用いられます。具体的には次のように書きました。
Re:JavaScript (スコア:1)
SIMULA 67 は new 時に引数として初期値を渡すスタイルで、別段、初期化用の
メソッド(仮想関数)が用意される様子は見られません。
Smalltalk-72 では、isnew というインスタンス化直後だけ真となるテストで
初期化を行なうようなしくみになっています。まだ空っぽのインスタンス
にメッセージを送信するようなスタイルにはなっていません。インスタンスが
インスタンス変数に値を未束縛の状態で存在できたかはちょっと微妙です。
それが可能ならば、後で初期化というスタイルもとることはできたでしょう。
Smalltalk-72 の影響を受けて LISP マシン LISP 用に作られた Flavors と
いうオブジェクトシステムでは、defflavor というコンストラクタで初期値
を束縛してしまうか、あるいは、:initable-instance-variables という
オプションを宣言することで、make-instance 時にスロットを指定して
後で束縛することができます。ただ、変数に値を未束縛の状態でインスタンスは
存在できるので「空っぽのインスタンスに初期化のメソッドを起動させる」
スタイルも選択可能だったはずです。
Smalltalk-76 は現在の Smalltalk とほぼ同じ文法とコーディングスタイルに
なっていたので、ほとんど間違いなくこの時点では「空っぽの…」スタイルは
日常的に用いられるようになっていました。
したがって、Smalltalk-72 か Flavors、遅くとも Smalltalk-76 くらいには
確立していたスタイルであるように思います。いずれにしても、おおかたの予想
どおり、Smalltalk か、その影響で作られた LISP 用のオブジェクトシステムが
起源、というあたりに落ち着きそうです。
Re:JavaScript (スコア:1)
>にメッセージを送信するようなスタイルにはなっていません。インスタンスが
>インスタンス変数に値を未束縛の状態で存在できたかはちょっと微妙です
「空っぽ」といっても、ここの一連の話では、
そのObject自体のBootstrapに必要な最低限の情報(クラスなどへの参照など)は
与えられた状態、を指すのだと思っていました。
クラスとかへの参照さえあれば、「そのObjectの」初期化メソッド
(メソッドの名はオヤクソクということにすれば充分)
を自然なかたちでCallできるわけで。
どうせ初期化時には、クラスなどの祖先情報と、引数で渡された情報と、しか
もらえないんだから。
逆にいえば、その限られた(?)情報を美味しく無駄なく活かすための
スタイルとして、今のあの方式に落ち着いたんだろうなと想像します。
Re:JavaScript (スコア:0)
Re:JavaScript (スコア:0, オフトピック)
Re:JavaScript (スコア:0)
Re:JavaScript (スコア:1)
プロトタイプベースに関する話題につける部門名としてはかなりピントがずれている気がします。
Re:JavaScript (スコア:2, 興味深い)
まあ部門名なんてのは無知や煽りが幾ら混ざっていてもおかしくないものなんで(^^;
それはそれとして、ピントハズレなのは同意。
これじゃまるで完成品はクラス指向言語であるかのようじゃないか(^^;
俺はどっちかっていうとむしろ「逆」で、
クラスなんていうカッタルイ存在をリファクタリングで消したらプロトタイプ指向言語になる、
っていう印象を受けてます。
#さすがに今更「半プロトタイプ指向(Rubyと同じくらいに)のPostScript言語「ばぶばぶ」よろしくー」なんて言えないのでG7
#まあFreeソフトですから皆様ご自由にForkしてくださいませm(__)m