トップページ⇒tech
220コメント79KB

クラス継承は廃止すべき

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
全部コンポジションでいいやん。
継承はインターフェースだけで。
0153デフォルトの名無しさんNGNG
>ふーん。情報ソース示してみそ
お前友達いないだろう
教えてやらん、わりと著名な日本語のページにあるから必死こいて自分で探せ。
0154デフォルトの名無しさんNGNG
>>153
ハタから見ると、
>教えてやらん、わりと著名な日本語のページにあるから必死こいて自分で探せ。
お前の方が友達いないんじゃないかと思うなあ。
0155デフォルトの名無しさんNGNG
>>152
は、なにいいたいのか良くわからん。
なんか良いアイデアあるなら、あっちのスレにも書いてね(♥
0156デフォルトの名無しさんNGNG
良スレ
0157デフォルトの名無しさんNGNG
>>151
それ>26は単なる笑えない冗談だろ。
見事釣られたわけだねw
0158デフォルトの名無しさんNGNG
>>126
std::auto_ptr<IHoge> pHoge = new Hoge<HogeB>;
って感じで、ある枝のパターンを防げないって事を除けばtemplateでOKだと思う。
0159デフォルトの名無しさんNGNG
>>134
それやってしまうと、クラス数が爆発して大変じゃないかなぁ?
クラスに対して、自動的にインタフェースを作ってくれる構文があれば便利なんだが。

class HogeA : __interface;としておくと、
std::auto_ptr< IHogeA > pHogeA( new HogeA );
って感じでIHogeAが出てきた時点で、言語レベルでHogeAから
インタフェースクラスIHogeAを準備してくれるとか。
0160デフォルトの名無しさんNGNG
>>159
追加説明
class HogeA : __interface, public IHoge, public OtherInterface{};
ってクラスがあれば、
std::auto_ptr<IHogeA> pHogeA( new HogeA );
としたときには、
class IHogeA : public IHoge, public OtherInterface{};
が自動的に作られるような構文があればなぁって事ね。
0161デフォルトの名無しさんNGNG
>>148
スレの内容に対して、その内容がどう絡んでいるのか判らないのだが・・・

余談
UMLって、初期はコミュニケーション言語的な使われ方だったと記憶してるんだが、
いつのまにかプロジェクト資料として残す設計言語って感じになってきてるよね・・・
以前の、不完全な使われ方だけど、設計の大筋が伝わるって頃の方が好きだったなぁ。
0162デフォルトの名無しさんNGNG
>>159-160
Hogeに対してIHogeが必ず対で存在することを保障するなら、
管理は別に難しくないんじゃないかな。
まあ>>160みたいな構文があれば記述が楽になることは確かだと思う。
0163デフォルトの名無しさんNGNG
>>148はFacade。擦れに関係なし。
0164デフォルトの名無しさんNGNG
>>161
いみふめ。
昔はそーだったんですか。
あと、現在の方も?
今は、「プログラミング言語のソースを自動生成可能な設計データ」
と見なされつつあるのかと、思ってたあるよ。
0165デフォルトの名無しさんNGNG
>>162
まあ、クラス数が増えるだけで管理は可能ですね。
クラスのヘッダファイルに、コピペ使ってインタフェース専用クラスも用意すればいいか。

>>164
もちろん、設計データとしての側面も以前からあるけど、
より良い設計を実現する為のコミュニケーションツールとしての側面は
昔の方が強かったなぁっと思ったのですよ。

設計データ作成と称して、誰とも会話せずに黙々と図を書いてる人とか見ると、
なんか使い方がおかしくなってるんじゃないかなぁっと感じたり・・・歳か!?
0166デフォルトの名無しさんNGNG
C++で比較的少数で開発してましたが、シーケンス図やインスタンス関連図(クラスの関係でなく,場合場合におけるインスタンスの全体的な関係)を使ってました.純粋なUMLは無駄で使えない.
まぁ大規模開発ではそういかないんだろうけど.
全体としてはソース,クラス,シーケンス,仕様(文書)などのシームレスなツールを所望するがいまだない...
0167デフォルトの名無しさんNGNG
>161
なんか、スレの内容とはあまり関係のないUMLの話が出てきて謎なんだが、 >148 は
委譲ではなく集合の概念で継承を回避してはどうかという話だと思われ
0168152NGNG
>>155
ごめん、こっち読んで。

ttp://www.ogis-ri.co.jp/otc/hiroba/technical/MixJuice/index.html
0169デフォルトの名無しさんNGNG
>>167
はぃ?
0170デフォルトの名無しさんNGNG
C++以外では多重継承がNGってことからも
継承自体のアンチ論が出ても不思議じゃないな
俺も派生の派生ってのだけは、絶対にやらないし
0171デフォルトの名無しさんNGNG
>>168
おぉ、随分古い記事引っ張り出してきたね。
たしか、プレi-αppLi時代 (ドキュモx503i以前) の記事じゃなかったっけ。
0172デフォルトの名無しさんNGNG
>>170
クラス階層は2階層まで派、ですか。
こりゃまた厳しい。Interviewの中の人は、3階層まで派だっけ。

俺は、汎用クラスは結構深くてもおっけ(但し全部深いのは勘弁)派だなw
0173デフォルトの名無しさんNGNG
>>167
Composit?
0174デフォルトの名無しさんNGNG
>>172
基底>派生>派生だと、真ん中の派生クラスが何か気持ち悪いんだよ
お前は一体何したいの?みたいな気分になる
しかし例外的に抽象>派生>派生ならその嫌悪は無い
0175デフォルトの名無しさんNGNG
趣味グラマの希望の星D言語では

void hogeMethod(HogeClass hc){}
と定義しとくと、継承なしに

HogeClass hc = new HogeClass();
hc.hogeMethod();

とできるらしい
0176デフォルトの名無しさんNGNG
Eiffelは多重継承マンセー
0177デフォルトの名無しさんNGNG
CLOSも多重継承可能だな
0178デフォルトの名無しさんNGNG
>173
集合は言葉が正しくないな。集成 (Aggrigation) だわ
0179デフォルトの名無しさんNGNG
.net が多重継承だめなのは至極残念
0180仕様書無しさんNGNG
>>179
なんで?
0181デフォルトの名無しさんNGNG
いや多重継承マンセー派なので
グルーコード書くのめんどくさくて嫌い
0182デフォルトの名無しさんNGNG
全部コンポジションにすりゃいいじゃんって意見は分かりやすくて好きだがな
ポリモフィズムを必要とするプログラムって、それでなくても組めるし
0183デフォルトの名無しさんNGNG
>>182
ポリモルフィズムって、要するにパラメータでディスパッチができれば
いいだけのことだもんね。
そんなのCの頃だって関数ポインタテーブルでやってたしぃ。
0184デフォルトの名無しさんNGNG
>>183
何を当たり前の話しているんだ。
0185デフォルトの名無しさんNGNG
>>182
論点ずれてない?
実装継承はいろいろ問題があるからコンポジションにしようってのが
このスレの話の流れだと思うんだが。
0186デフォルトの名無しさんNGNG
>>185
おまえがずれてるだろ。
この話の流れは
>>1 全部コンポジションでいいじゃないか(問題提起)
-> プッ勉強不足だな継承は必要なんだよ(大勢)
-> 雑談
-> >>182 >>1の考えはわかりやすくて好きだ(1に賛同する少数派)。
0187デフォルトの名無しさんNGNG
どうしても継承をしたいとなると、スーパークラスは派生クラスを作った後で決めたい
そもそも抽象化とは数多くあるクラスの共通の機能を抽出する行為なのに
プログラマがしなければならない思考の順序がプログラムの作成順序とは逆で
雑多なクラスを作る前に、共通機能を決めなければならない、
だからせっかく作ったライブラリが歪む事になる。
これが恩恵は少なく弊害は多い理由だと思う、
が、STLやらboostやら見ていると改善余地はあるかなと思ったりもする。
クラス継承は使わなくてもすむなら使わないに越した事はないが、言語機構的に無くされるとちと困る。
少なくともgotoが無いと困る程度には困る。
0188デフォルトの名無しさんNGNG
・基底→派生
・抽象→基底(いやこれも派生だけどね)→派生
これが人が無理なく管理できる継承ネストの目安かと
0189デフォルトの名無しさんNGNG
>>187
>どうしても継承をしたいとなると、スーパークラスは派生クラスを作った後で決めたい

この案はいいな。
トリッキーでなく実現可能な言語ってあったりするの?
0190デフォルトの名無しさんNGNG
>>189
「(抽象)基底クラスの抽出」ってフレーズを、
聞いた事ありません?
0191デフォルトの名無しさんNGNG
ageますね
0192デフォルトの名無しさんNGNG
プラットフォームに合わせてインタフェース弄くる程度の横に長い派生くらいしか使わない
0193デフォルトの名無しさんNGNG
Cで無理やりOOするのはしんどくて空しくて効率悪いのと同様に
言語に備わってないことを無理やりやるのは好きじゃないね。
特に委譲しまくりはめんどい。
何事もほどほどにバランスよく好き嫌いせずに使っとけ。
0194デフォルトの名無しさんNGNG
>>193って、何か含蓄のある発言に見えるけど、
その実は
「俺の方法が1番、俺と同じようにやれ」
と言っているのと同じことだったりして。

おまえは「ひまわり」や「TTSネオ」も
バランスよく使っているのかと小一時間問い詰めたい。
0195デフォルトの名無しさんNGNG
バランスよく使うと、比率が0になりますた。
0196デフォルトの名無しさんNGNG
アフォはだれにも相手にされず、自分で突っ込むより他の術がないのねw
0197デフォルトの名無しさんNGNG
>>195
つまり、「自分(の基準)が一番バランスが良い」という訳で。。。
0198000&rlo;ッ゚フ(´ゝ_,`)&lro;NGNG
(´,_ゝ`)
0199デフォルトの名無しさんNGNG
◇◇◇ ひし形最強!! ◇◇◇
0200デフォルトの名無しさんNGNG
●● 200最強!! ●●
0201デフォルトの名無しさんNGNG
うんこ
0202デフォルトの名無しさん05/02/03 16:25:20
>>199でもあんたそれ正方形ですからー
残念!!
小3からやり直せー斬り!!
0203デフォルトの名無しさん05/02/03 18:57:42
ぽかーん
0204105/02/10 00:29:36
「ジョンは動物じゃないよ!犬なんだよ!!!」って力説するタイプ
0205デフォルトの名無しさん05/02/10 22:47:13
クラス設計について語るスレはここですか?
0206デフォルトの名無しさん05/02/12 01:31:14
海面下730mの海底に達した。
0207デフォルトの名無しさん05/02/15 12:37:48
>>206
>海面下730mの海底に達した。
何が?
0208デフォルトの名無しさん05/02/15 14:41:55
スレ一覧の一番下に来たってこと。
0209デフォルトの名無しさん05/02/16 02:19:03
適当に読んでみたけど、難しいな。
泣きそう。
0210デフォルトの名無しさん05/02/27 08:09:39
新たに機能を作るのが面倒ってんで、既存の別機能のクラスを継承して作ることになりますた。
確かに当面の面倒はないが、まったく関係ない余分な機能やらincludeファイルやらを抱え込むことに…

犬から猫を派生させたみたいになりそうなんですが、
実務だとこういう手段がとられることって結構あるんですか?
0211デフォルトの名無しさん05/02/27 10:47:33
>>210
ない。機能面から設計してる時点であぼーん。
0212デフォルトの名無しさん05/02/28 10:35:18
>>210
このように使われるから>>1みたいなのが出てくるってコトね

全く関係ない余分な機能やらってオワットル
021321105/02/28 14:41:22
ありゃオレちょっとぼけてる。
本当は機能面じゃなくて実装面って書きたかったのです。
0214デフォルトの名無しさん05/03/08 01:37:34
>>210
もし継承したいんなら、その共通する機能で別のくくりができるだろうから
それだけ切り出した方がまだイイと思うぞ。
つーか継承する必要なさそうな予感

安易な継承は、グダグダなソースを産む元
0215デフォルトの名無しさん05/03/16 22:47:38
C++コミュニティに言わせると
javaそのものがアンチパターンのようだ
0216デフォルトの名無しさん2005/03/30(水) 02:08:36
おおよそメソッド4つ以上をコンポジションしようとしたらダルいっすよ
アジャイルじゃねえよ。継承させろよ。適度に弁えて使うからさあ。
0217デフォルトの名無しさんNGNG
>>216
"Modifier Class Template"でググれ
0218デフォルトの名無しさん2005/04/06(水) 19:35:38
>>1はただの負け犬だ。
0219デフォルトの名無しさん2005/04/06(水) 22:00:08
class inter {
public: virtual void method() = 0;
};

class super_super : public inter {
public: virtual void method();
};

class super : public inter {
private: super_super *ss;
public super() : ss(new super_super) {}
public ~super() { delete ss; }
public: virtual void method() {
 ss->method();
 additional_process();
};

class self : public inter {
private: super *s;
public self() : s(new super) {}
public ~self() { delete s; }
public: virtual void method() {
 s->method();
 additional_process2();
};

interface継承だけで、2段階の実装継承を委譲で実現するとこんなかんじ
コンストラクター起動で、newが二回余分に走るw
method()呼んだときに余分に生じるポインタ参照はいくつだ?
効率的に終わってるよ
0220デフォルトの名無しさん2005/04/07(木) 12:13:15
誰もそんな話してないのでは?
■ このスレッドは過去ログ倉庫に格納されています