トップページ⇒tech
111コメント50KB

オブジェクト指向を端的に表すと

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
つまりクラスを継承すればその基本クラスをいじらずに新しい機能をつけくわえられる、つまりソーすコードを汚さなくていい、でいいですか?
0002デフォルトの名無しさんNGNG
クラスはいいとしても、対象となるオブジェクトまではねぇ・・・。
0003デフォルトの名無しさんNGNG
継承は使いすぎると混乱の元。
便利だし使わないと出来ない事も多いけどね。
情報隠蔽とアクターモデルのほうが本質と思われ。

#つーか技術の一面だけ連呼してわかったような風な口きくのは
#恥ずかしいので止めれ。
#日経XXばっか読んでる上司みたいでイヤーンな感じ
0004デフォルトの名無しさんNGNG
インタフェース継承は常套手段。
実装継承は混乱の元。
0005デフォルトの名無しさんNGNG
設計がUMLでできることだろ
0006デフォルトの名無しさんNGNG
おれJavaで継承使ったことないけどだめかな?
インタフェイスだけで事足りるんだけど。
0007デフォルトの名無しさんNGNG
つまりオブジェクト指向って、いかにわかりやすい覚えやすいクラスを作るかということですか?
独習C++なんか見てるとそんなかんじ。
0008デフォルトの名無しさんNGNG
つまりオブジェクト指向って、いかにわかりやすい覚えやすいクラスを作るかということですか?
独習C++なんか見てるとそんなかんじ。
0009デフォルトの名無しさんNGNG
http://hp.vector.co.jp/authors/VA000092/jokes/strup.html

つーことだ。
0010デフォルトの名無しさんNGNG
>>8
多分違います。とは言ったものの私にもあまり分かっていないので説明はできませんが、
http://www.zzz.or.jp/~iizuka/EOO/Japanese/index.html
ここからいろんな場所へ飛んでみるといいでしょう。

>>9
貴方C++で挫折しましたね?
0011デフォルトの名無しさんNGNG
Object指向の話になると、なぜかみんな最初に
Class指向の話をするんだよな(笑)

メジャーな言語は効率のために(言いすぎか?)
Classを中心に据えるのが多いけど、
やっぱりOOPというからにはObjectつまりインスタンスが
話の最初でしょう。Classはそれをいじる手段の1つ。

レスのタイトルに合わせた「本来の(笑)」答えは、こんな感じかと。
Prototype型OOP言語まんせー

>>10
俺、C++「に」挫折ならしました(笑)。
もっとOOP本来の形に近くて楽に書ける言語が
幸い今はいっぱい有るんで…。

「OOP本来を」覚えたいなら、C++から入るのだけは
やめたほうがいい。Javaのほうがまだマシ。
そういう意味では、OOPまっさらな状態で読む本が
「独習C++」だってのは痛いと思う。

OOPの肝を俺風に説明:
1:
なにかを「する」プログラムを書こうと思うな。
なにかを「される」プログラムを書こうと思え。
2:
たとえ双子でも1人づつの個性ってのが有る。
個性は生まれたあとの経験で変化する。
Objectも同じだ。
0012デフォルトの名無しさんNGNG
オブジェクト指向は、保守性を高めるのに役立つ。
0013デフォルトの名無しさんNGNG
「プログラムの設計」を「クラスの設計」に還元できる。
0014デフォルトの名無しさんNGNG
継承はOOPに必須ではないよ。
0015やっぱりNGNG
アル本によれば、クラス指向ってのが正しいらしいぞ。
0016デフォルトの名無しさんNGNG
アル本キボ
0017ふぅNGNG
age
0018デフォルトの名無しさんNGNG
個人的には「大域変数を葬り去れる」ってのが大きい(笑
0019>18NGNG
変数のスコープ・寿命の管理をよりきめ細かく行えるということですかね。
002018>19NGNG
いや、大域変数を常に考慮してられるほど記憶力良くないんで(笑
頭の悪い漏れには、保守・再利用は二の次って事です。
0021デフォルトの名無しさんNGNG
つーか、方法論からだろ?
オブジェクト指向分析&デザインしたのをコードに落とす作業が、
オブジェクト指向プログラミング。
classで情報隠蔽したり、継承で差分プログラミングができるのは、
副産物でしょ?

とりあえず、OMTよんどけ。
0022デフォルトの名無しさんNGNG
継承を嫌う人が多いようですな。
0023デフォルトの名無しさんNGNG
>>22
不用意に継承すると、有る関数のホンマもんの実装が何処にあるんだか
よく分からなくなる(多重継承とか場合によっては走らせてみないと
わからんとか)から、なるべくしない、するにしても継承ツリーはなる
べく浅くする(通常スーパークラスに対して1〜2階層程度)ようにしと
こうね。深くしないですむような技がデザパタにもあるし。

おいらは、Has-aで済むクラス利用は全てコンポジション、Is-aでも
元クラスのPublicメソッドしか使用しないなら、場合によってはコン
ポジション(まずいかな?)、明示的にポリモルフィズムを使用すべき
構成の場合に限ってインヘリタンスにしてる。なるべく同じコードは
2箇所以上に書かない。1つのクラスはなるべく小さく。C++でも完全
抽象関数使ってJavaのInterfaceと同じやり方にする。など。
0024デフォルトの名無しさんNGNG
>>1
質問がまずくない??
オブジェクト思考を端的に言うのとクラス継承は別物だよ。
どっちについて聞きたいの??
0025かいNGNG
>>23
SELFだと継承も全部Delegationで表されるそうです。
#ちなみにSELFは開発元がSunだからか、Win版が出てません^^;
0026デフォルトの名無しさんNGNG
>>22 >>23
まぁ継承にも美点と弱点はあるんで。
(メジャー路線では(笑))まず美点が浮きボリになり、
それからここ数年欠点が注目されてるんじゃないかな。
#普通は美点を注目し欠点を浮きボリにするらしいが、どっちでもいいじゃん(笑)

デザパタなんかで継承が攻撃されてる(笑)面として、
1つ大きいのが、継承は実行時に変更できん
(できる言語が無いとは言わぬが、そういう言語の概念は
今流行してる意味でのデザパタやUMLではサポート貧弱なんで)
ってのが有ると思う。

柔軟性を十分(?)高くしようとすると使えなくなる機能、ってのは、
なるほど少し敬遠されたりはするんだろうな。

あと、当然だけど、継承だけでなんでも出来るはずはないんだよね。
オブジェクトは実世界のモノを見たてたものだととか言うけど、
世の中見まわして継承だけで説明できるモノなんて
そんなに多くない。
たとえば人体だって、手や足や胃袋や腸「から成っている
(Composite…か?)」と表現するほうがずっと自然だ。
継承は無数にある構造表現(つーか把握)手段の、1つにすぎん。

ま、悪い子じゃないんだけど不器用だ、という感じか。
あまりに不器用なんで、ついつい色んな子に浮気しちゃう、と。

>>23
>場合によってはコン
>ポジション(まずいかな?)、明示的にポリモルフィズムを使用すべき
>構成の場合に限ってインヘリタンスにしてる。

その勢いでいくと、多態も
StrategyPatternかなんかで代替(代替と
呼ぶべきかどうか…)してもいいんじゃなく?
いやまぁ絶対そうしろとは言わないけど(^^;

>>24
両者がどう違うのかも知らない人の質問だっと思われ。
つーか、そのこと自体が質問事項に
暗黙のうちに含まれていたのだと憶測。
0027デフォルトの名無しさんNGNG
オブジェクト指向はRUPだよ。
悲しいことにな。藁
0028デフォルトの名無しさんNGNG
対象認識からでないと意味無し。言語はそのモデルを実装する
にあたっての障壁を減らすためにOO言語がある。
はじめの段階で少しもOOA出来ていないと、いくら実装で
工夫したところで保守性の悪いものが出来上がること間違いなし。
0029デフォルトの名無しさんNGNG
制御したい対象にコードを割り当てるのがオブジェクト指向。

………。

たたいちゃ、嫌。
0030デフォルトの名無しさんNGNG
すでに動いている(使われている)クラスがあって、そのクラスに
かなり大幅な仕様拡張をしたくなった場合。どうします?

できれば継承は(将来のことを考えて)使いたくない。でも継承を
使った方が(当座は)めちゃ楽。迷う…

最初からインターフェースだけ定義して、メソッドはすべてそれらから
継承するというのが理想かも。でもそこまで考えてなかった…
0031それってNGNG
COM
0032デフォルトの名無しさんNGNG
Javaは単一継承しかできないよ。
多重継承はできないよー。

あと、Javaアプレットを作る時は、
アプレットクラスを継承しないと
だめだったような?!
0033デフォルトの名無しさんNGNG
javaは継承は一つしかできないから、複数継承と同じ事をした
かったら全部インターフェイスをインプリメンツしないと
だめだにょ
0034デフォルトの名無しさんNGNG
>32

多重継承:
実装はcomposition。
インタフェースはinterfaceをimplementsせよ。
0035デフォルトの名無しさんNGNG
オブジェクト指向とは、メッセージと多態性である、
とか言ってみたりする。
0036デフォルトの名無しさんNGNG
>>35
>オブジェクト指向とは、メッセージと多態性である、

それ以前の問題として、メッセージだの多態だのを
「何に対して」行使するのか?が、OOだと思う。

たとえば関数ポインタなんてのは、乱暴にいえば
Objectがどれなのかはっきりしない状態での多態、
みたいなもんだと思う。

それとOOのはっきりした違いは、
やっぱり「Objectという存在」だと思う。

0037デフォルトの名無しさんNGNG
OOP
OMT
Has-a
Is-a
RUP
OOA
等の意味がわかりません。
0038デフォルトの名無しさんNGNG
OOP
OMT
Has-a
Is-a
RUP
OOA
等の意味がわかりません。
003935NGNG
>>36
あ、それはその通り。
まずObjectありき、だね。

じゃあ、次はこう言ってみるテスト。

---
OOの実装がOOPでその処理系がOOPLである。

多くのOOPLではオブジェクトの型として「クラス」があり、
オブジェクトはインスタンスとして存在する。

「クラス」は「継承」でき、それぞれのインスタンスは、
同じメッセージを受けても振る舞いが違う。これを多態性という。
---

添削頼む。

誰か「委譲」を50文字くらいで説明してくれ。
004035NGNG
このスレで、

オブジェクト指向とは、(200文字)である。

って説明が出来るようになったらいいなー。
0041デフォルトの名無しさんNGNG
>>30
Composite&Decoratorで実装継承を回避せよ。
<レシピ>

1.今の動いているクラス(XXX)のすべてのメソッドを持つインターフェイスを
XXXで宣言。

2.今動いているクラスの実装を持つクラスをXXXImpl implements XXX とし、
他のソースでnew XXX しているところを new XXXImplにする。ここまでで第一段階。

3.機能拡張によってできるクラスをXXXDecorator implements XXX とし、
インスタンスフィールドにXXX xxx_;を所有するようにする。コンストラクタで
XXXを引いてくるようにし、そのインスタンスフィールドにぶち込む。

4.機能を拡張したいメソッドで
func(){
//処理
xxx_.func();
//処理
}
等とする。必要に応じて適当に実装してくれ。

5.今までのクラスを使用していたところで、あたらしく作ったクラスを使い
たいところで new XXXImpl()を new XXXDecorator(new XXXImpl())とかにする。

用は、オブジェクトコンポジションに強引に持ってくということっす。
これだと、拡張がある度にクラス継承ツリーをだらだら延ばさずに済むよ。
004241NGNG
java.io.*あたりはこの技を使いまくってる。
さらに、ユーザがこの技を使えるよう
java.io.FilterXXXStreamなるテンプレート
まで準備してくれてるよ。ソース見て味噌。
0043デフォルトの名無しさんNGNG
>誰か「委譲」を50文字くらいで説明してくれ。
きみが説明しといてね。以上。
0044デフォルトの名無しさんNGNG
>>39
過度に一般的に書いてみた

---

0個以上の適当なメソッドの集合をインターフェイスと呼ぶ。

固有の内部状態と、インターフェイス、その実装を持つものを
オブジェクトと呼ぶ。

ある言語で、あるオブジェクトを作成するために必要な定義を、
その言語の文法で記述したものをクラスと呼ぶ。

---

直感だけど、クラスの概念は(言語毎の)固有の文法を抜きにしては
存在し得ないような気がする。c++, COM, java, UML, etc.

Objective logo や flavor などはクラスは無いし。
0045デフォルトの名無しさんNGNG
>固有の内部状態と、インターフェイス、その実装を持つものを

固有の内部状態と、1つ以上のインターフェイス、その実装を持つものを

です。
0046デフォルトの名無しさんNGNG
>>44 名前:デフォルトの名無しさん投稿日:2001/04/17(火) 19:53
>0個以上の適当なメソッドの集合をインターフェイスと呼ぶ。

メソッドよりメッセージのほうが
しっくりくるような気がする…と
言いたいところなんだけど、
メソッドっていったらそもそも
実装と呼び出しシグネチャの
どっち(卑近な分け方だが)を指すのが
「一般的」なんでしょうか?と
一応踏みとどまってみるテスト。

>その言語の文法で記述したものをクラスと呼ぶ。
>直感だけど、クラスの概念は(言語毎の)固有の文法を抜きにしては
>存在し得ないような気がする。c++, COM, java, UML, etc.

そうかなあ?
それが真だとすると、たとえばUMLはClassという概念を
表現できないという事態に陥らないかな?
一応、言語から独立した形でClassって概念は有ると思う。

Classの位置付け(や、まして実装)が言語によって微妙に違う
ってのは言えるけど。

どっちかってーと、言語 has-a Class概念
っていう感じかな。
複数の数の言語が同じObject(つーかClass)アーキテクチャを
共有していたりする場合は多いわけで。
それこそCOMやCORBAもそれだし。
#あと、delphiとC++Bとか(笑)

少なくとも「文法」に依存はしていないと思う。
メモリ上のObjectやClassの置き方(卑近に言えば)に
依存はしているかもとは思うけど。

なんか、出来あがった暁にふと気づくと、
UMLがやってるメタ定義(だったっけか)を
再発明してただけ、ってことになりそうで(^^;

0047デフォルトの名無しさんNGNG
このスレは、優良スレに認定されました。

(コピペ略)
0048デフォルトの名無しさんNGNG
>>46

>UMLがやってるメタ定義(だったっけか)を
>再発明してただけ、ってことになりそうで(^^;
そう。
で、それは一つの言語をまた作って、その言語における「クラス」を
創造したってことなんじゃないの、というのが44の蛇足部分。

>それこそCOMやCORBAもそれだし。
COM のような ORB に至っては、通常の「言語」で言う class 定義は
必要ではなく、クラス識別子さえあればオブジェクトを生成して、
利用することができる。

一方、インターフェイスの概念と、内部状態の概念については、
1 method = 1 interface の言語と 1 class = 1 interface
の言語と、明示的に method の set としての interface を
持つ言語とがあるものの、オブジェクトの外部仕様として OOP
全体に共通した概念なんじゃないか、と。

>実装と呼び出しシグネチャの
>どっち(卑近な分け方だが)を指すのが
>「一般的」なんでしょうか?と

これまた汎用的で悪いけど、元々の語義どおり「手続き」と
捉えてこちらの要求 (arguments) と頼み方 (protocol) を
セットにして名前付けたもの、と見るのが良いのでは?
受け付けた役所が中で何してるのかはしらん。
004948NGNG
>>48
どちらが「一般的」って聞かれてその答えは...
一般的には実装は含まない、よね。

同じメソッドを持つ、同じインターフェイスを持つ、
というと実装は異なってもよさげ(ですよね?)。

「同じクラス」というと、実装は...

a.コーディング時 - 同じクラスのオブジェクトは実装を共用する。
 固有の interface(s) の実装につける名称。
b.オブジェクト利用時 - interface さえ揃っていれば、
 「あるクラスの複数のオブジェクト」の実装が時と場合によって
 互いに異なっていても良い。使いたい interface(s) と役割 (role) を
 持つオブジェクトを生成するための識別子。

って感じじゃない?
やっぱり「クラス」という概念は文脈依存な面があって、
インタフェイスに比べてちょっと独立性が低いと思うけど、
どうでしょう。
005048NGNG
長いついでにもう一つだ...ゴメンねみんな。

「クラス」を二つにわけて、

48a 「実装とinterface(s)を同じくするオブジェクトを記述する方法」
48b 「役割とinterface(s)を同じくするオブジェクトを指定(specify)する方法」

と見れば、これはほとんどの OOPL に備わっているし、またそれなりの
有用性もあると思う。言語スレだから 48a だけ考えたいけど、
多くの場合クラスを記述するだけじゃなくて、その利用もするんだよね。
005148NGNG
あーもう書けるだけ書いとくぞ(怒らないで)。

50の48bでいう role を指定するのに、interface を流用する、
っていうのが最近の流れ。例えば人の名前を印字する、
というメソッドの argument は「名前」で十分で、その
「名前」の役割が「人の(名前)」ということなんだけど、

void printName(IPrintable* pName) { ... }; としてしまうと、
「人の」というroleが指定できなくてバグの原因になるから、

void printName(INameOfPerson *Name) { ... }; とする、
とか。ここで INameOfPerson を持つものは必ず IPritable を持つ、
という暗黙の前提が入ってくるのが気持ち悪いけど。
0052デフォルトの名無しさんNGNG
>>41
あなたのような簡潔な説明を初めて見ました。"できる"人のようですね。
今度またレクチャーして下さい。よろしくお願いします。
005341=23NGNG
>>52
年収350万の貧乏PGっすよ。
そんなこといってくれるなら雇ってくり。
0054デフォルトの名無しさんNGNG
>>41
あなたを泥まみれになるような仕事にお誘いする訳にはいきません
0055デフォルトの名無しさんNGNG
>>長い人
オブジェクト指向ってのは OOP が取り上げられる前から
自然な概念としてあって、クラス(等)の機能でそれを扱い
やすくしたものが OOPL、といったらどうだろう?
0056デフォルトの名無しさんNGNG
 だからOOはRUPだって言ってんじゃん。
0057デフォルトの名無しさんNGNG
継承はきちんとした人がきちんと使えば問題でねえさ。
世界中のア木が自分のドジを継承のせいにしてるだけ。
Decoratorだってそういう連中にはまともに実装できないって。
基底クラスが変更になったら問題? コード再利用概念は
なんだってそうに決まってるだろ。ソフトウェア部品の再利用
するなっていうことじゃんよ、それは。「だから継承は危険です」
なんて短絡的すぎるね。
0058デフォルトの名無しさんNGNG
まったくだーね。それでもgoto並に嫌うヤツがいるから困りもの>継承

ついでにオレ的オブジェクト指向=
=設計さえしっかりやっとけば実装は適当でいいものなり…なんちて
0059デフォルトの名無しさんNGNG
でも、最初のクラスがヘタレだと
継承したくなくなるよな…

最初が肝心…
0060デフォルトの名無しさんNGNG
要するに、継承によって設計のヘタレぐあいが露見するのを嫌うヤツがいると。
0061ホゲハゲNGNG
汎化,特化のわかってない奴が
ルートのクラス設計で思いっきり特化しまくると
誰も継承できなくなるってパターンが…
0062デフォルトの名無しさんNGNG
Webシステムで取得したデータを加工するには何パターンがいいのかな?
データ(クエリー結果)は同じ。だけど出力がケースによって違うみたいな
ときはどんなパターンを参考にすればいいのかな?
Javaで言えばBean(データ)とその加工。これに上手くマッチするパターンが
知りたい。先生よろしくお願いします。
0063デフォルトの名無しさんNGNG
デコレーターはどう?
生のInputStream と InputReader
みたいな関係

他にもいろいろあると思う
0064デフォルトの名無しさんNGNG
>>63
ありがとうございます。
さっそく試して見ます。
0065デフォルトの名無しさんNGNG
>>61 とか
そっすね。馬鹿が「ものの種類の分類」を
理性的に処理し損ねたときに、馬鹿継承が出現する感じ。
おまえら頭鍛えてから出直してこいってマヂ切れそうな昨今。

一度馬鹿が馬鹿設計で馬鹿継承をやると、
システムがその後にっちもさっちもいかなくなるんだよな。
#特に、既に稼動中のODBだとね(笑)。
#仕掛け的にSchema進化をサポートしてるといっても
#それはUSBなHDDを読み書き中に引っこ抜くのと同じなわけで…
006662NGNG
>63
さっきはありがとうございます。
いろいろ納期が近いことも考えて、結局JSPの
<% page extends="xxx" %>
を使って継承させることにしました。でもこれじゃ設計もくそも
ないですね(藁
0067仕様書完璧NGNG
デザインパターンをCで説明したサイトを教えて!
0068デフォルトの名無しさんNGNG
>>67
Cでポリモルフィズムはできないぞ。
関数ポインタテーブル自作して、
それっぽいことやるしかないかな。
0069デフォルトの名無しさんNGNG
>>68
そそ。「クラス」という仕掛けを自作する羽目になるよね。

まぁ、却ってそのほうがヨイ場合もあるけど(笑)。
それって好きな仕様のOOP言語を自作しているようなものだから。

rubyのいいぶんじゃないが、わざわざデザパタなんて
言わなくてもさらりと実装できちゃうような言語仕様
ってのも、あるんで。
たとえばFactoryとかなんて、Classを値として扱える
(変数に代入できる)言語なら、パターンなんかじゃなくて
単にClassをやりとりするコードを1行かけば済むだけ。

パターンがパターンとして有意義になるためには、
前提とする言語仕様ってのが時折あるようだ…。
C++は史上一二を争うくらいに(笑)かちかちに硬い言語
なので、なにやるにしてもパターン(で紹介されるようなコード)
を引っ張り出さないとならないっていう面はあると感じる。
これは必ずしも嬉しいことじゃないようなきもする。
0070デフォルトの名無しさんNGNG
オブジェクト指向言語っていうとクラスベースの言語の
話ばかりが出るけど、プロトタイプベースの言語の話が
出ないのはなぜ?
0071デフォルトの名無しさんNGNG
プロトタイプベースって何ですか?
0072デフォルトの名無しさんNGNG
Classが無い(または、無くてもよい)言語、のことだと思われ。

Instanceを作るとき、Classに作らせるってのが普通のClass有り言語のやり方。
そうじゃなく、既存Instanceをピーコすることで作るってのが、Prototypeな言語。

Objectに新しい機能を与えるために、普通のClassな言語では
Classに機能を追加してそれからInstanceを作らせるけど、
Prototypeな言語では、Classを経由せずInstanceに直接
メソッドを「追加」することになる。

なので、Instanceのメソッドを直接着脱する
「特異メソッド」という仕掛けが存在することが、前提。

rubyはClassも使える一方で特異メソッドも使える
という両刀使い(笑)の言語。

0073デフォルトの名無しさんNGNG
>>70
待ってました!
SELFとか、Cecilとか興味あります。
SELF環境のWin版ってないんですよね。さすがSunだ…
ソースはあるんだけど、誰かそこから移植orスクラッチから書けないかな?

0074デフォルトの名無しさんNGNG
>>72
Prototypeな言語の、利点、問題点等は特にないんですが?
007574NGNG
× ないんですが?
○ ないんですか?
0076デフォルトの名無しさんNGNG
>>72
OOPでもStrategyパターンとかPrototypeパターンすれば同じこと
のような気がするんだけど、気のせいですか?
0077デフォルトの名無しさんNGNG
>ソースはあるんだけど

unix畑の作物ならcygwin試しませう。どうですか?

>>74

実行時にClassを「いじる(=ピーコしたり中身を変更したり)」ことが
出来ない言語ってのはまぁ許せるけど、実行時にInstanceを
いじることが出来ない言語なんて論外なので(笑)、
メソッドディスパッチは自ずと動的なもののみになります。

C++みたいにコンパイル時に出来るだけ多くの事柄を確定
してしまおうという戦略は、成り立たない言語だと思います。
#俺が知らないだけか?
prototype型言語は、柔らかい系(笑)OOP言語の特徴を強く持っています。
それが利点&欠点かと。

あとは慣れじゃないですか?

ところでコンストラクタは意味をなさないと思われます。
Instanceをピーコして「から」そのInstanceに機能(メソッド)を
追加/変更していくというプログラミングスタイルになるので、
ピーコ(コンストラクト)した直後にはコレといった処理を行えまい。
たとえばFile型だからといって生成と同時にFileをOpenしてしまったら
File型から派生(実際はピーコ&メソッド修正)しようと思ったら
既にFileがOpenされてて手の付けようがない、ということもありそう(笑)。
#もちろん、そうならない文法を与えることも出来ないわけじゃないでしょけど。

あと、言語仕様が、比較的簡単になるんじゃないかなあ。
使いやすいかどうかは別として。

0078デフォルトの名無しさんNGNG
>>76
「OOPでも」って何ですか?(^^;;;;
PrototypeだってOOPだよー。
「(Classじゃなくて)おぶじぇくと」指向っしょ?

同じようなもんだといえばその通りなんだろうけど、
わざわざパターン(=教育)を使わずとも
言語デフォで普通に使えば(=本能)
そのままPrototype型になるっす。それが違い。
#CでもOOPできる、という論法と似ています。

0079デフォルトの名無しさんNGNG
プロトタイプベースの言語は、非常に原始的なオブジェクト指向言語といえるだろう。

たとえばコンストラクタという機構はおおむね存在しない。そもそもクラスという機構が無いのだから存在しようがない。
オブジェクトを作るのはとても簡単だ。RubyやPerlのハッシュコンストラクタみたいな感じの構文で新しいオブジェクトを作ることが出来る。必要ならば、新しいオブジェクトを生成して返すメソッドなどを用意すれば、それがコンストラクタ的なメソッドという事になるのである。

継承に至っては、単に親オブジェクトへリンクを張るというだけに成り下がる。特殊なメンバ(prototypeとか_protoとか)に親オブジェクトへの参照を入れればそのオブジェクトを継承することが出来る。いや、むしろ自分で処理できないメッセージが来たときに、親にそれを委譲できるという表現の方が適切かもしれない。

ここで重要なことがひとつある。それは、親オブジェクトの状態は(明示的に行わないかぎり)決してを書き換えられないということだ。
たとえば親と子の両方がfooというデータメンバを持っているとしよう。子オブジェクトにbarというメッセージが送られた結果、親オブジェクトのbarメソッドが呼びだされ、データメンバfooを書き換えた。この場合、どちらのfooが書き換えられるかというと、子オブジェクトのfooなのだ。
つまり、親オブジェクトは子オブジェクトの原型、プロトタイプなのである。プロトタイプは決して変化しない。ここがプロトタイプベースと言われるゆえんなのではないかと思われる。

ちなみに大抵のクラスベースの言語では親オブジェクトの方になる。これはデータメンバはオーバーライドできないという制限があるためだ。
0080デフォルトの名無しさんNGNG
>>親オブジェクトの状態は(明示的に行わないかぎり)決してを書き換えられないということだ。

あ。意識していなかったけど、最近作って遊んでる自作言語は
いつのまに自然に(笑)そんなふうに振る舞うようになっています。へい。
なるほど。「書きかえられないからプロトタイプ」か。肝に銘じて(謎)おきます。

>これはデータメンバはオーバーライドできないという制限があるためだ。

データメンバとメソッドメンバの仕掛けも意味付けも
ずいぶん違うんでしょうね。データはObjectにつくけど
メソッドはClassについているのが普通だから。

自作言語では、面倒なので(笑)出来る限り同一視できるように
作ろうと心がけた結果として、上記の状態に至りました。

「初期値」としてプロトタイプ側Objectに
テキトウなデータメンバを用意しとく
というテクが使えるんですねこれ。面白い。

ところでClassていつから有ったんでしょうか?
Smalltalkには有るし。
全然知らないんですがOOP始祖のSimulaとやらには
有ったんでしょうか?大昔のシミュレーション言語ということは
がちがちコンパイル系言語でClass有りだったのだろうか?
0081デフォルトの名無しさんNGNG
>>80
Simulaにはあったと思う。Hoareの昔の論文を読んだときに
例がSimulaで書かれていたので、へー、と思ったことがある。
当時はその筋ではそれなりに知られていたのかもね。
0082デフォルトの名無しさんNGNG
>>79 「親オブジェクトのデータメンバが書きかえられる」
ってなんだそりゃ、と思ったけど、インスタンスの、親クラスから
継承した部分にあるメンバ変数のことね。
っていうかその部分の事を指して「親オブジェクト」って言うのは
変だぞ。
subobjectって表現なら論文で見たことあるけどな。
でもこれは subclassと subobjectの関係が逆になって
混乱する人も居るだろうな。
0083デフォルトの名無しさんNGNG
>>79
書き換えられているのは親じゃなくて自分のデータメンバだと見ることもできるよ。
つーよりすべてのデータメンバは自分に属していて、親は完全なプロトタイプとみ
なすことができる
#普通の言語の場合、親はオブジェクトじゃなくてクラスなんだから当たり前
0084デフォルトの名無しさんNGNG
>>80
自作言語の名前はなんていうのでしょうか?
0085デフォルトの名無しさんNGNG
>>84
ジサクジエンデシタ
0086デフォルトの名無しさんNGNG
どっかのスレによる(笑)と、2chに参照を書くとすなわち攻撃なんだそうだから、
それを信じるならば(笑)、自分を攻撃したくない(笑)んで、まぁ…
0087デフォルトの名無しさんNGNG
Newton Scriptみたいな言語か。
初期化済みのオブジェクトをテンプレートとしてROMに置きつつ、
変わった部分だけ保持するインスタンス、なんかが特徴的でした。
0088デフォルトの名無しさんNGNG
このスレの次レスから900まではRuby発言禁止。
ぜってー禁止!つーことでみなさんよろしく。
0089デフォルトの名無しさんNGNG
ちなみにJavaScriptもプロトタイプベースやねん。
でもコンストラクタの構文があるんで、クラスベースな感じでも使えるんよ。
0090デフォルトの名無しさんNGNG
Rubyサイコー
0091ITファシズムNGNG
地球規模の独裁政治を実現しようと考えたときに、
その行政を、ITで、機械的に実現するのが現実的です。
情報は、いくら集中させてもかさばりませんし、
少人数で握っていた方が、力となります。
こうなるには、膨大なソフトウェアを必要としますが、人手が必要なのは、
案件を、開発し尽くして、安定した運用に入るまでです。
これを可能とするには、より統制された開発手法で、
すべてのもの(人、物、金、情報)を管理していく
アプローチをエンジニアにとらせなくてはなりません。
しかし、真の目的を知って、協力する人は、多くはありません。
そこで、「すべてのもの(人、物、金、情報)を管理」という用語を
「開発対象(オブジェクト)」という抽象的な概念に置き換え、
エンジニアの頭を混乱させて、彼らを、JとCとで始まる2つの言語の競争へ
参加させることにしました。
これらの成果物は、テロ等によって、簡単に破壊されないように、
蜘蛛の巣の構造をとっています。
巣が少々破壊されても、すぐに修復する蜘蛛に、学んだのです。
ITファシズムが完成するのは、数10年を要するかも知れませんが、
ご破算になる可能性も、極めて、稀有という状況であります。
0092デフォルトの名無しさんNGNG
>>91
3行で要約しろ
0093デフォルトの名無しさんNGNG
>情報は、いくら集中させてもかさばりませんし、

そうかな?
0094デフォルトの名無しさんNGNG
>>93 たしかに金はかかるな
0095デフォルトの名無しさんNGNG
age
0096デフォルトの名無しさんNGNG
端的に表すと... 難しいってことはおいらまだ理解できてないんだね。
権限委譲された水平分散型の組織、を思い出すね。あと妖精崇拝的、とか
コビトさんお願い思考な気も。
00972ch風端的NGNG
自分のことは自分でやれや、ゴルァ!
少なくとも他人からはそう見えるようにやっとけ、ヴァカ!
日本人なら日本語しゃべれや、ギコハハハハ!

 ってこった。
0098デフォルトの名無しさんNGNG
>>97
何気にわかりやすい。
0099デフォルトの名無しNGNG
C++におけるオブジェクト指向の利点は、>>1 にメンバ変数を
触らせないことです。
0100デフォルトの名無しさんNGNG
C++におけるオブジェクト指向の欠点は、>>1 にメンバ変数を
みせちゃうことです。
0101shigeNGNG
ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++
0102デフォルトの名無しさんNGNG
みんな、ちょっと大丈夫?
>>1 の質問は Object-Oriented Paradigm とは、でしょ。

だったら答えは、
「対象とする事象を "もの" という単位で観測することで、
 抽象化・具象化時の traceability を容易に保証可能とする考え方」
じゃないかなあ。

OO Language や OO Programming の話ではないはず。
0103102NGNG
>>102 でいうところの traceability は、

元の対象とする事象 と それを認知した頭の中の model との間、
頭の中の model と それを自然言語で記述したもの との間、および、
自然言語で記述したもの と それを Programming Language で表現したものとの間
での traceability を指している。

開発段階間での traceability 、UML 中の diagram 間の traceability も
あるけどね :-P
#最初の tracebility は 要求段階と分析段階間のそれと言えなくもないか 8-)
0104102NGNG
>>103 で、traceability って結局ナニよ?という質問に対して、
例えば、
「観測者が主体性があると認識した全ての対象間の1対1写像が存在すること」
という、あやしげな叩き台をここに提示する。
0105KDNGNG
オブジェクト指向のポイント、それすなわちポリモルフィズム。
この機構を使って、既存のコードの変更点をできるだけ少なくするのが目的。これが肝心。


ほかにも、継承使ってラクチンするとか、関数よりは、メソッドの方が機能が整理されていて分かりやいとか、カプセル化しやすいとかあるのですけども。
0106KDNGNG
Photoshop の機能を付け加えるのに Plugin機構を使うとか、そういうことです。
0107 NGNG
このオブジェは逸品ですのよ
0108デフォルトの名無しさんNGNG
確か、
「Polymorphism がなくても、Implementation Inheritance があれば、
それは Object-Oriented と呼ぶことができる。」
てな定義はありませんでしたっけ?
0109デフォルトの名無しさんNGNG
OOP の特徴としては、以下で
encapsulation, inheritance, polymorphism になってます。
http://c2.com/cgi-bin/wiki?ObjectOrientedProgramming
http://c2.com/cgi-bin/wiki?ObjectOrientedPurity

でも、単に Object-Orientation としては、
object と message passing にしか触れられてませんね。
http://c2.com/cgi-bin/wiki?ObjectOrientation

Object-Oriented FAQ でも、
high-level view では、polymorphism が挙げられていますが、
low-level view では、object を基本とした "View Of The World" となっとります。
http://www.cyberdyne-object-sys.com/oofaq2/
0110デフォルトの名無しさんNGNG
ほあっ
0111デフォルトの名無しさんNGNG
age
■ このスレッドは過去ログ倉庫に格納されています