OOP 2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/11/10(水) 22:51:25OOPってよくわかんないよね
http://hibari.2ch.net/test/read.cgi/tech/1284115490/
0455デフォルトの名無しさん
2010/11/28(日) 14:26:31オーバーロードは静的に統合されるから大丈夫。
0456デフォルトの名無しさん
2010/11/28(日) 15:04:36その新しいOOPL記法がfunc(obj1, obj2)。
なにか馴染みが有る気がするが、気にしない。
0457デフォルトの名無しさん
2010/11/28(日) 16:37:22>どうでも良くないって。
>obj.method(obj2);って表記だと、マルチメソッドに対応するのが難しい。
ここはコンパイラスレじゃないんだから
実装するのが難しいかどうかは関係ないしどうでもいい
マルチメソッドの話題自体は歓迎するけど
自分の考えた処理系を披露したいなら別なとこでやってくれ
0458デフォルトの名無しさん
2010/11/28(日) 18:35:59> 実際、結合度の高いクラス同士だとfriendとかするしな。
しねーよ。
デバッグ機能とテスト機能以外でfriendが必要なんて
クソ設計もいいトコだ。
設計から見直せ。
0459デフォルトの名無しさん
2010/11/28(日) 19:16:16friendクラスで作ったりするけどなあ。
0460デフォルトの名無しさん
2010/11/28(日) 19:31:43その部分が密結合になってることのリスクを正確に理解した上でならいいかもしれないけどな。
俺なら、まず「設計を見直せ」とアドバイスする。
0461デフォルトの名無しさん
2010/11/28(日) 19:42:06ちょっとしたアプリケーションを作ろうとしたら、一人で書いてたとしてもすぐぶち当たる問題だと思うんだけどな。
不思議だ。
0462デフォルトの名無しさん
2010/11/28(日) 19:43:07どんな操作があったか実際に読み出せるのは、
その操作対象のオブジェクトだけ。だからfriend。
さあどうやって設計を見なおそう
0463デフォルトの名無しさん
2010/11/28(日) 20:07:00それだけだとよく分からんが、不精せずに操作要求を受け渡す窓口を作るべきなんでは。
0464デフォルトの名無しさん
2010/11/28(日) 20:16:56かといってノートPCメーカ内部でそれらの仕様を非公開のまま製造するわけでもないだろ
メンバへのアクセス制御で、利用者によって変わってくる部分の制御にfriendは使うべきってことなんじゃない?
0465デフォルトの名無しさん
2010/11/28(日) 20:23:00外部には操作要求以外の事をやってほしくないので、
操作対象のオブジェクトはconstで提供されるわけだが、
constメソッドでは外部から操作要求を達成できない。
かといってmutable使うのは何か違う気がする。
どうしよう。
0466デフォルトの名無しさん
2010/11/28(日) 20:28:030467デフォルトの名無しさん
2010/11/28(日) 20:28:27constじゃなくて、操作要求しかできないインターフェースを渡すようにすればおk
0468デフォルトの名無しさん
2010/11/28(日) 20:34:18その操作要求用のインターフェースクラスから
どんな操作要求があったかを取り出すには?
当然、操作を受け付けるオブジェクト以外には見えないようにしたい。
0469デフォルトの名無しさん
2010/11/28(日) 21:10:56操作要求を取り出せるインターフェースと取り出せないインターフェースの2つを用意して、
操作を受け付けるオブジェクトには前者、それ以外には後者を参照させるようにすればおk。
0470デフォルトの名無しさん
2010/11/28(日) 21:17:01OSGiみたいなモジュール単位で制御する仕組み欲しいよね的な話はわりとあるよね。
0471デフォルトの名無しさん
2010/11/28(日) 21:49:18DBオブジェクトとトランザクションオブジェクトがあって、
コミットするときにDBオブジェクトから要求の中身を取り出すような状況?
だとすればfriend賛成。総合的にはカプセル化を強めることができる。
同じような意味で、Factoryパターンとfriendは相性がいい。
0472デフォルトの名無しさん
2010/11/28(日) 22:29:42そういう話なら、SpringのTransactionの中身を調べてみるとかいいかもね。
0473デフォルトの名無しさん
2010/11/28(日) 23:09:00操作要求を取り出せるインターフェースと取り出せないインターフェースのデータのやりとりはどうすんのよ
0474デフォルトの名無しさん
2010/11/28(日) 23:41:29public interface ReadableQueue<T> {
T get();
}
public interface WritableQueue<T> {
void put(T request)
}
public class RequestQueue implements ReadableQueue<Request>, WritableQueue<Request> {
... (実装)
}
RequestQueue queue = new RequestQueue();
ReadableQueue readable = queue; // 読み出し側にはこのインタフェースで渡す
WritableQueue writable = queue; // 書き込み側にはこのインタフェースで渡す
0475デフォルトの名無しさん
2010/11/28(日) 23:59:490476474
2010/11/29(月) 00:46:100477デフォルトの名無しさん
2010/11/29(月) 01:02:400478474
2010/11/29(月) 01:08:060479デフォルトの名無しさん
2010/11/29(月) 21:17:35http://ufcpp.net/study/csharp/sp4_multipledispatch.html
0480デフォルトの名無しさん
2010/11/29(月) 21:44:54だが、
>ちなみに、 「dynamic の内部実装」 を呼んでもらえるとわかるんですが、 dynamic が内部的にやってることは、この if (s is ...) を動的に生成してるだけだったりもします。
これはいただけないね。
だけどここで興味深いのは、マルチメソッドの呼び出し文法だな。
(obj1, obj2).method()ではなく、func( obj1, obj2 );が採用されてる。
C#は、マルチメソッドを、動的オーバーロードとして実装したわけだ。
まー普通そう考える罠。
だけどどんどんカオスになるな。
obj1.method( (dynamic)obj2, (dynamic)obj3 );
↑3引数での多重ディスパッチ。
将来のことも考えれば、普通に、
func( obj1, obj2, obj3 );って書けたほうがよいよな。
そんで、参照に型情報持たせて、関数テーブルで多重ディスパッチできるようになるといいな。
C#に期待しとくか。
0481デフォルトの名無しさん
2010/11/29(月) 22:07:11これからどうするんだろうね。
真面目にマルチメソッドをやるなら、俺の言ってる、参照に型情報を持たせる&型推論しかありえないのだが、
いまさらそんな魔改造は無理だよな。全部捨てるしかw
0482デフォルトの名無しさん
2010/11/29(月) 22:17:08○ .NET Framework 4.0
.NET 4.0で動的型言語(IronRuby, IronPython, etc..)を正式にサポートするようになったが、
dynamicキーワードは、C#側から動的型言語のオブジェクトと連携するための機能。
http://ufcpp.net/study/csharp/sp4_dynamic.html
C#自体が静的型言語である以上、多重ディスパッチは「そういうこともできる」という以上の意味はない。
つうか、C#自体の設計は変わってないんだからfunc( obj1, obj2 )としか書きようがない、というだけの話。
まぁ、素直にPythonかRuby使っとけ。
0483デフォルトの名無しさん
2010/11/29(月) 22:38:25ifelse実装とか変だと思った。期待しないでおこう。
0484デフォルトの名無しさん
2010/11/29(月) 22:59:00> 参照に型情報を持たせる&型推論
そこまではC#の例も一緒なんだが、型情報使って分岐する以外に
コンパイラはどういうコードで動的にディスパッチすれば良いんだ?
つかな、そもそも多重ディスパッチがどうとかいう問題じゃなくて
グローバルなネームスペースで対等なオブジェクト同士が協調する時、
メソッドが
0485デフォルトの名無しさん
2010/11/29(月) 23:01:15メソッドがどのオブジェクトにも属せず宙に浮くのが問題なのであって、
マルチメソッドそのものはあまり問題じゃない。
0486デフォルトの名無しさん
2010/11/29(月) 23:37:05実際のところマルチメソッドもダックタイピングもグルー言語位でしか
使い道がなさそうだしな
0487デフォルトの名無しさん
2010/11/30(火) 00:09:431.ネームスペースに属す。
2.Cでいうstatic。ファイル単位のグローバル空間。
3.動的オーバーロードだから名前が衝突しても問題なし。
C++のテンプレートは静的オーバーロードに頼った多態を多用するけど、
何か困ったことあるか?
std::findとかstd::sortとか。
0488デフォルトの名無しさん
2010/11/30(火) 00:11:00>2.Cでいうstatic。ファイル単位のグローバル空間。
は、ファイル単位でのグローバル空間に属するようなことも出来るだろうってことね。
ファイル外には公開しない奴な。
0489デフォルトの名無しさん
2010/11/30(火) 01:42:43状態やコンテキストがごっちゃになることを防げない。
0490デフォルトの名無しさん
2010/11/30(火) 07:26:18単純にOOとPOを混ぜると設計の一貫性が無くなって分かりづらい。
std::findとかstd::sortとかはコンテナのメンバ関数から呼ぶか、
OOPしない時に使うか、のどっちかじゃない?
0491デフォルトの名無しさん
2010/11/30(火) 19:11:56それは「オブジェクトの型を (明示的に) 調べてはいけない」というルール。
このルールにより、古いコードに新しい型を「結合」できる。
マルチメソッドが密結合であるとは限らない。
0492デフォルトの名無しさん
2010/11/30(火) 19:35:330493デフォルトの名無しさん
2010/11/30(火) 20:45:37そのまま。
結合度が高くなったとは言えない。
0494デフォルトの名無しさん
2010/11/30(火) 21:08:550495デフォルトの名無しさん
2010/11/30(火) 21:15:230496デフォルトの名無しさん
2010/11/30(火) 21:34:24今さらなにを言ってるんだ
OOPがよく分からないのは当たり前だろ
0497いつもの
2010/11/30(火) 21:37:340498デフォルトの名無しさん
2010/11/30(火) 21:46:35マルチメソッド対応言語だからといって、シングルディスパッチしてはならないわけではないぞ。
update( obj )とか好きにすれば良い。
void func( obj1, obj2 )
{
set_value( obj2, get_value( obj1 ) );
}
C言語でもやってたことだろ。
ただ、関数の型に応じて関数がswitchするってだけだよ。
だいたい、
単一ディスパッチはOK、
静的オーバーロードもOK、
マルチメソッドはNG、
って主張は説明がつかないよ。
C++やJavaが単一ディスパッチなのは、単に手抜きってだけだしな。
MS的には、COMとの絡みもあるし、アレなんだろうが。
かなり昔にまで遡らないと、流れを正せないな。
まーお得意のマーシャリングでなんとかするのかね。
0499デフォルトの名無しさん
2010/11/30(火) 22:01:42どういうメリットがあんの?
マルチメソッドの機構よりもそっちを説明してくれよ
0500デフォルトの名無しさん
2010/11/30(火) 22:09:06OOP的にはメリットが無い。
OOPの縛りが無くなって、普通に戻る。ただし、OOP以上の機能は有している。
それだけ。
0501デフォルトの名無しさん
2010/11/30(火) 22:26:320502デフォルトの名無しさん
2010/11/30(火) 22:29:07struct hoge_t{ int piyo; };
init( hoge_t *hoge ){ hoge->piyo = 0; }
0503デフォルトの名無しさん
2010/11/30(火) 22:38:31OOPにマルチメソッドついただけだな
>>482じゃないがRubyかPythonつかえばいいじゃない
0504デフォルトの名無しさん
2010/11/30(火) 22:41:22あれだけはOOPの功績だよ。
GCは微妙だなぁ。
いつ開放されるか解らないし、メモリ以外のリソースが絡むと役に立たないしな。
C#も開放周りはカオスだしな。
開放用のメソッドが、スタックが巻き戻る時に呼ばれるのと、GCから呼ばれるので二つあるんだっけか。
とくに後者はいつ呼ばれるかも解らないから、バグるとデバッグ困難だしなぁ。
結局メインメモリのリソースしか面倒見てくれないってのもなんだ中途半端な感じだしなぁ。
もうちょっと上手いやりかたは無いもんかね。
CGは糞だね!って言えるような代替アイデアが思い浮かばんから困る。
0505デフォルトの名無しさん
2010/11/30(火) 22:46:020506デフォルトの名無しさん
2010/11/30(火) 22:46:39手続き型ってのは手順が明確だから良い・・・というか、それが前提なわけで。
どの順で呼ばれても良いように書かなきゃならないのは、しんどいな・・・。
C++でグローバルオブジェクトの初期化順が不定で、使い物にならないのと同じ臭いがする。
手続き型手続き型手続き型あれあれあれあれ。
0507デフォルトの名無しさん
2010/11/30(火) 22:54:39RTTIで一々型判別しなくても良くなります
0508デフォルトの名無しさん
2010/11/30(火) 23:11:16動的じゃない場合、ポインタで指せないものが色々あるので密結合になりがちである
0509デフォルトの名無しさん
2010/12/01(水) 00:40:000510デフォルトの名無しさん
2010/12/01(水) 01:44:060511デフォルトの名無しさん
2010/12/01(水) 01:47:390512デフォルトの名無しさん
2010/12/01(水) 01:50:180513デフォルトの名無しさん
2010/12/01(水) 01:52:21失笑。
0514デフォルトの名無しさん
2010/12/01(水) 01:56:070515デフォルトの名無しさん
2010/12/01(水) 02:00:140516デフォルトの名無しさん
2010/12/01(水) 02:32:02疎結合とは、コンポーネントが他のコンポーネントの定義をほとんど知らないこと。
ダックタイピングは、外部のコンポーネントに一方的に条件を突きつける。
外部で実際には何が定義されているかなど知ったことではない。
0517デフォルトの名無しさん
2010/12/01(水) 06:39:09キーが見つかればそれを呼ぶ、無ければ値がないから呼べない、という感じ
その際、相手の型なんて気にしていない、キーが存在するかどうかだけ
…というかJavaScriptがホントに連想配列とオブジェクトを同一存在として実装してるんだよな
x["hello"] = function(){ alert("Hello") }
x.hello()
なんてコードがマジでまかり通る
0518デフォルトの名無しさん
2010/12/01(水) 08:36:35Rubyといっしょだな
0519デフォルトの名無しさん
2010/12/01(水) 09:08:48ん?一緒か?
RubyのHashにキー追加してもそれはメソッドにならず
Objectにメソッド追加してもHashとしては使えないと思うが
それともダックタイピング共通の要素の部分について言ってる?
0520デフォルトの名無しさん
2010/12/01(水) 11:30:240521デフォルトの名無しさん
2010/12/01(水) 19:30:53JavaやC++信者に変な言い訳をする余地を与えてしまう。
「マルチメソッドは便利で、対象性があって綺麗かもしれないけど、
単一ディスパッチの方が、たとえ非対称でも実行効率が良いし、
目的に応じて使い分ければいいんじゃね?」
とか言い出しかねない。
だから、ハッシュじゃなくて、単純なテーブルを使った
hoge_func_vtable [ ptr1->type ][ ptr2->type ]( ptr1->pointer, ptr2->pointer );
の方が良い。
オブジェクトにvtableを持たせるのではなく、
ポインタに自分の指してる型の型情報を持たせるってのがポイント。
C++のshared_ptrで使われてる手法。
とにかく、従来のオブジェクトにvtableを持たす方法は、何の将来性もないし、
不自然だし、まずいやり方だと言うことを認識させて、改めてもらうこと。
そんで、単一オブジェクトのvtableに頼った設計も糞だと発見してもらうこと。
ポインタに型情報を持たせる方法だと、intやdoubleといった基本型での動的多態すら可能。
インスタンスが型情報を持ってるわけではなく、ポインタが型情報を持つからこれが出来る。
それが便利だって言ってる訳ではないぞ。いかに自然かって事。基本型で多態できないのは、不自然だろ。
自然な言語仕様だから、自然な思考回路になり、自然な設計が出来るというもの。
対象性のある言語に対象性のある設計。非対称性はカオスの元。
解ってて使う分には構わないのかもしれないが、毒されりゃそりゃOO脳だ。
第一引数だけ特別扱い病。第一引数に機能ぶら下げ病。
プログラム設計するときに、クラスやオブジェクトのvtalbeが頭に浮かんで、
設計=vtableを組み立てること、ってなったらもう終わり。すっかりOO廃人。
0522デフォルトの名無しさん
2010/12/01(水) 19:36:36その論だと、むしろ意識しちゃってるおまいが一番のOO廃人なんじゃね?
0523デフォルトの名無しさん
2010/12/01(水) 20:07:070524デフォルトの名無しさん
2010/12/01(水) 20:52:190525デフォルトの名無しさん
2010/12/01(水) 21:03:220526デフォルトの名無しさん
2010/12/01(水) 21:05:35「マルチディスパッチがあれば、オブジェクト指向を置き換えられる」という発想がおかしいんだな。
func1(a_t val1, b_t val2) { ... }
func2(a_t val1, b_t val2) { ... }
...
これらの関数は、どう逆立ちしたって a_t や b_t に密結合したものにならざるを得ない。
もし、どれかのデータ構造やアルゴリズムが変わったら、関連する関数を全て修正する必要が出てくる。
関数の種類 × 型同士の組み合わせの数だけそういう箇所が出てくるんだから…後は分かるな?
「メソッドはただ一つのオブジェクトに結びつく」というのは、責務を一つのオブジェクトにのみ負わせることで、
疎結合を実現するための手段なんだよ。機能を実現するために依存するオブジェクトが増えれば増えるだけ、
コードのメンテナンスは困難になる。
0527デフォルトの名無しさん
2010/12/01(水) 21:09:01NAND回路<・・・
全加算器<・・・
0528デフォルトの名無しさん
2010/12/01(水) 21:10:38func1(a_t val1, b_t val2) { set_value( val2, get_value( val1 ) ); }
とかすりゃ良いだろ。ただ、多重ディスパッチも出来ますってだけで。
第一、静的オーバーロードは既に普及している訳で。
0529デフォルトの名無しさん
2010/12/01(水) 21:13:10そんなもんは、電卓にすらある。
プログラマブルってことは、プログラムカウンタがあるってことだ。
=手続きってことだ。
0531デフォルトの名無しさん
2010/12/01(水) 21:18:34だったら、obj->set_value( hoge_t hoge )でも同じことだよ。
>「マルチディスパッチがあれば、オブジェクト指向を置き換えられる」という発想がおかしいんだな。
この発言のアホさ加減がわからないの?
単一ディスパッチは多重ディスパッチに含まれるんだよ?
多重ディスパッチで無理なことは、単一ディスパッチでも無理だよ。ちょっと考えれば・・・考えなくてもわかることだろ。
どうしたら良いんだろうね。
0532デフォルトの名無しさん
2010/12/01(水) 21:24:24Haskell<・・・
というのはともかく、コンピュータの本質は論理回路であり、
そして、論理回路そのものに手続き的な概念は存在しない。
現在のコンピュータで手続き型が自然に扱えるのは、
手続きが自然に扱えるようなアーキテクチャを持ったコンピュータが主流だから、というだけのこと。
「手続き型は手続きでプログラムできるアーキテクチャにとって自然だしな」なら使っていい。
0533デフォルトの名無しさん
2010/12/01(水) 21:26:240534デフォルトの名無しさん
2010/12/01(水) 21:27:15マルチディスパッチという方式について、>>526のどこで批判しているのか、
具体的に指してくれないか。
0535デフォルトの名無しさん
2010/12/01(水) 21:29:11こんなのしか居ないんかい。
0536デフォルトの名無しさん
2010/12/01(水) 21:31:50一行目で、
> マルチディスパッチ自体が悪いんじゃなくて、
> マルチディスパッチ自体が悪いんじゃなくて、
> マルチディスパッチ自体が悪いんじゃなくて、
と書いてあるのは読めるんだけどなぁ。
0537デフォルトの名無しさん
2010/12/01(水) 21:32:53>「マルチディスパッチがあれば、オブジェクト指向を置き換えられる」という発想がおかしいんだな。
この一文に言及しただけで。
俺がむしろ聞かなきゃならんのか。
>>534について、俺がいつそんなこと言ったんだって。もう何もかもがおかしいよ。
出鱈目すぎて会話が機能してない。
0538デフォルトの名無しさん
2010/12/01(水) 21:37:26型は変数に入れられないと考えるから密結合になる
型変数という発想ができないと疎結合は難しい
0539デフォルトの名無しさん
2010/12/01(水) 21:40:250540デフォルトの名無しさん
2010/12/01(水) 21:55:09すぐ実装よりになるし
0541デフォルトの名無しさん
2010/12/01(水) 22:00:59完全なOOPなら、マルチメソッドも実装されててしかるべきだし、
C風のスタイルが好きな人にも受け入れやすい仕組みと文法のはずなのに。
誰もが納得できそうな仕組みなのになぁ。不思議不思議
0542デフォルトの名無しさん
2010/12/01(水) 22:02:47もし引数をk個とる関数があったとして、型がt種類あったらtのk乗個のメソッドを書かなくちゃいけないの?
例:
型a, b, cのいずれか2つを取るfuncがある場合、
func(a, a) func(a, b) func(a, c) func(b, a) func(b, b) func(b, c) func(c, a) func(c, b) func(c, c)通りの組み合わせが考えられる。
引数の組み合わせ爆発で大量のメソッドを誘発する臭いがぷんぷんするのはどうにかならないわけ?
一体何がスマートに書けるのかよくわかんね。
0543デフォルトの名無しさん
2010/12/01(水) 22:06:45要求仕様がそうなら、もう仕方ないでしょ。爆発に付き合うしか。
0544デフォルトの名無しさん
2010/12/01(水) 22:11:53最近のOOPLはたいてい使えるだろ
0545デフォルトの名無しさん
2010/12/01(水) 22:12:51そもそも、それを記述できるようにしなければならないという発想が余人には理解し難い
0546デフォルトの名無しさん
2010/12/01(水) 22:14:21共通インターフェースを作って多態させる
従来のシングルディスパッチの方がスマートに書ける気がする。
0547デフォルトの名無しさん
2010/12/01(水) 22:16:33それマルチメソッドかどうかに全然関係なくないか?
ふつーのOOPLでその要求を満たそうとすると、
型a, b, cにそれぞれa, b, cを引数に取るオーバーロードされたfuncを作るんだろう
つまり
a#func(a), a#func(b), a#func(c)
b#func(a), b#func(b), b#func(c)
c#func(a), b#func(b), c#func(c)
こうなる
全くおなじ話だと思うんだが
0548デフォルトの名無しさん
2010/12/01(水) 22:21:45記述できたったて何の問題ないだろ。問題の無さこそが重要なんだと思う。
>>547
そそ、概ねそういうことが言いたかった。
要求仕様が複雑だと、どう書いても、複雑になるんだ。
問題の抱えてる本質よりは、どうあがいてもシンプルにはならないんだ。
仕様が爆発してたら、プログラムも爆発する。
言語でどうにかなるのは、せいぜい記述性だけだろう。
対象性のある言語の方が制限が少ないから素直に書き下せる可能性が高いってだけ。
0549デフォルトの名無しさん
2010/12/01(水) 22:24:050550デフォルトの名無しさん
2010/12/01(水) 22:26:20その要求仕様は、共通のインターフェースを作れるってことは、爆発してないんだよ。
マルチディスパッチは単一ディスパッチもサポートするんんだから、
共通のインターフェースを作って纏めたい場合は、それを使えばいいじゃない。
0551デフォルトの名無しさん
2010/12/01(水) 22:28:26なぜ、仕様だけは運命論的に受け入れるべきとなるのか。
0552デフォルトの名無しさん
2010/12/01(水) 22:28:49コミュニケーションは無理なんだよ。
0553デフォルトの名無しさん
2010/12/01(水) 22:32:20自分のやりたいことや、顧客からの要求なんだから、仕方ないだろ。なんじゃこりゃ
0554デフォルトの名無しさん
2010/12/01(水) 22:38:14× 自分の責務のことしか考えない
○ 全ての責務を一手に引き受けて調整しようとする試みは必ず破綻する
>>553
要求仕様から、実装しやすい設計を考えればいいじゃない。
■ このスレッドは過去ログ倉庫に格納されています