デザインパターンの単純そうな質問
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGという人のためのスレ。
0002デフォルトの名無しさん
NGNGそもそもダイナミックローディングとは、どういった操作の事をいっているのでしょうか?
ちなみに、本は、日本語版の初版です。
0003デフォルトの名無しさん
NGNG俺なんか結城さんの本を読んでもプロトタイプわからん。
0004デフォルトの名無しさん
NGNG本の話は…持ってない人が辛いんで、
該当部分を引用するとか、もしあればURLを書くとか
(英語しかなくてもとりあえずないよりはマシ)
してくれると助かる。
00052
NGNG大昔にはあったのかも知れないけれど、探したら無かった。
で、該当する箇所を引用します。
インスタンス化されるクラスが、例えば、ダイナミックローディングにより、
実行時に明らかになる場合。
(p128、デザインパターン初版、SOFTBANK社)
これだけじゃ、分からないかなぁ。やっぱり。
0006適当に
NGNGJava言語で学ぶデザインパターン入門
http://www.hyuki.com/dp/
Javaプログラマのためのデザインパターン入門
http://objectclub.esm.co.jp/DPforJavaProgrammers/DPforJavaProgrammers.html
デザインパターンの骸骨たち
http://www11.u-page.so-net.ne.jp/tk9/ys_oota/mdp/
[en]
Patterns Home Page
http://hillside.net/patterns/
00072
NGNG見た事の無いWebページもありますので、読んでみます。
ありがとう。
0008追加
NGNGデザインパターン with JAVA
http://www.ff.iij4u.or.jp/~ahirusan/Java/patterns/patternIndex.html
Javaなページ
http://home.catv.ne.jp/dd/chiba/ken/Java/JavaMain.html
デザインパターン入門 (ちとわかりずらい…)
http://www.netlaputa.ne.jp/~hijk/study/oo/designpattern.html
0009デフォルトの名無しさん
NGNG>インスタンス化されるクラスが、例えば、ダイナミックローディングにより
>実行時に明らかになる場合。
>これだけじゃ、分からないかなぁ。やっぱり。
…わかっちゃった(^^;
インスタンス1号を作るとき、そのクラスとして
後からロードされるクラスを使いましょう、って場合だ。
で、インスタンス2号を作りたくなった辺りのソースでは
インスタンス1号は(Scopeとか的に)見えているんだが
そのクラスは見えないようになっている、という場合だ。
じゃあインスタンス1号に2号を(本人と同じクラスで)
作らせちゃえばいいじゃん、という話。
喩え1:
謎の悪の組織デスト某に作られた仮面ライダ1号は
戦いに疲れて仲間が欲しくなったのだが、
いまさら謎の悪の組織に再びのこのこ出向くわけにもいかない。
しかたがないので自分の体を真似して自力で2号を作った。
喩え2:
ゲイツのソフトだろうがLinuxだろうが
元ファイルがあればピーコするのは同じ手順でできる!(わら
うーん。でもこれだと、Factory系のパターンとの違いが
際立たないというか、なんか変だな。
俺間違いかも。突っ込み歓迎。
0010さらに
NGNGhttp://piza.2ch.net/tech/kako/976/976074878.html
「デザインパターンって、○○のようなもんだよ」
http://piza.2ch.net/test/read.cgi?bbs=tech&key=994690114
mogura (2chLinuxer氏に敬礼!)
http://2ch.dyn.to/
00112
NGNG私もわかったかも。
Cloneオペレーションを定義を定義してある、Prototypeがまずある。
で、Prototypeの派生クラスConcretePrototypeA、ConcretePrototypeB
と言ったクラスがある。
ロードをする部分(メッソドやクラス)は、具象クラスの名前なりがわかっているわけだ。
でも、実際にロードされたクラスを使うクラスでは、具象クラスを知らない。
けれど、新たにインスタンスが欲しい。
しかし、具象クラスについて知らないから、コンストラクタを呼べない。
結果、複製すればいいということになる。
ポリモルフィズムで適切なCloneメソッドが呼ばれるから。
という感じ?
00122
NGNG無いから、根本的なところが間違っているかも。
00149
NGNG>インスタンス1号を作るとき、そのクラスとして
>後からロードされるクラスを使いましょう、って場合だ。
ここでいう「後」とは、そのプログラムが起動された後という意味のつもり。
動的ロードがあたりまえのように出来る言語では、
大騒ぎするような話じゃあないわな。
C++だと標準では出来ない(VCやC++Bみたいに
色々手を尽くしてそれっぽく実現してる奴はいるが)。
rubyみたいな動的でインタプリタな言語なら
とーぜんのように(すまんmatz氏)ついている機能。
喩え1や2は、そういう意味では悪くないと思う。
インスタンス1号を作る時点では、間接的にせよClassを使えたわけだ。
で、2号の辺りでは間接的だろうがなんだろうがそのClassを
「再びソース上で」呼ぶことが出来ない、という状態。
00159
NGNGまぁいいか。
>ポリモルフィズムで適切なCloneメソッドが呼ばれるから。
それそれ。
ただ、蛇足だがObjectiveCやDelphiだと
「クラスメソッドのポリモルフィズム」を使えるので、
そーいう意味でのCloneは、あんまり必要なかったりする。
#もちろん、インスタンス1号(の状態)を2号に含めたい場合は、
#ピーコ(Clone)のほうがずっと自然なやり方だが。
#今回の話はやっぱりどっちかってーとBuilder系パターンの話が
#微妙に混線してるような気がする。
Smalltalkやrubyなんかでも指摘されていることだが、
デザパタのいくつかは、対象言語の柔軟性の低さ
(つまりあるパターンを直接ライブラリ化できないこと)を
パターンということにしてカバーしている(わら)という節もある。
00162
NGNGありがとうございます。
どうにか分かりました。
>デザパタのいくつかは、対象言語の柔軟性の低さ
>(つまりあるパターンを直接ライブラリ化できないこと)を
>パターンということにしてカバーしている(わら)という節もある。
みたいですね。
私はSmalltalkは知らないのでよくわからないのですが、
「Smalltalkではあまりこの使い方に意味は無い」といった感じの
記述を、デザインパターンの本の中でしばしば見かけます。
00171
NGNGかなり人気無いな、このスレ。
ターゲットを絞りすぎたのかも。
「パターンを全般的に扱うスレ」とかにした方が、良かったかなぁ…。
0018うむ
NGNGククク・・・・
まったくわからんよ・・・
0019デフォルトの名無しさん
NGNGSingletonDialog便利(笑)
0020デフォルトの名無しさん
NGNGの工場は、
いろんな部品をまとめて提供するもの
て解釈でいいですか?
0021デフォルトの名無しさん
NGNG0022デフォルトの名無しさん
NGNGナニ(1つでも複数でも)を作るかが、
大筋は決まってるんだけど、
完全に具体的というほどにはまだ
決まってない(=Abstract)、という工場だ。
たとえばプラモ自動車用に
10種類くらいの部品を作る工場で
その設計とかも大抵出来ているし
金型まで用意済んでるんだが、
その金型にナニ色の樹脂を流しこんで製品作るか?は
まだ決まってない、みたいな工場(のクラス)。
で、その工場クラスを継承(カスタマイズ)して、
赤プラモ製造工場や、青プラモ製造工場を、作るわけな。
ところで結城氏の本。
「自分の言葉」で語っている(しかもドキュじゃない)のは
素晴らしいが、それ故なのか、時折過不足を感じる記述も有るなあ。
90点以上の出来(=並大抵のもんじゃない)なのは確かだが。
0023デフォルトの名無しさん
NGNGぜんぜん違うっていわれたけど、そうでもなかったみたい
0024名無しさん
NGNG結城氏の本は簡単でネチっこく説明してくれてるので一番良いと思った。
ところで、結城氏の本のPrototypeの説明(P75)にある
「種類が多すぎてクラスにまとめられない場合」
にProtptypeを使えと言うのが良くわかんない。
0025デフォルトの名無しさん
NGNG「デザインパターン(英語版)」のP119-120に、
Specifying new object by varying valuse.
(中略)
This kind of design lets users define new "classes" without programming.
って書いてあり、これのことを言っているのだと思う。
で、何がいっている文章かというと、例えば楽譜エディタがあった時に、音符を
表すクラスがたくさん必要になる。
二分音符クラスやら、四分音符クラスとか。
そこで、「音符クラス」を用意しておいて、異なる「長さ」と「ビットマップ」で
初期化したインスタンスを用意しておいて、それのクローンを作るようにすればいい。
…っていうようなことが書いてあるように俺には読めるのだけど、二分音符クラス
やら、四分音符クラスをまとめて「音符クラス」にするのって普通の発想だよなぁ…。
うーん。
ということで、結局俺もよく分からなかったり。
0026デフォルトの名無しさん
NGNGなるほど。prototypeの使い道がようやく見えた。
四分音符が楽譜上に置かれているとして、ユーザーがその音符をコピーしたいとき、
単純に四分音符を生成するのではなく、
とある(種類不明の)音符をコピーした結果として四分音符が生成されると。
そういうときに使うのか。
0027d
NGNGめめんと!
0028デフォルトの名無しさん
NGNGおれもめめんとなんて単語、あの本読むまで知らなかったよ
0029デフォルトの名無しさん
NGNG思っていたけど、「具象クラスを知らなくても、インスタンス化ラインスタンスが
生成できる」って側面に注目すべきだったみたいだな。
ちょい、納得。
0030デフォルトの名無しさん
NGNGちょっとずつ違う似たような図形をいっぱい並べて使うようなアプリで、
仕様のホットスポットが「図形のバリエーションが今後も追加されると思われ」
だった場合に、図形ひとつづつをいちいちサブクラスとして定義しようとすると
クラスの数が爆発してしまう。
という場合に使うと思った。
0031dこうい
NGNGこれは○○パターンだな とかわかるものなのでしょーかー
0032デフォルトの名無しさん
NGNGというか逆に、ソースコードを説明する時に、
「これは○△パターンを使って×□を処理してます」とか
設計についてミーティングする時に、
「この部分は□○パターンを使って管理しよう」とか
コミュニケーションのために使うんじゃない?
あとコードの中では意識してイディオム的なクラス名やメソッド名、フィールド名を使って
後から読む人(含む自分)に、そのコードがどういうパターンを使っているか伝わりやすい
ように工夫するとか
003330
NGNGつまり、ちょっとずつ違うたくさんのオブジェクトを扱う時に、
それぞれの違いをサブクラスとして表現するのではなく、
同じクラスのインスタンスなんだけど状態が異なるものとして表現すれば、
without programming で種類を増やせるってことね。
だから clone() は状態もコピーするってところが重要になってくる。
0034デフォルトの名無しさん
NGNG>四分音符クラスをまとめて「音符クラス」にするのって普通の発想だよなぁ…。
というかサブクラスの4分音符クラスとかを「作らない」のがあのパターンの味噌。
でも当然だが4分音符を意味するインスタンスは作れなきゃならない。
そういうインスタンスを、クラス定義レベルじゃなくて、実行時の
インスタンスいじり(属性を設定したり他のインスタンスと組み合わせたり)で
作ってしまって(ここまでならBuilderパターンだな)、
しかもそれをピーコすれば同じ「種類」のものがばんばん作れるぞ、
という話。
「種類」を「クラス」で表現しないとならん義務なんか無いよ、ってことね。
勿論、クラスで表現したほうがスッキリする場合はクラスでやるべきだけど。
-----
蛇足。ちょっとひねった使い方だと、作った二代目instanceに
prototype「元」へのポインタを持たせておいて、
共通する属性とかはそっちに委譲しちゃって
二代目は差分しか持たない、なんて手もある。
ProxyパターンやFlyweightパターンとも通じるものがある。
というか、ここまでやったら「Class」の仕掛けを自分で作っているようなもんだ。
なにせ差分プログラミングなのだから(わら
003529
NGNG>「具象クラスを知らなくても、インスタンス化ラインスタンスが
インスタンスからインスタンスが、
の間違い。
話の流れからして、どうでも良さそうだけど一応直しておきます。
0037デフォルトの名無しさん
NGNG0038デフォルトの名無しさん
NGNG0039デフォルトの名無しさん
NGNG思ったりしない?
特に途中で
if (singleton == 0)
singleton = new Singleton();
return singleton;
なんてインスタンスを作る場合は、使わなくなったら消したくなるような
0040デフォルトの名無しさん
NGNGやっぱ、プログラム終了時じゃない?
もしくは、メモリが一時的にでも足りなくなった時
0041>39
NGNG0042デフォルトの名無しさん
NGNG>>40の言う通り、普通はプログラム終了時なんだろうね。
でも、「好きにSingletonオブジェクトを消したい」という要望もあるようで、
「パターンハッチング(ピアソン社)」に一つの答えが載っている。
Singletonオブジェクトを消すためのクラスを作って、Singletonのfriendにするんだそうな。
0043>39
NGNGこれならインスタンスを参照しない限り生成されることも無いし
C++なら安全の為に、最後にClearSingletonする
SingletonDestructorクラスでも作っておけばいいかな
interface
type TSingleton = class(xxx) ... end;
function Singleton: TSingleton;
procedure ClearSingleton; // キャッシュをクリアするくらいの感覚で使う
implementation
// インスタンスの参照を管理するローカル関数
var TSingleton_Instance: TSingleton;
// singletonインスタンスの参照を取得する関数
function Singleton: TSingleton;
begin
if TSingleton_Instance <> nil then
// 既に生成されていたらそのまま返す
Result := TSingleton_Instance
else
begin // 生成されていなければ生成して返す
TSingleton_Instance := TSingleton.Create;
Result := TSingleton_Instance;
end;
end;
// 既に生成されていたら廃棄
procedure ClearSingleton;
begin
if TSingleton_Instance <> nil then
begin
TSingleton_Instance.Free;
TSingleton_Instance := nil;
end;
end;
0044デフォルトの名無しさん
NGNGクラス名は、デザインパターン日本語版、初版のP116の図のもの。
教授「FactoryMethodパターンを使うとどの部分の再利用性が上がるの?」
私 「CreatorクラスとProductクラスの組です。
Creatorクラスの責務の一部をProductクラスに委譲する構造に
します。
するとConcreteProductで、CreatorクラスとProductクラスの
組の動作をカスタマイズ(なんて言うのが適切なんだろう?)
する事が出来ます。
よって、CreatorクラスとProductクラスの組を
様々なプログラムで使い回すことが出来ます」
教授「それだけ?」
私 「え?」
教授「Clientクラス(図にはないけど、Creatorを使うクラス)と
Creatorクラスの関係に注目してみなよ」
私 「ClientクラスはCreatorで宣言されているインターフェースしか
使わない。
だからConcreteCreatorを差し替えてもClientの変更はしなくて
良い(実際はConcreteCreatorの生成部分を書き換えないといけないけど)。
だからClientの再利用性が上がる。ってことですか?」
教授「うーん。分かってないなぁ…」
私 「??」
と、言うやり取りがあったのですけど、教授の真意が分かる人は
いますか?
かなり長い間悩んでいるのだけど、私には分からない…。
その後いくつか質問した結果、
「Clientの再利用性が上がる、という事を教授は言いたいのでは
ないらしい」
と言うところまでは分かったのですが、行き詰まってます…。
0045デフォルトの名無しさん
NGNG> 「ClientクラスはCreatorで宣言されているインターフェースしか
は「Productで宣言されている…」の方がしっくりくるけど…
そんな言葉尻つかまえて「分かってないなぁ」って訳じゃないよね。
ちゃんと他に再利用性が上がる部分があるんだよね?
うーんなんだろ、帰省の長旅用に丁度良いな、これ。
>>43
くぅ、興味あるのに読めない…smalltalk?
0046デフォルトの名無しさん
NGNG0047デフォルトの名無しさん
NGNGPL/SQL
0048デフォルトの名無しさん
NGNG004943>48
NGNGDelphiの場合unit=namespaceだから
finalizationは>41のいうデストラクタにあたると言えるのかも。
0050デフォルトの名無しさん
NGNG0051デフォルトの名無しさん
NGNG>は「Productで宣言されている…」の方がしっくりくるけど…
ClientはProductのインターフェイスを直接使用する必要は無いよ。
(元の記述のほうが正しい)
普通はCreatorの固定実装部分がProductのインターフェイスを使うね。
もちろんGoF本の「結果」の2で書かれているように、Productのインスタンスを
Client側に返すようなことがある場合はその限りじゃないけど。
> Clientの再利用性が上がる
これは変でしょ。いやある意味正しいかもしれんけど。ConcreteProductを
差し替えることでClientの変更なしに振る舞いを変えた別のアプリケーションを
作るみたいな文脈ではそういえるし。
明らかに再利用されるのは、Creatorの固定実装部分と思うけどどうよ。
大体Creatorって名前は適切じゃないかもしれんね。anOperation内部に
あるStrategyのような構造こそ重要と思う。
乱文ゴメソ
0052Delphiを知らない名無しさん
NGNG> ClientはProductのインターフェイスを直接使用する必要は無いよ
スマソ。仰るとおりパラレルなの(邦訳GoF本P118)が頭にあったから…。
「Creatorの固定実装部分」ってのはanOperationの実装部を受け持つ
productのことだよね?そうなら漏れも激しく同意。(anがAnじゃ無いのも同意(w
狭義で再利用って言葉使うなら、適用箇所はProductの抽・具部分のみだと思う。
というか広義で再利用って言ったら、なんでも再利用できるからなぁ(w
ただ44教授の意図は分からずじまいか。…直接、訊いて教えてくれ〜
005351
NGNG>「Creatorの固定実装部分」ってのはanOperationの実装部を受け持つ
>productのことだよね?
「実装部を受け持つproduct」ってのはちょっと意図を汲みかねるけど、
漏れの言うのはanOperationの実装そのものが直接的な再利用対象で、
Productの実装は差し替わるわけだから「再利用」とはちょっと違う。
Productは実装無し(interface)であっても構わないことに注目。
なお、こんなことが教授が言いたかった事であるかは疑問なので
(なぜならこのことは「それだけ?」で切り捨てられた主張に含ま
れるとも考えられるから)、漏れ的には教授が解って無い可能性
に+1(藁
デザインパターンって誤解/曲解+宗教的なのが多くなりがちなので。
漏れが解っていない「最も重要な再利用性」があるならそれを知
ることができれば万々歳なので煽っとく(藁
ちなみに「再利用」には実装の再利用とインターフェイスの再利用、
そして構造の再利用があると考えるが、教授はどの「部分」と言っ
てるので「構造」のことじゃないんだろう。じゃ、ここまでにでて
きた事以外に後何があるかねぇ。
005444
NGNGと似た感じの話でいいのでしょうか?
>>51さんの言うようにStrategy的というのと、ほぼ同等の話であるとは思うのですが。
デザインパターン日本語版(P349)の図で言うと、AbstractClassの持つメソッド、
PrimitiveOperation1、PrimitiveOperation2をProductクラスに
持たしてしまいます。
CreatorはTemplateMethod(anOperationに相当)で
Productクラス(の派生クラス)のPrimitiveOperation1、PrimitiveOperation2を
使う、ってつもりで私は理解しています。
>漏れ的には教授が解って無い可能性 に+1(藁
実は、その可能性を私も疑っていたりします(笑)。
他の可能性としては、
1.私が教授の質問の意図を誤解している。
実は、言葉通りの質問ではなくて遠まわしに別のことを言っているのかも。
2.実はFactoryMethod特有のことと、あんまり関係ない質問である。
もっと、シンプルなことを聞いているのかもしれない。
>そして構造の再利用があると考えるが、教授はどの「部分」と言っ
>てるので「構造」のことじゃないんだろう。
教授は気がつくと話が勝手に展開しているので、もしかすると「構造」なのかも
しれません。
けど、私は「教授はクラス単位の再利用について、私に聞いているのだろう」と
思ったのですけどね。
>>52
>ただ44教授の意図は分からずじまいか。…直接、訊いて教えてくれ〜
教授が基本的には、「あっている」「間違っている」としか言わない人なので、
いつになったら教授の意図が掴めるのやら…。
また、進展があったら書きます。
0055デフォルトの名無しさん
NGNGまとめること自体に価値があるだけで, その成果物に価値はなし.
ありがたがってるような奴は, それだけの奴.
0056Delphiを知らない名無しさん
NGNGパラレルじゃ無い場合、Creatorはコンポジションとしてもっているproductインター
フェイスを使ってanOperationを実装する……のじゃないのか…、うーん曲解してるかも
>>54
ウチの教授は質問すると延々と語るタイプだよ。頭のいい人に質問するのは骨だよね
>>55
うはぁ、まさに漏れのことだ。でも自分で設計したのも、大体において主要
デザインパターンのいずれかに収束しない?やっぱなかなかの車輪だと思うけど…
いずれにせよこのスレもう少し賑わって欲しいなぁ。それこそウワベのパターンだけでなく
本質を見抜く手がかりになるし。頭のいい人達でパターン毎に議論してくれないかな。
…私はDOMに戻るので
0057デフォルトの名無しさん
NGNGうっ。耳が痛いです。
でも、逆に「デザインパターンを使う事で、センスの無い人もそれなりの設計が
出来る」なら、私はデザインパターンに意味はあると思います。
「デザインパターンを意識する事で、うまく設計できる人が増えるのか?」って
聞かれると、私はなんとも言えませんけれども。
005851
NGNG>フェイスを使ってanOperationを実装する……のじゃないのか…、うーん曲解してるかも
あってるけど?誤解があるとしたら、56はCreatorのサブクラスでanOperation
をオーバライドすることを前提としているような気がするけど、GoF本定義の
Factory Methodパターンではそうじゃないって事かな。
>>54
教授が「間違っている」としか言わないのだとしたら、44の問い方に自信
がなかったからかもしれないね。
自分がどこまで理解してこのような回答に行き着いたかをきっちり説明
できているなら、その誤りの理由を説明するのが教師の義務と思うし。
こっちがちゃんと説明できている自信があるのに、納得できる説明をし
てくれないようなら、俺ならふーんその程度かぁって判断するなぁ。
>>55
デザインパターンはコミュニケーションの為のものだから、「デザイン
パターンを意識しないと設計できない」のは駄目だが、デザインパターン
を知らない/曲解しているのも困り者。
Factory Methodパターンはその典型なんだけど、今時はGoF自信も
A a = B.create();
なんてのをFactory Methodパターンと呼ぶ事を認めているらしいから…。
0059デフォルトの名無しさん
NGNGってクラスが10個あって、各々のインスタンスの数を10個に制限した
いけどどうやんの?
class a
{
private static a[] = new a[]
{
new a(), new a(), new a(), new a(), new a(),
new a(), new a(), new a(), new a(), new a(),
};
private a(){}
}
ってのを各々のクラスに書かないとだめ?
(インスタンスを識別するのにintを使いますがここでは省略しました)
0060デフォルトの名無しさん
NGNGprivate static int instance_count
a(){ instance_count++; }
~a(){ instance_count--; }
ってやってinstance_countが10超えたらコンストラクタ内で例外をthrowする
0061デフォルトの名無しさん
NGNG質問すら満足にできなくてすみません。
>>60
10個に制限するにはそうしますよね。
>>59で、
>各々のインスタンスの数を10個に制限した いけどどうやんの?
とか言っておきながら聞きたかったのはこれではなく、
10個のクラスにほとんど同じコードを書かないとだめなのか
なーと疑問に思ったので。
たとえば、bクラスは、
class b
{
private static b[] = new b[]
{
new b(), new b(), new b(), new b(), new b(),
new b(), new b(), new b(), new b(), new b(),
};
private b(){}
}
これが延々と続く・・・(クラス10個・・・)。
結局、最初の段階でおかしいのかな・・・。
OOわからない・・・。
・・・。
0062デフォルトの名無しさん
NGNGお帰りはこちら
http://www.mycgiserver.com/~phpmona/zoids0/ch_list.php4
0063デフォルトの名無しさん
NGNGstaticフィールドやstaticメソッド「の」overrideを
サポートしてない言語が多いんで、こういう場合はウザイよね。
仕方ないから小技を使おう。
俺なら(言語に拠るが)こうするね。
10個のクラスの上位にクラスxを作る。
そのクラスのstaticフィールドとしてHashを作る。
Hashには、KeyとしてそのClassObject(またはその代用として
Class名やClass番号)を、Valueとして長さ10の配列Objectを、突っ込む。
勿論そのHashのエントリはここでは10個になるわけだ。
で、Instanceを作るたびに、自分のClassをKeyにしてHashを参照し、
Valueである配列に、InstanceをAddする。
配列が予定したN個を越えていたら、例外で蹴る。
どうよ?
0064デフォルトの名無しさん
NGNGどっちかというと、コンストラクタはprivateにして、Singleton
のようにgetInstance()で制御する方がなんとなくいいような気がする。
別にいいけど。
0065デフォルトの名無しさん
NGNGλ
( ヽ / ̄ ̄ ̄ ̄ ̄
( ゚Д゚ )< Rubyはクソです。ゴミ箱逝きです。 いじょ
(____) \_____
ヽ(´ー`).ノ
( へ)
く
- = ≡三 λ
_ = ≡三 ( ヽ / ̄ ̄ ̄ ̄ ̄
(´ー`) = ≡三 ( ゚Д゚ )< この発言をコピペしていただければ幸いです。
( ヽ ヽ) - = ≡三 (____) \_____
/ > - = ≡三
0066デフォルトの名無しさん
NGNGそういう風にしたいなら、親クラスで
class Parent
{
public Parent getInstance() {
//instanceNumberを参照して10個以内に抑える
}
public static int MAX_INSTANCE_NUMBER=10;
private int instanceNumber;
private Parent(){}
}
んで、他はこのクラスを継承させる、ってのがいいような気がする。
0067Ruby!
NGNGJava
なにかと話題のオブジェクト指向言語であるJavaとRubyを比較すると:
* Rubyはインタプリタ型言語。
* Rubyではすべてのデータがオブジェクトである。
* Rubyではモジュールを使って実装を共有できる。
* Rubyの変数や式には静的な型がない。
* Rubyでは正規表現が文法としてサポートされている。
http://www.ruby-lang.org/ja/compar.html
Rubyを知ってもらうためにもこの文をコピペしてください。
0068デフォルトの名無しさん
NGNG大嘘だった。継承するには継承もとのコンストラクタがprivateじゃ
まずいか。getInstance()にしたって、親クラスのインスタンス
そのものが返されるのじゃ意味ないし。。。
こりゃ、親クラス作らずにそれぞれのクラスで実装するしか
ないか?
0069たぶん
NGNGもっと詳細に書かない限り最適解は出ないに一票
0070デフォルトの名無しさん
NGNG――――――――――――――――――――――
番組の途中ですが、臨時ニュースです。
「Rubyはクソです。ゴミ箱逝きです。 いじょ 」
この発言をコピペしていただければ幸いです。
___________ __________
‖ \|________
‖ | ON AIR.|
‖  ̄ ̄ ̄ ̄
./ ̄ ̄θ Λ_Λ
.../ //(´∀` )/|
./  ̄/⊂ ||_/
| ̄ ̄ ̄ ̄ ̄| ( ━┳┛
|_____| /ヽ」┘┻
0071デフォルトの名無しさん
NGNG番組の途中ですが、臨時ニュースです。
「Rubyはクソです。ゴミ箱逝きです。 いじょ 」
この発言をコピペしていただければ幸いです。
___________ __________
‖ \|________
‖ | ON AIR.|
‖  ̄ ̄ ̄ ̄
./ ̄ ̄θ ∧_∧
.../ //(´∀` )/|
./  ̄/⊂ ||_/
| ̄ ̄ ̄ ̄ ̄| ( ━┳┛
|_____| /ヽ」┘┻
0072デフォルトの名無しさん
NGNGインスタンスを獲得するようにします。
0073デフォルトの名無しさん
NGNGstaticメソッドを使うのはだめでしょうか?
初期化の順序が重要なときに使えないのは分かりますが、
他にどんなデメリットがありますか?
0074デフォルトの名無しさん
NGNG言いたいことが理解できない(というか、何通りかに解釈できる)ので、サンプル
コードを希望。
C++ に関して言えば static メソッドは virtual 指定できないので、微妙に使いづ
らい。
0075デフォルトの名無しさん
NGNG> らい。
何かが根本的に間違ってる気がするが。
0076デフォルトの名無しさん
NGNG初期化の順序ってどういうこと?(Java屋には無縁?)
007773
NGNG言いたいことが分からないと言われても…
Cならグローバル関数になるような場合でもSingletonにしたほうが
よいのかな?と。
virtualを使いたいときに困るというのは分かりました。
Singletonでvirtualを使うときってどういう場合があるか思いつきませんが。
>>76
>まず、それがインスタンスである必然性があるかどうか、だ。
なるほど。ただSingletonの説明用サンプルってその必然性が
あまり感じられないんですけど。
>初期化の順序ってどういうこと?(Java屋には無縁?)
C++での話です。
class Hogeがあったときに、トップレベルで、
Hoge theHoge;
とかすると、コンストラクタが起動する順序を制御できない
という話だったと思います。
オブジェクト指向に不慣れなもので何か間違っているかもしれません。
0078デフォルトの名無しさん
NGNGA global_a;
B global_b;
これで global_a, global_b の間に依存関係がある場合(たとえば global_b の
コンストラクタ中で global_a を使ってる場合)、本来は
1. まず global_a を初期化
2. 次に global_b を初期化
とならないと困る。
C++ の仕様では、同一の翻訳単位にある非ローカルオブジェクトに関しては
定義順に構築されることが保証されているけど、翻訳単位が異なる場合には
初期化順序は保証されないので、まずい。
常套手段としては、グローバルスコープでインスタンスを宣言せずに、関数
ローカルに宣言することかな。
A& GetSingletonA()
{
static A a;
return (a);
}
こうすると、初めて GetSingletonA() が呼ばれた直後に、関数内で定義された
インスタンス a が構築されることが保証される。
あとは、処理系独自の拡張機能で、初期化順序を指定できる場合もある。
>>73
- インスタンスが解体される順序を指定できない。
- インスタンスの解体は main() から抜けた後に行われるため、エラー回復
は絶望的。デバッグするのも不可能な場合がある。
007974=78
NGNGstatic メソッド/グローバル関数と Singleton を対比しているのが謎なんだけど。
- データが絡まない単純な手続きだけなら、普通に関数にしておけば良い。
- データが絡むなら Singleton にすれば? 具体的な方法は >>78 で書いた通り
008076
NGNG初期化の順序なんていくらでも制御できると思ってたけど。GoF本の「実装」節もまさにそのとおりだし。
グローバル変数で実体が作れるならSingletonであることを保証できないんじゃないの?
ま、>>78にある通り後処理の問題もあるから単にGoF本通りの実装にもならないかもしれんけど、
その辺のC++流儀までは知らないや。
>>77
インスタンスである必然性とは、GoF本の「結果」の5に書いてある通り、インスタンス数を1以外に
したい場合と、サブクラス化の可能性がある場合のみ。
そうでなければ全部グローバルな関数(static)として実装してもかまわない。そのへんはもう趣味
の範疇だよ。(というのはJava屋だからいえる。C++では後処理の考慮はいるね)
0081デフォルトの名無しさん
NGNG普通、そういうときは別途初期化関数を用意しないか?
コンストラクタでなんでもやりすぎなだけじゃないかな。
008276
NGNG取り敢えずグローバルな実体オブジェクトは違うかなと。
0083Delギコ
NGNG| |Д゚) < 聞いてもいい?
| ⊂| \________
| | |
| |U
 ̄ ̄ ̄ ̄ ̄
結城先生タンのJavaデザパタ入門読んでるんだけど
ガベコレのない言語では
Iterator it = bookShelf.iterator();
while (it.hasNext()) {
Book book = (Book)it.next();
System.out.println("" + book.getName());
}
bookShelf.deleteiterator();
この最後のdeleteiteratorが必要って事でいいのですか?
0084Delギコ
NGNG(゚Д゚ ,,)< なるほど!
_φ_⊂)__ \_______________
/旦/三/ /|
| ̄ ̄ ̄ ̄ ̄| | Javaのトークナイザを実装するためには
|愛媛みかん |/ , DelphiのCommaTextをAdapterに当てはめるとイイのか...
 ̄ ̄ ̄ ̄ ̄
GUI部品については委譲によるAdapterは不可能だぞっと。
Interfaceがあってヨカタヨカタ...
デザパタってInterfaceが無いと実践が難しくないですか?
008576
NGNGそれをやるなら、bookShelf.deleteIterator()ではなく、delete it; (C++の場合)でしょう。
Iteratorのインスタンスはiterator()メソッドが呼ばれるごとに生成するのが普通であり、
返されたIteratorオブジェクトはbookShelfの手を離れます。
ただ、どっちにしてもクライアント(呼び出し元)に削除の責任を負わせるのは大変なので、
GoF本ではIteratorPtrという実装例が紹介されていますね。(SmartPtrみたいなもの)
>>84は何言ってるかよくわかんなかったよ。
0086Delギコ
NGNG_ /⊂ `∧ ∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | \( ゚Д゚)< ありがとございます。>>85さん
| / ∪ ∪ \_____________
 ̄
その結城さんのJavaデザパ本には"deleteIteratorメソッドはJavaの場合必要ない"
と書かれていたので,bookShelfのメソッドかと思ったのですが
そういえば it を削除した方が話が早いですね。
>>84ではちょっと意味不明の事言ってしまいすいません。
このスレのログを見るとDelphiの人もいらっしゃるのですね。
>GoF本ではIteratorPtrという実装例が紹介されていますね。(SmartPtrみたいなもの)
auto_ptrみたいなものでしょうか?
ガイシュツだったらすいません。
008776
NGNGスコープはずれたら自動的にデストラクタ呼ばれるようにする仕組みね。
おれ本読んでないんだけどそんなこと書いてんのか>有機本
008876
NGNGおいらはDelphi知らないけど、interfaceが無いと難しいってのはデザインパターンで行われているような
構造を発案するのが難しいって意味かな?それはあると思う(interfaceという言語の仕組みがあると頭
を整理しやすいという意味)。
でも「実践」が、デザインパターンの適用のことを指しているのだとしたら、それはinterfaceという仕組み
がなくても大した問題じゃない。これはSmalltalkを考えれば解るかと。
多重継承なしでinterfaceも無し、おまけにstrongly typeだったりしたら、さすがに「実践」も難しいだろうね。
0089デフォルトの名無しさん
NGNG> 多重継承なしでinterfaceも無し、おまけにstrongly typeだったりしたら、さすがに「実践」も難しいだろうね。
off topic だけど、C 言語で多態を実装する手段として、関数ポインタを並べた構造体
が使われてますね。
下のコードは UNIX Version 6 からの抜粋ですが、今の UNIX も基本的な考え方は
変わってないです(もっとも機種やバス依存性を抑えるために、高度に抽象化されて
ますけど)。
struct bdevsw {
int (*d_open)();
int (*d_close)();
int (*d_strategy)();
int *d_tab;
} bdevsw[];
OOPLを使うと、従来はコールバック関数や関数ポインタを使って書いてた部分が
スマートに書けるのが便利。構造体を埋める代わりに継承、Enum*() でコールバッ
ク関数を呼び出す代わりに iterator と、ね。
0090Delギコ
NGNG∧∧ / ̄
( _(,,゚Д゚) < サンクスです。
⊂,,__つつ. \_
このスレはsage進行なんですね。
>そんなこと書いてんのか>有機本
deleteiteratorのこと書いてありますが、たかだか3行で
タブンC++知っててJavaをあまり知らない人に
ちょこっとせつめい程度に書かれたもののようなので、問題ないです。
>スコープはずれたら自動的にデストラクタ呼ばれるようにする仕組みね。
これをDelで実践するのは出来なくはないらしいですが面倒みたいです。
C++のauto_ptrも実装した人は面倒だったのかな。
>多重継承なしでinterfaceも無し、おまけにstrongly typeだったりしたら、さすがに「実践」も難しいだろうね。
strongly typeっていうのがよくわかりませんが
Delは多重継承なしで
interfaceはサイキンのVersionになってから実装され
COM周りにからんでGUIDというみょうちくりんな数字が入るので、あまり使われていないみたいっす。
デザパタをやるにはInterfaceは積極的に利用しなければいけなさそうですね。
上の>>43などであがってますが
Singletonなんかも、DelにはコンストラクタのStatic宣言が出来ない(と思う)ので
なんか変な実装になってしまうなあ。
デザパタを勉強していても、妙に実装依存してしまう気がする…
0091デフォルトの名無しさん
NGNG>>スコープはずれたら自動的にデストラクタ呼ばれるようにする仕組みね。
>これをDelで実践するのは出来なくはないらしいですが面倒みたいです。
Delphiでもinterface相手だとスコープ抜けるだけで確実にRelease呼んでくれるから
interfaceにしてReleaseを自分で実装しちまえばいいってかんじ?
>C++のauto_ptrも実装した人は面倒だったのかな。
C++はもともとスタック上オブジェクトはスコープ出るときにdestructor呼ばれるから
スタック外オブジェクトもスタックオブジェクトで包むだけでいいから比較的簡単だね。
0092Delギコ
NGNG∧ ∧ /
( ゚∀゚) < そういう仕組みでしたか。
| つ[|lllll]).\ ニャルホド
〜| |
∪∪
>C++はもともとスタック上オブジェクトはスコープ出るときにdestructor呼ばれるから
そうか。おっしゃるとおりでゴザイマス。
∧ ∧ / Prototypeを勉強しました。
(,,゚Д゚) < CloneメソッドなんてのはDelphiでどやって実装しますでしょう。
|つ つ \ サブクラス側で実装しておく必要があるのでしょうか。
@| | JavaでもCloneをオバライドするのと一緒かな??
∪∪
あと、interface変数にオブジェクトを代入したりも出来ないような
気がするのですが・・・
Prototypeの実装ってDelで出来るものなんでしょうか。
0093デフォルトの名無しさん
NGNGあれぐらいモデリングをしっかりすれば自分で考え出せるだろう。
デザパタの意義は、カタログにしたその取り組みにあるだけ。
0094デフォルトの名無しさん
NGNGその「自分で考え出す」手間を省くためのデザパタだろう。
さらに「自分で考え出したパターンを他人に説明する」手間も省ける。
そのためのデザインパターンだ。
もしかして車輪の再発明大好きな人デスカ?
0095デフォルトの名無しさん
NGNG同僚にでも読まそうとするのかモナ。
0096デフォルトの名無しさん
NGNGと、自分の知らない有名なパターン(非GoF)を挙げられる。
に200オクタット。
0097デフォルトの名無しさん
NGNGコピペしてる人間に言われたくないね。
0098デフォルトの名無しさん
NGNG0099デフォルトの名無しさん
NGNGPLoP Japan
http://www.kame-net.com/jplop/
「プログラムデザインのためのパターン言語」
http://www.amazon.co.jp/exec/obidos/ASIN/4797314397/ref=pd_sim_b_dp_1_2/250-7533692-1453818
0100デフォルトの名無しさん
NGNG「プログラミングデザインのためのパターン言語」
はACEフレームワークに使われているパターンが中心やね。
分散処理のパターンとかネットワーク関連の人には
結構参考にはなると思われ。
010199
NGNGそうですね。GoF本のような一般的なデザインパターンはそれほど多くはない
ですね。今本が手元にないのですが、Null ObjectパターンとActive Object
パターンくらいしか思い出せません。
後半には開発プロセスのパターンとかフレームワーク進化のパターンとか、
面白いけどこっちが期待しているのとは異なるものも入ってたりします。
■ このスレッドは過去ログ倉庫に格納されています