class based OOPとprototype based OOPの違いについて

12
methane @methane

クラスベースかプロトタイプチェーンかの違いは、属性の名前空間を検索するときの、チェーンの先頭以外の「何か」を特別視するかしないかでしかない。特別視する方法は静的な型システムに組み込むこともあれば、「クラス」というファーストクラスオブジェクトへのチェーンのこともある。

2013-07-05 15:25:50
Kazuho Oku @kazuho

@methane その定義はよくないのでは? たとえばC++やJavaでは、メソッド「しか」オーバーライドできません。つまり、継承の意味とinstantiationの意味が明確に違う

2013-07-05 15:30:05
methane @methane

@kazuho ここでは「属性」が具体的に何を指しているかは問題にしていません。「何か」と言い換えた方がいいですがよけい判りにくくなる気が。。。

2013-07-05 15:33:25
Kazuho Oku @kazuho

@methane C++でも親クラスで定義されたメンバ「変数」にもアクセスできるわけです。つまり、メソッドのルックアップ手法(オーバーライドできる)と、変数のルックアップ手法(静的に解決する)が異なる

2013-07-05 15:35:33
methane @methane

@kazuho 僕は実行時かコンパイル時かすら問題にしていません。

2013-07-05 15:36:25
Kazuho Oku @kazuho

@methane タイミングの問題ではなくて、インスタンス単位のものとクラス単位の2種類のルックアップ手法を用意するのが古典的なclass-based OOである、というkとおです

2013-07-05 15:38:46
methane @methane

@kazuho とはいえ、名前探索時の「先頭」がインスタンスであることを仮定してしまっているので、その点はやはり C++ 等とうまくフィットしませんね。先頭とかバッサリ切って、名前解決のチェーンに任意のオブジェクトを利用できるかどうかと言ったほうが良かったです。

2013-07-05 15:39:23
methane @methane

@kazuho それも、最初に言った「特別視」の1つの形と考えていました。

2013-07-05 15:41:31
Kazuho Oku @kazuho

@methane えぇ。結局、ルックアップ手法を分けるのは効率のためだったわけで、スクリプト言語だと全部delegationで実装して、あとはsyntax sugarをどうふりかけるかみたいになってきてるのかなぁという印象をもってます

2013-07-05 15:44:17
methane @methane

@kazuho そもそも、正確な定義をしたいんじゃなくて、JSに関するプレゼンでクラスベースとプロトタイプベースの違いを簡単に説明する場合に、どう表現したら JS と Python, Java, C++ etc.. との違いをなんとなく伝えられるかを考えてます。

2013-07-05 15:44:29
Kazuho Oku @kazuho

@methane 派生(inheritance)と実体化(instantiation)を言語仕様として別個のものとしているか否か、じゃダメでしょうか? 実装の話に入るのではなくて

2013-07-05 15:48:15
methane @methane

@kazuho JS も new や {} と __proto__ = some_object は別ですよね?そういう意味ではなく?

2013-07-05 15:49:49
methane @methane

@kazuho そもそも明確に分ける必要が無いかもしれません。JS系だと明確に分けたい人が多い印象ありますが。。。

2013-07-05 15:52:07
Kazuho Oku @kazuho

@methane class-based OOは型しか実体化できない、prototype-based OOは任意のオブジェクトをプロトタイプとして実体化できる、でいいんじゃないかなーと

2013-07-05 15:55:29
methane @methane

@kazuho 「名前解決チェーンの2番目以降」よりずっと良いですね。

2013-07-05 15:56:34
methane @methane

@kazuho Python だと obj.__class__ = other_class でチェーンいじれるので、実体化するときだけじゃなくてチェーンに注目してたんですが、そこまで一般化するの難しい。

2013-07-05 15:58:06
Kazuho Oku @kazuho

@methane なるほどなるほど。rubyも特異メソッドとかあった気がするし、LL間の比較で言うと、できることの差はあんまりない感じですね #Perlを除く

2013-07-05 15:59:25
Kazuho Oku @kazuho

いつもながらPHP忘れた

2013-07-05 15:59:33
methane @methane

@kazuho 僕は JavaScript に (syntax sugarであろうと) class 構文が入ってそれを使ったらもうそれは立派な class based OOP だと思います。

2013-07-05 16:00:28
methane @methane

@kazuho php のクラスシステムは型と別れるというか、型システムが2重になってますね。 function (int $foo) すると、 int 型の値じゃなくた、 class int {} のインスタンスを受け取ります。

2013-07-05 16:01:25
methane @methane

@kazuho で、クラスシステムは、実装は Python とかに近くても、言語仕様はほぼ静的で、VMに手を入れるような高度な黒魔術を使わないと実行時に弄ることは不可能です。

2013-07-05 16:02:23
しいたけ @yuroyoro

Class based OOPとかPrototype based OOPとかOOPの実装手法の話ってだけで、prototypeなOOP実装だとより自由度が高くてメタプログラミングしやすいってだけの話じゃないすか? CLOSとかもOOP実装の一形態だし

2013-07-05 17:02:20