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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん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
■ このスレッドは過去ログ倉庫に格納されています