トップページ⇒tech
1001コメント384KB

デザインパターンの単純そうな質問

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
GoFのデザインパターンを読んだけど、分からない事があるよ〜
という人のためのスレ。
0002デフォルトの名無しさんNGNG
PROTOTYPEパターンの適用可能性の最初の項目が何をいいたいのか分かりません。
そもそもダイナミックローディングとは、どういった操作の事をいっているのでしょうか?

ちなみに、本は、日本語版の初版です。
0003デフォルトの名無しさんNGNG
>>2
俺なんか結城さんの本を読んでもプロトタイプわからん。
0004デフォルトの名無しさんNGNG
あれれ?デザパタスレって、まだ無いんだっけ!

本の話は…持ってない人が辛いんで、
該当部分を引用するとか、もしあればURLを書くとか
(英語しかなくてもとりあえずないよりはマシ)
してくれると助かる。
00052NGNG
>>4
大昔にはあったのかも知れないけれど、探したら無かった。

で、該当する箇所を引用します。

インスタンス化されるクラスが、例えば、ダイナミックローディングにより、
実行時に明らかになる場合。
(p128、デザインパターン初版、SOFTBANK社)

これだけじゃ、分からないかなぁ。やっぱり。
0006適当にNGNG
[ja]
Java言語で学ぶデザインパターン入門
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/
00072NGNG
>>6
見た事の無いWebページもありますので、読んでみます。
ありがとう。
0008追加NGNG
[ja]
デザインパターン 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
>>5
>インスタンス化されるクラスが、例えば、ダイナミックローディングにより
>実行時に明らかになる場合。
>これだけじゃ、分からないかなぁ。やっぱり。

…わかっちゃった(^^;

インスタンス1号を作るとき、そのクラスとして
後からロードされるクラスを使いましょう、って場合だ。

で、インスタンス2号を作りたくなった辺りのソースでは
インスタンス1号は(Scopeとか的に)見えているんだが
そのクラスは見えないようになっている、という場合だ。

じゃあインスタンス1号に2号を(本人と同じクラスで)
作らせちゃえばいいじゃん、という話。

喩え1:
謎の悪の組織デスト某に作られた仮面ライダ1号は
戦いに疲れて仲間が欲しくなったのだが、
いまさら謎の悪の組織に再びのこのこ出向くわけにもいかない。
しかたがないので自分の体を真似して自力で2号を作った。

喩え2:
ゲイツのソフトだろうがLinuxだろうが
元ファイルがあればピーコするのは同じ手順でできる!(わら

うーん。でもこれだと、Factory系のパターンとの違いが
際立たないというか、なんか変だな。
俺間違いかも。突っ込み歓迎。
0010さらにNGNG
デザインパターン
http://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/
00112NGNG
>>9
私もわかったかも。

Cloneオペレーションを定義を定義してある、Prototypeがまずある。
で、Prototypeの派生クラスConcretePrototypeA、ConcretePrototypeB
と言ったクラスがある。

ロードをする部分(メッソドやクラス)は、具象クラスの名前なりがわかっているわけだ。

でも、実際にロードされたクラスを使うクラスでは、具象クラスを知らない。
けれど、新たにインスタンスが欲しい。
しかし、具象クラスについて知らないから、コンストラクタを呼べない。

結果、複製すればいいということになる。
ポリモルフィズムで適切なCloneメソッドが呼ばれるから。

という感じ?
00122NGNG
 ただ、クラスをダイナミックローディングする仕組みを使ったことが
無いから、根本的なところが間違っているかも。
0013デフォルトの名無しさんNGNG
>>8
>>10
親切な人だ。
ありがとうございます。
00149NGNG
書き方がいまいち悪かったと反省。

>インスタンス1号を作るとき、そのクラスとして
>後からロードされるクラスを使いましょう、って場合だ。

ここでいう「後」とは、そのプログラムが起動された後という意味のつもり。
動的ロードがあたりまえのように出来る言語では、
大騒ぎするような話じゃあないわな。
C++だと標準では出来ない(VCやC++Bみたいに
色々手を尽くしてそれっぽく実現してる奴はいるが)。
rubyみたいな動的でインタプリタな言語なら
とーぜんのように(すまんmatz氏)ついている機能。

喩え1や2は、そういう意味では悪くないと思う。
インスタンス1号を作る時点では、間接的にせよClassを使えたわけだ。
で、2号の辺りでは間接的だろうがなんだろうがそのClassを
「再びソース上で」呼ぶことが出来ない、という状態。
00159NGNG
ごちゃごちゃ言うまでもなく11で既に判ってるようなんで
まぁいいか。

>ポリモルフィズムで適切なCloneメソッドが呼ばれるから。

それそれ。

ただ、蛇足だがObjectiveCやDelphiだと
「クラスメソッドのポリモルフィズム」を使えるので、
そーいう意味でのCloneは、あんまり必要なかったりする。

#もちろん、インスタンス1号(の状態)を2号に含めたい場合は、
#ピーコ(Clone)のほうがずっと自然なやり方だが。
#今回の話はやっぱりどっちかってーとBuilder系パターンの話が
#微妙に混線してるような気がする。

Smalltalkやrubyなんかでも指摘されていることだが、
デザパタのいくつかは、対象言語の柔軟性の低さ
(つまりあるパターンを直接ライブラリ化できないこと)を
パターンということにしてカバーしている(わら)という節もある。
00162NGNG
>>15
ありがとうございます。
どうにか分かりました。

>デザパタのいくつかは、対象言語の柔軟性の低さ
>(つまりあるパターンを直接ライブラリ化できないこと)を
>パターンということにしてカバーしている(わら)という節もある。
みたいですね。
 私はSmalltalkは知らないのでよくわからないのですが、
「Smalltalkではあまりこの使い方に意味は無い」といった感じの
記述を、デザインパターンの本の中でしばしば見かけます。
00171NGNG
たまには上げてみる。
かなり人気無いな、このスレ。
ターゲットを絞りすぎたのかも。
「パターンを全般的に扱うスレ」とかにした方が、良かったかなぁ…。
0018うむNGNG
さいきんデザインパターンを勉強しはじめたが・・・・

ククク・・・・
       まったくわからんよ・・・
0019デフォルトの名無しさんNGNG
Singletonパターンしか使ってないなぁ・・・・。
SingletonDialog便利(笑) 
0020デフォルトの名無しさんNGNG
AbstractFactory
の工場は、
いろんな部品をまとめて提供するもの
て解釈でいいですか?
0021デフォルトの名無しさんNGNG
>>20 全然違う。
0022デフォルトの名無しさんNGNG
>>20
ナニ(1つでも複数でも)を作るかが、
大筋は決まってるんだけど、
完全に具体的というほどにはまだ
決まってない(=Abstract)、という工場だ。

たとえばプラモ自動車用に
10種類くらいの部品を作る工場で
その設計とかも大抵出来ているし
金型まで用意済んでるんだが、
その金型にナニ色の樹脂を流しこんで製品作るか?は
まだ決まってない、みたいな工場(のクラス)。

で、その工場クラスを継承(カスタマイズ)して、
赤プラモ製造工場や、青プラモ製造工場を、作るわけな。

ところで結城氏の本。
「自分の言葉」で語っている(しかもドキュじゃない)のは
素晴らしいが、それ故なのか、時折過不足を感じる記述も有るなあ。
90点以上の出来(=並大抵のもんじゃない)なのは確かだが。
0023デフォルトの名無しさんNGNG
ありがとう!
ぜんぜん違うっていわれたけど、そうでもなかったみたい
0024名無しさんNGNG
Javaをつかったデザインパターンの本は3冊読んだけど
結城氏の本は簡単でネチっこく説明してくれてるので一番良いと思った。

ところで、結城氏の本のPrototypeの説明(P75)にある
「種類が多すぎてクラスにまとめられない場合」
にProtptypeを使えと言うのが良くわかんない。
0025デフォルトの名無しさんNGNG
>>24
「デザインパターン(英語版)」のP119-120に、
Specifying new object by varying valuse.
(中略)
This kind of design lets users define new "classes" without programming.
って書いてあり、これのことを言っているのだと思う。

で、何がいっている文章かというと、例えば楽譜エディタがあった時に、音符を
表すクラスがたくさん必要になる。
二分音符クラスやら、四分音符クラスとか。

そこで、「音符クラス」を用意しておいて、異なる「長さ」と「ビットマップ」で
初期化したインスタンスを用意しておいて、それのクローンを作るようにすればいい。

…っていうようなことが書いてあるように俺には読めるのだけど、二分音符クラス
やら、四分音符クラスをまとめて「音符クラス」にするのって普通の発想だよなぁ…。

うーん。
ということで、結局俺もよく分からなかったり。
0026デフォルトの名無しさんNGNG
>>25
なるほど。prototypeの使い道がようやく見えた。
四分音符が楽譜上に置かれているとして、ユーザーがその音符をコピーしたいとき、
単純に四分音符を生成するのではなく、
とある(種類不明の)音符をコピーした結果として四分音符が生成されると。
そういうときに使うのか。
0027dNGNG
めめんと!
めめんと!
0028デフォルトの名無しさんNGNG
>>27
おれもめめんとなんて単語、あの本読むまで知らなかったよ
0029デフォルトの名無しさんNGNG
Prototypeって、「インスタンスのコピーをして何が面白いんだろう?」って
思っていたけど、「具象クラスを知らなくても、インスタンス化ラインスタンスが
生成できる」って側面に注目すべきだったみたいだな。
ちょい、納得。
0030デフォルトの名無しさんNGNG
GoF本(和訳第二版)を読んだけど、Prototypeパターンは

ちょっとずつ違う似たような図形をいっぱい並べて使うようなアプリで、
仕様のホットスポットが「図形のバリエーションが今後も追加されると思われ」
だった場合に、図形ひとつづつをいちいちサブクラスとして定義しようとすると
クラスの数が爆発してしまう。

という場合に使うと思った。
0031dこういNGNG
ソースみただけで
これは○○パターンだな とかわかるものなのでしょーかー
0032デフォルトの名無しさんNGNG
>>31
というか逆に、ソースコードを説明する時に、
「これは○△パターンを使って×□を処理してます」とか
設計についてミーティングする時に、
「この部分は□○パターンを使って管理しよう」とか
コミュニケーションのために使うんじゃない?

あとコードの中では意識してイディオム的なクラス名やメソッド名、フィールド名を使って
後から読む人(含む自分)に、そのコードがどういうパターンを使っているか伝わりやすい
ように工夫するとか
003330NGNG
ちょっと補足
つまり、ちょっとずつ違うたくさんのオブジェクトを扱う時に、
それぞれの違いをサブクラスとして表現するのではなく、
同じクラスのインスタンスなんだけど状態が異なるものとして表現すれば、
without programming で種類を増やせるってことね。

だから clone() は状態もコピーするってところが重要になってくる。
0034デフォルトの名無しさんNGNG
出遅れっぽいけど、

>四分音符クラスをまとめて「音符クラス」にするのって普通の発想だよなぁ…。

というかサブクラスの4分音符クラスとかを「作らない」のがあのパターンの味噌。

でも当然だが4分音符を意味するインスタンスは作れなきゃならない。

そういうインスタンスを、クラス定義レベルじゃなくて、実行時の
インスタンスいじり(属性を設定したり他のインスタンスと組み合わせたり)で
作ってしまって(ここまでならBuilderパターンだな)、
しかもそれをピーコすれば同じ「種類」のものがばんばん作れるぞ、
という話。

「種類」を「クラス」で表現しないとならん義務なんか無いよ、ってことね。
勿論、クラスで表現したほうがスッキリする場合はクラスでやるべきだけど。

-----
蛇足。ちょっとひねった使い方だと、作った二代目instanceに
prototype「元」へのポインタを持たせておいて、
共通する属性とかはそっちに委譲しちゃって
二代目は差分しか持たない、なんて手もある。
ProxyパターンやFlyweightパターンとも通じるものがある。

というか、ここまでやったら「Class」の仕掛けを自分で作っているようなもんだ。
なにせ差分プログラミングなのだから(わら
003529NGNG
わけの分からん誤字をやってしまった。
>「具象クラスを知らなくても、インスタンス化ラインスタンスが
インスタンスからインスタンスが、
の間違い。

話の流れからして、どうでも良さそうだけど一応直しておきます。
003629NGNG
>>33
>だから clone() は状態もコピーするってところが重要になってくる。
なるほど…。
じゃあ、本質的には、「コピーする」っていうのが、やはり重要なのか。
0037デフォルトの名無しさんNGNG
age
0038デフォルトの名無しさんNGNG
良スレ保全age
0039デフォルトの名無しさんNGNG
Singletonってよく使うけど、C++だと、誰がDeleteするんだろって
思ったりしない?
特に途中で
if (singleton == 0)
singleton = new Singleton();
return singleton;
なんてインスタンスを作る場合は、使わなくなったら消したくなるような
0040デフォルトの名無しさんNGNG
>>39
やっぱ、プログラム終了時じゃない?
もしくは、メモリが一時的にでも足りなくなった時
0041>39NGNG
namespaceのコンストラクタ・デストラクタ
0042デフォルトの名無しさんNGNG
>>39
>>40の言う通り、普通はプログラム終了時なんだろうね。
でも、「好きにSingletonオブジェクトを消したい」という要望もあるようで、
「パターンハッチング(ピアソン社)」に一つの答えが載っている。

Singletonオブジェクトを消すためのクラスを作って、Singletonのfriendにするんだそうな。
0043>39NGNG
インスタンスの廃棄・再生成時に副作用が無ければこんなのもありかも
これならインスタンスを参照しない限り生成されることも無いし

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
ある日の、FactoryMethodパターンに関する私と教授のやりとり。
クラス名は、デザインパターン日本語版、初版のP116の図のもの。

教授「FactoryMethodパターンを使うとどの部分の再利用性が上がるの?」
私 「CreatorクラスとProductクラスの組です。
   Creatorクラスの責務の一部をProductクラスに委譲する構造に
   します。
   するとConcreteProductで、CreatorクラスとProductクラスの
   組の動作をカスタマイズ(なんて言うのが適切なんだろう?)
   する事が出来ます。
   よって、CreatorクラスとProductクラスの組を
   様々なプログラムで使い回すことが出来ます」
教授「それだけ?」
私 「え?」
教授「Clientクラス(図にはないけど、Creatorを使うクラス)と
   Creatorクラスの関係に注目してみなよ」
私 「ClientクラスはCreatorで宣言されているインターフェースしか
   使わない。
   だからConcreteCreatorを差し替えてもClientの変更はしなくて
   良い(実際はConcreteCreatorの生成部分を書き換えないといけないけど)。
   だからClientの再利用性が上がる。ってことですか?」
教授「うーん。分かってないなぁ…」
私 「??」

と、言うやり取りがあったのですけど、教授の真意が分かる人は
いますか?
かなり長い間悩んでいるのだけど、私には分からない…。

その後いくつか質問した結果、
「Clientの再利用性が上がる、という事を教授は言いたいのでは
ないらしい」
と言うところまでは分かったのですが、行き詰まってます…。
0045デフォルトの名無しさんNGNG
>>44
> 「ClientクラスはCreatorで宣言されているインターフェースしか
は「Productで宣言されている…」の方がしっくりくるけど…

そんな言葉尻つかまえて「分かってないなぁ」って訳じゃないよね。
ちゃんと他に再利用性が上がる部分があるんだよね?
うーんなんだろ、帰省の長旅用に丁度良いな、これ。
>>43
くぅ、興味あるのに読めない…smalltalk?
0046デフォルトの名無しさんNGNG
>>45 Delphi。
0047デフォルトの名無しさんNGNG
>>45
PL/SQL
0048デフォルトの名無しさんNGNG
delphiならユニットのfinalizationに解放処理かいてるけど。
004943>48NGNG
Delphiならそうだね。まあC++向けの説明ってことで。
Delphiの場合unit=namespaceだから
finalizationは>41のいうデストラクタにあたると言えるのかも。
0050デフォルトの名無しさんNGNG
age
0051デフォルトの名無しさんNGNG
> > 「ClientクラスはCreatorで宣言されているインターフェースしか
>は「Productで宣言されている…」の方がしっくりくるけど…
ClientはProductのインターフェイスを直接使用する必要は無いよ。
(元の記述のほうが正しい)
普通はCreatorの固定実装部分がProductのインターフェイスを使うね。
もちろんGoF本の「結果」の2で書かれているように、Productのインスタンスを
Client側に返すようなことがある場合はその限りじゃないけど。

> Clientの再利用性が上がる
これは変でしょ。いやある意味正しいかもしれんけど。ConcreteProductを
差し替えることでClientの変更なしに振る舞いを変えた別のアプリケーションを
作るみたいな文脈ではそういえるし。

明らかに再利用されるのは、Creatorの固定実装部分と思うけどどうよ。
大体Creatorって名前は適切じゃないかもしれんね。anOperation内部に
あるStrategyのような構造こそ重要と思う。
乱文ゴメソ
0052Delphiを知らない名無しさんNGNG
>>51
> ClientはProductのインターフェイスを直接使用する必要は無いよ
スマソ。仰るとおりパラレルなの(邦訳GoF本P118)が頭にあったから…。

「Creatorの固定実装部分」ってのはanOperationの実装部を受け持つ
productのことだよね?そうなら漏れも激しく同意。(anがAnじゃ無いのも同意(w

狭義で再利用って言葉使うなら、適用箇所はProductの抽・具部分のみだと思う。
というか広義で再利用って言ったら、なんでも再利用できるからなぁ(w

ただ44教授の意図は分からずじまいか。…直接、訊いて教えてくれ〜
005351NGNG
このスレは意外と厨房の目に止まりにくいのかもしれないので気楽かも(藁

>「Creatorの固定実装部分」ってのはanOperationの実装部を受け持つ
>productのことだよね?
「実装部を受け持つproduct」ってのはちょっと意図を汲みかねるけど、
漏れの言うのはanOperationの実装そのものが直接的な再利用対象で、
Productの実装は差し替わるわけだから「再利用」とはちょっと違う。
Productは実装無し(interface)であっても構わないことに注目。

なお、こんなことが教授が言いたかった事であるかは疑問なので
(なぜならこのことは「それだけ?」で切り捨てられた主張に含ま
れるとも考えられるから)、漏れ的には教授が解って無い可能性
に+1(藁
デザインパターンって誤解/曲解+宗教的なのが多くなりがちなので。
漏れが解っていない「最も重要な再利用性」があるならそれを知
ることができれば万々歳なので煽っとく(藁
ちなみに「再利用」には実装の再利用とインターフェイスの再利用、
そして構造の再利用があると考えるが、教授はどの「部分」と言っ
てるので「構造」のことじゃないんだろう。じゃ、ここまでにでて
きた事以外に後何があるかねぇ。
005444NGNG
「Creatorの固定実装」部分を使いまわす、っていうのはTemplateMethodパターン
と似た感じの話でいいのでしょうか?
>>51さんの言うようにStrategy的というのと、ほぼ同等の話であるとは思うのですが。

デザインパターン日本語版(P349)の図で言うと、AbstractClassの持つメソッド、
PrimitiveOperation1、PrimitiveOperation2をProductクラスに
持たしてしまいます。
CreatorはTemplateMethod(anOperationに相当)で
Productクラス(の派生クラス)のPrimitiveOperation1、PrimitiveOperation2を
使う、ってつもりで私は理解しています。


>漏れ的には教授が解って無い可能性 に+1(藁
実は、その可能性を私も疑っていたりします(笑)。
他の可能性としては、
1.私が教授の質問の意図を誤解している。
  実は、言葉通りの質問ではなくて遠まわしに別のことを言っているのかも。
2.実はFactoryMethod特有のことと、あんまり関係ない質問である。
  もっと、シンプルなことを聞いているのかもしれない。

>そして構造の再利用があると考えるが、教授はどの「部分」と言っ
>てるので「構造」のことじゃないんだろう。
教授は気がつくと話が勝手に展開しているので、もしかすると「構造」なのかも
しれません。
けど、私は「教授はクラス単位の再利用について、私に聞いているのだろう」と
思ったのですけどね。


>>52
>ただ44教授の意図は分からずじまいか。…直接、訊いて教えてくれ〜
教授が基本的には、「あっている」「間違っている」としか言わない人なので、
いつになったら教授の意図が掴めるのやら…。
また、進展があったら書きます。
0055デフォルトの名無しさんNGNG
デザインパターンを意識しないと設計できないような奴は, センスなし.
まとめること自体に価値があるだけで, その成果物に価値はなし.
ありがたがってるような奴は, それだけの奴.
0056Delphiを知らない名無しさんNGNG
>>53
パラレルじゃ無い場合、Creatorはコンポジションとしてもっているproductインター
フェイスを使ってanOperationを実装する……のじゃないのか…、うーん曲解してるかも
>>54
ウチの教授は質問すると延々と語るタイプだよ。頭のいい人に質問するのは骨だよね
>>55
うはぁ、まさに漏れのことだ。でも自分で設計したのも、大体において主要
デザインパターンのいずれかに収束しない?やっぱなかなかの車輪だと思うけど…

いずれにせよこのスレもう少し賑わって欲しいなぁ。それこそウワベのパターンだけでなく
本質を見抜く手がかりになるし。頭のいい人達でパターン毎に議論してくれないかな。
…私はDOMに戻るので
0057デフォルトの名無しさんNGNG
>>55
うっ。耳が痛いです。
でも、逆に「デザインパターンを使う事で、センスの無い人もそれなりの設計が
出来る」なら、私はデザインパターンに意味はあると思います。

「デザインパターンを意識する事で、うまく設計できる人が増えるのか?」って
聞かれると、私はなんとも言えませんけれども。
005851NGNG
>パラレルじゃ無い場合、Creatorはコンポジションとしてもっているproductインター
>フェイスを使ってanOperationを実装する……のじゃないのか…、うーん曲解してるかも
あってるけど?誤解があるとしたら、56はCreatorのサブクラスでanOperation
をオーバライドすることを前提としているような気がするけど、GoF本定義の
Factory Methodパターンではそうじゃないって事かな。

>>54
教授が「間違っている」としか言わないのだとしたら、44の問い方に自信
がなかったからかもしれないね。
自分がどこまで理解してこのような回答に行き着いたかをきっちり説明
できているなら、その誤りの理由を説明するのが教師の義務と思うし。
こっちがちゃんと説明できている自信があるのに、納得できる説明をし
てくれないようなら、俺ならふーんその程度かぁって判断するなぁ。

>>55
デザインパターンはコミュニケーションの為のものだから、「デザイン
パターンを意識しないと設計できない」のは駄目だが、デザインパターン
を知らない/曲解しているのも困り者。
Factory Methodパターンはその典型なんだけど、今時はGoF自信も
A a = B.create();
なんてのをFactory Methodパターンと呼ぶ事を認めているらしいから…。
0059デフォルトの名無しさんNGNG
a,b,c,d,e,f,g,h,i,j
ってクラスが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デフォルトの名無しさんNGNG
>59
private static int instance_count

a(){ instance_count++; }
~a(){ instance_count--; }

ってやってinstance_countが10超えたらコンストラクタ内で例外をthrowする
0061デフォルトの名無しさんNGNG
>>59です。
質問すら満足にできなくてすみません。

>>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
>>59
お帰りはこちら
http://www.mycgiserver.com/~phpmona/zoids0/ch_list.php4
0063デフォルトの名無しさんNGNG
>>61

staticフィールドや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
>>60
どっちかというと、コンストラクタはprivateにして、Singleton
のようにgetInstance()で制御する方がなんとなくいいような気がする。
別にいいけど。
0065デフォルトの名無しさんNGNG
>>60

   λ
   ( ヽ  / ̄ ̄ ̄ ̄ ̄
  ( ゚Д゚ )< Rubyはクソです。ゴミ箱逝きです。 いじょ
 (____) \_____
   ヽ(´ー`).ノ
     (  へ)
      く



                      - = ≡三  λ
                  _ = ≡三     ( ヽ  / ̄ ̄ ̄ ̄ ̄
       (´ー`)          = ≡三    ( ゚Д゚ )< この発言をコピペしていただければ幸いです。
      ( ヽ ヽ)         - = ≡三   (____) \_____
      /  >             - = ≡三
0066デフォルトの名無しさんNGNG
>>61
そういう風にしたいなら、親クラスで

class Parent
{
  public Parent getInstance() {
    //instanceNumberを参照して10個以内に抑える
  }
  public static int MAX_INSTANCE_NUMBER=10;

  private int instanceNumber;
  private Parent(){}
}

んで、他はこのクラスを継承させる、ってのがいいような気がする。
0067Ruby!NGNG
OOPならRubyだね。
Java

なにかと話題のオブジェクト指向言語であるJavaとRubyを比較すると:

* Rubyはインタプリタ型言語。
* Rubyではすべてのデータがオブジェクトである。
* Rubyではモジュールを使って実装を共有できる。
* Rubyの変数や式には静的な型がない。
* Rubyでは正規表現が文法としてサポートされている。


http://www.ruby-lang.org/ja/compar.html

Rubyを知ってもらうためにもこの文をコピペしてください。
0068デフォルトの名無しさんNGNG
>>66
大嘘だった。継承するには継承もとのコンストラクタがprivateじゃ
まずいか。getInstance()にしたって、親クラスのインスタンス
そのものが返されるのじゃ意味ないし。。。

こりゃ、親クラス作らずにそれぞれのクラスで実装するしか
ないか?
0069たぶんNGNG
61が何のために10x10のインスタンスを生成したいのかを
もっと詳細に書かない限り最適解は出ないに一票
0070デフォルトの名無しさんNGNG

           
――――――――――――――――――――――
番組の途中ですが、臨時ニュースです。
「Rubyはクソです。ゴミ箱逝きです。 いじょ 」
この発言をコピペしていただければ幸いです。
___________   __________
             ‖ \|________   
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ Λ_Λ
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻
0071デフォルトの名無しさんNGNG
――――――――――――――――――――――
番組の途中ですが、臨時ニュースです。
「Rubyはクソです。ゴミ箱逝きです。 いじょ 」
この発言をコピペしていただければ幸いです。
___________   __________
             ‖ \|________  
             ‖ | ON AIR.|
             ‖  ̄ ̄ ̄ ̄
        ./ ̄ ̄θ  ∧_∧
      .../   //(´∀` )/|
     ./      ̄/⊂    ||_/
     | ̄ ̄ ̄ ̄ ̄|  (  ━┳┛
     |_____| /ヽ」┘┻
 
0072デフォルトの名無しさんNGNG
Javaの場合、同packageにインスタンスを管理するクラスを用意して、そこから
インスタンスを獲得するようにします。
0073デフォルトの名無しさんNGNG
インスタンスを一個にしたいときSingletonを使わずに
staticメソッドを使うのはだめでしょうか?
初期化の順序が重要なときに使えないのは分かりますが、
他にどんなデメリットがありますか?
0074デフォルトの名無しさんNGNG
>>73
言いたいことが理解できない(というか、何通りかに解釈できる)ので、サンプル
コードを希望。

C++ に関して言えば static メソッドは virtual 指定できないので、微妙に使いづ
らい。
0075デフォルトの名無しさんNGNG
> C++ に関して言えば static メソッドは virtual 指定できないので、微妙に使いづ
> らい。

何かが根本的に間違ってる気がするが。
0076デフォルトの名無しさんNGNG
まず、それがインスタンスである必然性があるかどうか、だ。
初期化の順序ってどういうこと?(Java屋には無縁?)
007773NGNG
>>74
言いたいことが分からないと言われても…
Cならグローバル関数になるような場合でもSingletonにしたほうが
よいのかな?と。
virtualを使いたいときに困るというのは分かりました。
Singletonでvirtualを使うときってどういう場合があるか思いつきませんが。

>>76
>まず、それがインスタンスである必然性があるかどうか、だ。
なるほど。ただSingletonの説明用サンプルってその必然性が
あまり感じられないんですけど。

>初期化の順序ってどういうこと?(Java屋には無縁?)
C++での話です。
class Hogeがあったときに、トップレベルで、

Hoge theHoge;

とかすると、コンストラクタが起動する順序を制御できない
という話だったと思います。

オブジェクト指向に不慣れなもので何か間違っているかもしれません。
0078デフォルトの名無しさんNGNG
>>76
A 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=78NGNG
>>77
static メソッド/グローバル関数と Singleton を対比しているのが謎なんだけど。

- データが絡まない単純な手続きだけなら、普通に関数にしておけば良い。
- データが絡むなら Singleton にすれば? 具体的な方法は >>78 で書いた通り
008076NGNG
Singletonパターンは普通グローバルな実体インスタンスにはしないと思ってたから、
初期化の順序なんていくらでも制御できると思ってたけど。GoF本の「実装」節もまさにそのとおりだし。
グローバル変数で実体が作れるならSingletonであることを保証できないんじゃないの?
ま、>>78にある通り後処理の問題もあるから単にGoF本通りの実装にもならないかもしれんけど、
その辺のC++流儀までは知らないや。
>>77
インスタンスである必然性とは、GoF本の「結果」の5に書いてある通り、インスタンス数を1以外に
したい場合と、サブクラス化の可能性がある場合のみ。
そうでなければ全部グローバルな関数(static)として実装してもかまわない。そのへんはもう趣味
の範疇だよ。(というのはJava屋だからいえる。C++では後処理の考慮はいるね)
0081デフォルトの名無しさんNGNG
っていうかコンストラクタで依存関係がからむ初期化をするのはどうかと思うが。
普通、そういうときは別途初期化関数を用意しないか?

コンストラクタでなんでもやりすぎなだけじゃないかな。
008276NGNG
そだね。でも後処理の問題は結局あるけど。
取り敢えずグローバルな実体オブジェクトは違うかなと。
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が無いと実践が難しくないですか?
008576NGNG
>>83
それをやるなら、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みたいなものでしょうか?
ガイシュツだったらすいません。
008776NGNG
そう。それ>auto_ptr 鬱氏(藁
スコープはずれたら自動的にデストラクタ呼ばれるようにする仕組みね。
おれ本読んでないんだけどそんなこと書いてんのか>有機本
008876NGNG
>>84
おいらはDelphi知らないけど、interfaceが無いと難しいってのはデザインパターンで行われているような
構造を発案するのが難しいって意味かな?それはあると思う(interfaceという言語の仕組みがあると頭
を整理しやすいという意味)。
でも「実践」が、デザインパターンの適用のことを指しているのだとしたら、それはinterfaceという仕組み
がなくても大した問題じゃない。これはSmalltalkを考えれば解るかと。
多重継承なしでinterfaceも無し、おまけにstrongly typeだったりしたら、さすがに「実践」も難しいだろうね。
0089デフォルトの名無しさんNGNG
>>88
> 多重継承なしで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
>>90
>>スコープはずれたら自動的にデストラクタ呼ばれるようにする仕組みね。
>これをDelで実践するのは出来なくはないらしいですが面倒みたいです。
Delphiでもinterface相手だとスコープ抜けるだけで確実にRelease呼んでくれるから
interfaceにしてReleaseを自分で実装しちまえばいいってかんじ?

>C++のauto_ptrも実装した人は面倒だったのかな。
C++はもともとスタック上オブジェクトはスコープ出るときにdestructor呼ばれるから
スタック外オブジェクトもスタックオブジェクトで包むだけでいいから比較的簡単だね。
0092DelギコNGNG
>Delphiでもinterface相手だとスコープ抜けるだけで確実にRelease呼んでくれるから
 ∧ ∧     /
 ( ゚∀゚)  <  そういう仕組みでしたか。
  | つ[|lllll]).\ ニャルホド
〜|   |
  ∪∪

>C++はもともとスタック上オブジェクトはスコープ出るときにdestructor呼ばれるから
  そうか。おっしゃるとおりでゴザイマス。

 ∧ ∧   / Prototypeを勉強しました。
 (,,゚Д゚) <  CloneメソッドなんてのはDelphiでどやって実装しますでしょう。
  |つ つ  \ サブクラス側で実装しておく必要があるのでしょうか。
@|  |    JavaでもCloneをオバライドするのと一緒かな??
  ∪∪
     あと、interface変数にオブジェクトを代入したりも出来ないような
     気がするのですが・・・
     Prototypeの実装ってDelで出来るものなんでしょうか。
0093デフォルトの名無しさんNGNG
デザパタをありがたがっているような奴はクズ。
あれぐらいモデリングをしっかりすれば自分で考え出せるだろう。
デザパタの意義は、カタログにしたその取り組みにあるだけ。
0094デフォルトの名無しさんNGNG
>>93

その「自分で考え出す」手間を省くためのデザパタだろう。
さらに「自分で考え出したパターンを他人に説明する」手間も省ける。

そのためのデザインパターンだ。

もしかして車輪の再発明大好きな人デスカ?
0095デフォルトの名無しさんNGNG
そのうち俺的デザパタなんかつくって
同僚にでも読まそうとするのかモナ。
0096デフォルトの名無しさんNGNG
「え?それって○△のこと?」
と、自分の知らない有名なパターン(非GoF)を挙げられる。
に200オクタット。
0097デフォルトの名無しさんNGNG
>>93
コピペしてる人間に言われたくないね。
0098デフォルトの名無しさんNGNG
非GoFな有名なパターンどっかにまとまってない〜?
0099デフォルトの名無しさんNGNG
>>98
PLoP 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
>>99
「プログラミングデザインのためのパターン言語」
はACEフレームワークに使われているパターンが中心やね。
分散処理のパターンとかネットワーク関連の人には
結構参考にはなると思われ。
010199NGNG
>>100
そうですね。GoF本のような一般的なデザインパターンはそれほど多くはない
ですね。今本が手元にないのですが、Null ObjectパターンとActive Object
パターンくらいしか思い出せません。

後半には開発プロセスのパターンとかフレームワーク進化のパターンとか、
面白いけどこっちが期待しているのとは異なるものも入ってたりします。
■ このスレッドは過去ログ倉庫に格納されています