【OO?】オブジェクトオリエンテッド総合【非OO?】
■ このスレッドは過去ログ倉庫に格納されています
0001Java曹長
NGNG「OO派」と「非OO派」のコロシアムのようなスレです。
初心者も基本的には歓迎ですが、用語くらいはまず自分で調べてから語りましょう。
OO .. Object Oliented の略。「オブジェクト指向」の意。
詳細はとりあえず http://e-words.jp/?w=%83I%83u%83W%83F%83N%83g%8Ew%8C%FC 等を参照。
関連スレ:
【常識】 OO厨房は戦場では必要無し! 【事実】
http://pc3.2ch.net/test/read.cgi/tech/1041230298/
【C++】2ちゃんねらーはOO嫌い?【Java】
http://pc3.2ch.net/test/read.cgi/tech/1026974531/
0153デフォルトの名無しさん
NGNG全然違うと思うが。
って言うかみんなそれくらいわかってるでしょ。デザインパターンまで読んでるなら。
0154デフォルトの名無しさん
NGNG同意。勉強不足だな。
0155デフォルトの名無しさん
NGNGわかってらっしゃるそうなので、
共通点と相違点を述べてみてください。
0156デフォルトの名無しさん
NGNGコンポジションは動的。たとえば、ポリモーフィズム等を利用して、
利用しているクラスをまるごと差し替えてしまうことも可能。
0157デフォルトの名無しさん
NGNGそりゃないってw
>>156
継承はポリモーフィズムが絡んでくるけど
コンポジションは絡んでこない。
ってだけでは?
そもそも
>たとえば、ポリモーフィズム等を利用して、
>利用しているクラスをまるごと差し替えてしまうことも可能
の意味がわからんのだけど
簡単なコードでも書いてくれるとありがたいかも
0158デフォルトの名無しさん
NGNG0159デフォルトの名無しさん
NGNGAbstractState から継承して ConcreteStateA、ConcreteStateB… を作り、
利用する側は AbstractState 型への参照を保持するんだし。
151 の記事の要約になるけど、
ホワイトボックス型利用なのか、ブラックボックス型利用なのかが大きな違いだと思う。
前者は実装を意識しなきゃいけないけど(下手すると親クラスを変に弄ったりね)、
後者はインタフェイスが理解できていればいい。
0160デフォルトの名無しさん
NGNG使う気しないのは確かだな。
そういう意味で、ポリモーフィズムを利用してるって意味かな?
クラスを差し替えることに、ポリモーフィズムを使うって意味かと思ったよ。
ただ、継承は静的と書いてしまうと
誤解が生じるような。
継承には差分プログラミングと、実行時ポリモーフィズム
の二つの意味があるわけで。
言語によるという突っ込みはなしで。
C++、Javaの話。
0161デフォルトの名無しさん
NGNGimport DefaultMode;
import SpecialMode;
public class Sample {
private Mode myMode;
public void dynamicFunc(boolean mode);
if (mode) {
this.myMode = new DefaultMode();
} else {
this.myMode = new SpecialMode();
}
this.myMode.execute();
}
}
0162デフォルトの名無しさん
NGNG相手とかなりの密結合になる。
コンポジションは基本的にインターフェース経由だから、
一応ブラックボックスになるのかな。
0163デフォルトの名無しさん
NGNGで実際、実装継承全く使わないって人いる?
0164デフォルトの名無しさん
NGNG普通はフレームワーク的なクラスを作って継承するでしょ。
0165デフォルトの名無しさん
NGNG便利だな。あれ。
0166164
NGNG0167デフォルトの名無しさん
NGNG包含との違いが意味的なものだけになってしまい、それは単に親クラスに対して
Delegationしてるだけって事になってしまう。
そうなると、継承とコンポジションはその境を失う。
...そして最後には実体(Instance)のみが存在しdelegationを行うと言う、
いわゆる"Self"のような言語がOOの世界を支配する。
0168デフォルトの名無しさん
NGNGSelfマンセー
0169デフォルトの名無しさん
NGNG継承って、基本中の基本だよねぇー。
継承と委譲の使い分けって、Javaの言語仕様決めた時点である程度決着付いてる気がしてた。
0170デフォルトの名無しさん
NGNGそう、継承にそれ以上の意味があるのかなあ、と思った次第であります。
0171デフォルトの名無しさん
NGNG委譲のように各々のメソッドのラッパーを書かなくても、
勝手に親の持つメソッドを検索してくれるじゃないか。
つまり………楽ができるのさ。
0172デフォルトの名無しさん
NGNG↓
クラスの動的変更が可能になる
↓
クラスって特別な仕組みを無くして、インスタンス継承可能にすれば、シンプルで良い
↓
Selfウマー
0173デフォルトの名無しさん
NGNG↓
CLOSのMIXINでbeforeメソッドとかafterメソッドとかあったジャン
↓
HyperJ & MixJuice ウマー
0174デフォルトの名無しさん
NGNG0175デフォルトの名無しさん
NGNGクラス間のコード共有に関する解決策の事?
それともセキュリティ・マネージャの件(じゃないよね)?
0176デフォルトの名無しさん
NGNGソレダ!!!
0177デフォルトの名無しさん
NGNG第一引数と第二引数が共に整数なら、 plus(int,int)
第一引数と第二引数が共に実数なら、 plus(float,float)
第一引数が整数で第二引数が実数なら、plus(int,float)
第一引数が実数で第二引数が整数なら、plus(float,int)
を呼び出す、と。
で、この辺りの処理は(primitive使わなければ)Javaのreflectionパッケージで記述できるんですけど、、、
メソッド呼び出しのオーバーヘッドが大きそう…
#まぁ、分散オブジェクト〜Web寂びースの呼び出しより軽いからいいか。
0178デフォルトの名無しさん
NGNGオーバーロード?
0179デフォルトの名無しさん
NGNGそれって単なるオーバーロードでは?
0180デフォルトの名無しさん
NGNGそれをワザワザ記述するってのが、どうか。
0181174
NGNGプロトタイプ方式の事。
インスタンスごとにメソッド持つんだからメモリ多く必要だろうし
実行時に継承するとCPU食うじゃん
Selfの資料見当たらない・・・
詳しいサイト教えて
0182デフォルトの名無しさん
NGNGのん。CLOSでは
上記の処理を、例えば switch case文みたいので記述する(Lispならcond)とか、
もっと効率を考えて、引数のクラスIDからハッシュを計算してHashtableからメソッド検索、
とかしてたらしいです。
0183デフォルトの名無しさん
NGNGつまりPerlOO風に、パラメータの取り扱いも含めて1つのメソッドにしよう、と。
0184デフォルトの名無しさん
NGNGNewtonScript ってクラスじゃなくてインスタンスベースのOO言語も
そんな感じなんだけど、コレの骨子は親インスタンスは ROM や FLASH ROMに
置いたまま、例えば書き換わるメンバ変数(property)だけ子インスタンスが持つ、
なんてことを実現して時間空間の両面でリソースを減らすことにあるんだよね。
copy on write みたいな感じで面白い。
役に立たないマメ知識でした。
0185177
NGNG0186デフォルトの名無しさん
NGNGだから、ポリモーフィズムだって。
0187177
NGNGCLOSのはメソッド・セレクターじゃなくメソッド・ディスパッチャーだった気がしますた。
で、メソッド・ディスパッチャーみたいな仕組みを、リフレクティブに、記述対象言語自身で記述できれば、
before & after みたいな仕組みを作るのが楽だよねぇー、って言いたかったのです。
>>181 & >>184
そっすね。
ところで、インスタンス・ベースのOOと、アスペクトみたいなのの、融合って例はないんでしょうか?
0188デフォルトの名無しさん
NGNG0189デフォルトの名無しさん
NGNG>before & after みたいな仕組みを作る
事のメリットがわからない上に、
できない理由がわからないんだけど。
0190デフォルトの名無しさん
NGNGhttp://web.archive.org/web/20001017024220/www.zzz.or.jp/~iizuka/EOO/Japanese/oofaq-j/oo-faq-S-3.2.html
(「委譲/プロトタイピング」のオブジェクト指向パラダイムって何ですか?)
0191デフォルトの名無しさん
NGNGできないって言ってないってばぁー。
メリット?
アスペクト指向みたいな事やるのに、
ソースやらバイナリを改変するアプローチだけじゃなく、
しこしこコードで記述する方法を使った方が手っ取り早いケースもあるのでは?
0192デフォルトの名無しさん
NGNGトランスレータを作るって意味でしょ?
そういう方法でもいいんじゃない?
拡張の程度によって
プリプロセッサみたいなのでやるのか
トランスレータにするのか
バイナリにする(言語機能を利用しない)のかを
決めればいい。
0193デフォルトの名無しさん
NGNG0194デフォルトの名無しさん
NGNG一子相伝/終身雇用制で継承するより、
即戦力になるプロをスカウトして、権限委譲した方が
今っぽいじゃん。能力主義って感じだしぃー。
↓
委譲>>>>>>>>>>>>継承
↓
Smalltalk=継承ベースのOO言語
Self=委譲ベースのOO言語
↓
Selfウマー
0195デフォルトの名無しさん
NGNGものだと思う。
今はOOの使い方がだいぶ研究されて、委譲を使ったプログラミングの方が
いいじゃん、ってことになっているのでは。
つーわけで、実装継承=過去の遺物ってことでよろしいか?
0196デフォルトの名無しさん
NGNG> いいじゃん、ってことになっているのでは。
何でもかんでも実装継承で解決するのは止めて、適材適所で使えってトコロで
落ち着いてると思うけどな。
template method やなんかは、実装継承を使ったほうがスマートに書けるし。
実際、大規模なフレームワークを提供するクラスライブラリの類は、だいたい
実装継承を使ってるでしょ。
0197デフォルトの名無しさん
NGNG実際のところはCompositionに近いこともあるけどなあ。
フレームワークが提供する抽象クラスのサブクラスをアプリ側で
実装するなんて場合、実装継承に見えるけど、実際は
抽象クラスがサブクラス実装部分をcompositeしてるんじゃないかな。
ただ、委譲コードを書くのはメンドイし、ミスを防ぐためにも
実装継承という方法で制約をかけているのかもしれないけど。
(protectedキーワードが便利!)
となると実装継承ってsyntax sugarか?うーん
便利なことは便利なんだが...
0198デフォルトの名無しさん
NGNG変な実装のオーバーライドするのがダメなんじゃないかな。
template methodなんかは、だいたいJavaならabstractなメソッドか、
単純なデフォルトメソッドとして定義するでしょ。
これって、要するにスーパークラスの作成側が、あらかじめ
オーバーライドされることを想定しているわけで。
これをオーバーライドするのは、実装継承の良い使い方だと思う。
既存のコードの修正したい部分をオーバーライドで
変更するようなやり方は、悪い使い方だと思う。
0199デフォルトの名無しさん
NGNGclass Panel2 extends Panel1
class Panel7 extends Panel6
と継承しては機能追加する恐ろしい Java 参考書があった。
0200デフォルトの名無しさん
NGNG> 変更するようなやり方は、悪い使い方だと思う。
それはまさに差分プログラミングなワケだが、見通しが立つ範囲でやる分には
問題ないと思う。ただ、この「見通しが立つ範囲」ってのが曲者で、改修を
重ねて見通しが悪くなったら、早めにリファクタリングしないと死ぬけど。
実例を挙げると、バイナリフォーマットを解析してメモリに読み込むような
プログラム。最初に作ったバイナリフォーマットに、後にちょっとした拡張
が施された場合(良くある話)、if 文で条件分岐して対応するよりは
1. ファイル解析を strategy パターンを使って書く。
2. 元のファイル解析ルーチンを継承して、拡張フォーマット対応のファイル
解析ルーチンを作る。
とした方が見通しが良くなる。
ある程度ファイルフォーマットの拡張が重なって元のものとかけ離れてきたら、
そこで実装継承をやめて一から書き直し。
0201デフォルトの名無しさん
NGNGそうそう、差分プログラミングも使い方によっては便利だけど、
やめどきを知っていないと、あっという間にひどいプログラムになるよね。
ある意味、上級者向けだと思う。
でも、OOのメリットのなかで初心者に一番説明しやすいのは
差分プログラミングなんだよな。
0202デフォルトの名無しさん
NGNGこれって、それがある程度事前にわかっている場合は、
「ファイルを扱う」と「データの解析をする」を分離しておいて、コンポジット化すれば
いいのではないでせうか。
で、解析部のテンプレートとして、>>198 を適用する...って、
例として出された内容に言うのも筋違いな気がするのですが、気になって眠れないぃぃぃ...。
0203デフォルトの名無しさん
NGNGにしても、データ解析部分は strategy になるような。
0204デフォルトの名無しさん
NGNGプログラムをつくってみよう
0205デフォルトの名無しさん
NGNG一昔前にDHCPメッセージ解析するの作ったけれど。
0206デフォルトの名無しさん
NGNG> ヌヒよ、TemplateMethodパターンは継承のほうがわかりやすいよ。
> だが、Stateパターンは委譲のほうがわかりやすいよ。
> ヌヒよ、またTemplateMethodパターンはあまり可能性のないパターンよ。
TemplateMethodとStateは畑が違うものでないかい。
多重継承も禁止しているように、クラスには継承できないクラスもあるのだ。
継承して欲しくないときにfinal宣言。
言語によってはそういう指定(final)をできないものもあるかもしれないが。
C++しか使ったことがない沢村にわかわんだろうけど
継承を許されていないクラスには委譲をつかうしかないのだ。
逆に継承しないと使えないクラスもあるのだ。
0207デフォルトの名無しさん
NGNG俺の場合は
オーバーライドを使う=ポリモーフィズムを使う
というスタンスかも。
単純に親クラスのコードを利用したいだけなら
コピペすると思う。
もちろん、そういう状況にならないように設計できる余地がある時は
そうするだろうし。
0208デフォルトの名無しさん
NGNGインターフェース型による多態の立場は・・・?
0209デフォルトの名無しさん
NGNG#include <iostream>
class A {
public:
void print() { std::cout << "A" << std::endl; }
};
class B {
public:
void print() { std::cout << "B" << std::endl; }
};
template<typename T> void print(T t) {
t.print(); // これ
}
int main() {
A a;
print(a);
B b;
print(b);
return 0;
}
0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG本来の多態(polymorphism)の意味は、
ある変数に複数の型の値を代入できる点にあるから、
t.print();が多態かどうかというのは答えようがないと思うが。
0214211
NGNGついでに言うと、
> そのオブジェクトの種類に応じたメソッドを実行する機能
が
> その表現式の型に応じたメソッドを実行する機能
ならば、メソッドの「静的束縛」
0215名無し@沢村
NGNGヌヒよ、本来の多態(polymorphism)の意味は、変数じゃないよ。
あるオブジェクトに複数の型のオブジェクトを代入できる点にあると思うよ。ヌヒよ。
0216デフォルトの名無しさん
NGNG0217名無し@沢村
NGNG0218デフォルトの名無しさん
NGNGメソッド検索でもしてみる?
0219デフォルトの名無しさん
NGNG「オブジェクトにオブジェクトを代入する」というすばらしいお言葉の意味
を知恵を絞って考えよ!しかも大抵の人は「switch case でしか切り分けられ
ん」そうだ。C++ とか Java だと代入する先は変数だしなぁ。しかも大抵は
動的束縛で switch とか要らんよなぁ。わからん...
0220名無し@沢村
NGNGヌヒよ、オブジェクトにオブジェクトを代入するがわからんか?ヌヒよ?
つまりこういうことよ↓
Kintama kintama;
Omanko *omanko;
omanko=&kintama;
omanko->sex();
ヌヒはオブジェクト指向の初歩を勉強しろ!!ヌヒよ!!
0221デフォルトの名無しさん
NGNG見える漏れは真の大バカ野郎とうい事ですな。よっくわかりました。
....沢村様、重ね重ね申し訳ないのですが、大半の人間が使う
switch case とやらも例を出して明快に説明していただきたいのですが。
0222沢村@代理
NGNGimport DefaultMode;
import SpecialMode;
public class Sample {
private Mode myMode;
public void dynamicFunc(boolean mode);
if (mode) {
this.myMode = new DefaultMode();
} else {
this.myMode = new SpecialMode();
}
this.myMode.execute();
}
}
0223名無しさん@Emacs
NGNGで、コレがどうしたの?
0224名主さん@TeXmacs
NGNG0225名無しさん@Emacs
NGNGの例じゃないの?
0226デフォルトの名無しさん
NGNGなんか小さいプログラムOOで作ってみせあっこしようよ。
前やってたオセロみたいにさ。
0227デフォルトの名無しさん
NGNGOK。Hello World!作れ。OOで。
0228デフォルトの名無しさん
NGNGTemplateMethodパターンで作ってけど、面白くないよ・・・
public abstract class AbstractHelloWorld{
public void execute(){
hello();
}
public abstract void hello();
}
public class HelloWorld extends AbstractHelloWorld{
public abstract void hello(){
System.out.println("Hello World!")
}
}
0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNGpublic class HelloWorld100 extends AbstractHelloWorld{
public abstract void hello(){
for( int i = 0 ; i < 100 ; i ++ )
System.out.println("Hello World!");
}
}
0231デフォルトの名無しさん
NGNG継承覚えるのがやっとこさの××なのね。
#ウチの近所にも一杯いるけど(w
#「パターン大事だよねぇ、テンプレィトゥーメソッドゥ」とか
#「ホワイトボックスが重要だ」とかいつも逝ってる
0232デフォルトの名無しさん
NGNG0233デフォルトの名無しさん
NGNG0234デフォルトの名無しさん
NGNGHelloWorld100:2: abstractなのに本体持ってるんで、コンパイル中止しますた。
0235デフォルトの名無しさん
NGNGん?いつも漏れの席の後ろで喧々諤々騒いでるヤシの事だけど
0236デフォルトの名無しさん
NGNGああ。木村か。
でも、あいつお前の1/30だぞ。テストの順位。
0237デフォルトの名無しさん
NGNG0238デフォルトの名無しさん
NGNG2/30位って、どれくらいアタマぃぃのヨ?
0239デフォルトの名無しさん
NGNGワラタ
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNG0242デフォルトの名無しさん
NGNGこれJavaだよな? Javaもどきだったら知らんが、
Javaだったらコンパイルできなく当たり前
abstract外せ
>>230 は本当にOOらしく拡張されたのか?
ただのポリもーフィズムだけってのはのう....。
Hello World表示するだけでこんなことやるのも何か寒い。もっと芸見せておくれ
0243デフォルトの名無しさん
NGNG0244デフォルトの名無しさん
NGNG公園で耳押さえて、奇声あげながら走っている香具師がいたな。
0245デフォルトの名無しさん
NGNGUMLシルバーの試験対策にちょうど良さそうだな。
0246デフォルトの名無しさん
NGNG0247デフォルトの名無しさん
NGNG修行が足りぬか。修行修行
0248デフォルトの名無しさん
NGNGhttp://www.ogis-ri.co.jp/otc/objday2001/category6W1plus.html
0249デフォルトの名無しさん
NGNG> まあ、オブジェクトに複数の型のオブジェクトを代入してもほとんどの香具師はswitch case文でしかそれを切り替えられないだろうけどね…。
おお、polymorphic typeなswitch文をつくってくださるのか!
私のような下々の人間には効率的な実行系を想像だにできん。
ありがたや、ありがたや・・・
0250名無し@沢村
NGNGで、その頃の非OOのやり方というのはね、まず変数はすべてグローバルとし、変数を宣言だけするファイルをsubsti.hとしてひとつにまとめ一番おおもとにしていたね。
で次にそのsubsti.hをインクルードしてdeclare.hをつくっていたんだが、これは関数のプロトタイプと構造体だけを列挙するファイルなんだ。
次にdeclare.hをインクルードしてそれぞれの機能に応じた関数を定義するファイルをつくっていたよ。
ファイル処理ならfile.h編集ならedit.hという風にね。プログラムで使用する関数の定義はすべてこの.hで行なっていた。
だからcppファイルはつねにそれらをすべてインクルードした最後のファイルひとつだけだったよ。
ヌヒ等よ、このやり方は非OOでありながらOOに非常に近いし、またとても読みやすいという利点があったよ。
変数はすぶてひとつのファイルを開くだけで一覧できるし、static宣言もexturnも必要ないからね。
まさに一種のデザインパターンといえるだろうね。俺は生まれつきOOをやる資質が備わっていたんだろうね。
0251デフォルトの名無しさん
NGNG構造化。
0252デフォルトの名無しさん
NGNG(中略)
まさに一種のデザインパターンといえるだろうね。俺は生まれつきOOをやる資質が備わっていたんだろうね。
■ このスレッドは過去ログ倉庫に格納されています