2 :
デフォルトの名無しさん :2006/03/09(木) 04:34:12
7 :
3-6 :2006/03/09(木) 16:21:29
ういっす。テンプラ貼って見ました。 まったりと語り合いましょうぜ。
お姉ちゃん本ってどれ?
9 :
3-6 :2006/03/09(木) 16:31:58
>>8 俺も気になります。お姉ちゃんの部分が気になります。
お仕着せのパターンで解決できるものばかりなのかね?
レゴブロックで作れないものはない
23個のオナニーパターン。
結城先生あげ。
GoF本読んでSmalltalk好きになった といっても、GoF本のサンプルってほとんどC++なんだよね で、SmalltalkでといえばDesign Patterns Smalltalk Companion マジおすすめ
>>16 >GoF本読んでSmalltalk好きになった
おっ、その心は?
Smalltalkって標準クラスの設計がいいの?
『・・・こころ』 買っちゃった ♪明日届く〜
>>17 そうね〜やっぱクラスライブラリの設計ですね
デザインパターンの固まりって感じなんですよ
Smalltalkを調べていくと、言語仕様が非常にシンプルで
言語で規定されるようなこと(制御文とか)すらクラスに
メソッドで定義されている、ってのにちょっと感動。
20 :
デフォルトの名無しさん :2006/03/15(水) 00:05:06
このスレでもよく言われるけどデザインパターンは設計の話じゃないってどういうこと? あきらかに設計の話だと思うんだけど。
実装レベルでしか理解してない奴がまだまだ多いってこった
>>20 リファクタリング(この言葉もテストの修正を許容するものから
許容しないものまで幅があって一概には使いにくいな)を前提
にボトムアップで見ると実装の話になる。
テストにしろリファクリングにしろデザパタにしろ、幅がありす
ぎて各自がバラバラの思惑で使うもんだからグダグダになっ
てる。
今日、java.io.*のクラス図を初めてjudeで自動生成してみたんだが ・・・いや、美しいな。 (こいつぁArtだ。) クラス設計とはかくありたいなと思ったよ。 あんまりかっこよかったんで、ついA3で印刷して部屋に貼っといたぜ。
日頃どういったクラス設計に携わっているかの違いなんだろうか 格段に美しいとは思わない。当たり前の設計だと思うんだが・・・
26 :
NAME IS NULL :2006/03/15(水) 01:57:20
デザパタ入門とJAVAの格言買ってしまった。 良書ということで一週間読み込むとする。
>>20 実装だろ?
じゃなきゃあんなソースばっか載ってる本になるのはおかしい。
そもそも実装という作業は、設計作業の一部なんだが。 このことをわかってないヤシが多すぎ。
設計のデザインパターンと実装のデザインパターンをごっちゃにしてる奴が多いだけでしょ。 デザインパターン=クラス構造とか思い込むからそうなる。
30 :
勉強中 :2006/03/15(水) 10:54:03
設計ってしかことないけど(というかOOPってしたことないけど)、どれをクラスにするのかを決めて、 実装設計でデザパタを使う。実装がうまくいきそうにない(エレガントでないとか)ので、再度クラスを 考え直す。 っていうのを繰り返すのかな?
>>20 設計の話だと思うよ。設計というと↓のように大きく分けて2つに分類されると思う。
■設計┬→基本設計
└→詳細設計(プログラム設計)
デザパタは設計という部類の中の「詳細設計」。または「プログラム設計」の部分。
SEレベルでの「基本設計」ではない。
以前、俺も「「設計の話じゃない」みたいなニュアンスで登校したことがあるのでフォロー。
えと、知ってたらごめんなさいごめんなさいごめんなさいなのですが。
>>31 > デザパタは設計という部類の中の「詳細設計」。または「プログラム設計」の部分。
> SEレベルでの「基本設計」ではない。
SEという定義をどう捉えているのかは不明だが、保守性を考えたシステムを作ろうと
した場合,基本設計はおろか要求の洗い出しの段階から考慮する必要があるのだが
どうだろうか?
そういった点から考えると、デザパタが詳細設計という枠に収まるかどうかは極めて
疑問だと思うぞ。
P.S.
それから、基本設計はSEがやるものだなんて考え方をしてSEとPGの間に溝を作る
こと自体が問題を生みだしてるんじゃないか?
>>33 まず、基本設計書の認識がお互いあってるか確認したいんだけど、
顧客からの要件を受けて、その要件をコンピュータ上では、
このような形で満たせます。っていう話を顧客に説明するために、
作成する資料が基本設計書という認識でお互いあってるんだよね?
顧客側は一般人だろうし、ただやりたいこと(要件)だけがあるだけで、
それがどんな形でコンピュータ上で実現されるのかわからない。
まずはそれを説明しなくちゃならないんだけど、
それは、例えば「要件」として出勤退勤のタイムカードをパソコンでやりたいとか。
実現方式として例えばOSはWINDOWSです。とか
そして、VBのEXE起動して「出勤ボタン」を押しますとか
Accessのファイル開いて「出勤ボタン」を押しますとか
ブラウザ起動して出勤退勤のページに移動して「出勤ボタン」を押しますとか
そんなものだと思うんだけど、そこにデザパタが入っていけるか?
35 :
34 :2006/03/16(木) 11:10:17
ああ、要求の洗い出しの段階で「変更されそうなところは予め聞いておく」っていう意味かな? しかし、変更箇所を予め考慮しておくっていう作業自体はデザパタとは関係がないし、 または、その変更になる確立が高い箇所も、デザパタでは吸収できないかもしれないし、 最終的に、それを書くにしても詳細設計書だと思う。
36 :
34 :2006/03/16(木) 11:17:07
>それから、基本設計はSEがやるものだなんて考え方をしてSEとPGの間に溝を作る >こと自体が問題を生みだしてるんじゃないか? それはあるね。SEしてる人間の連絡不足で、よくPGが仕様とは違うものを作ってしまったりする。 その責任がPGの責任になってしまったりするし。 仕様の打ち合わせの段階からSEとPG、両方が参加すればいいのにとか思ったりするわな。 でも、一緒に打ち合わせ行こうよとかいうと「えー、いやです」とか言い出すPGも多いんだけど。
37 :
33 :2006/03/16(木) 13:04:26
>>34 それは私の言っている基本設計書ではありません。
> それは、例えば「要件」として出勤退勤のタイムカードをパソコンでやりたいとか。
> 実現方式として例えばOSはWINDOWSです。とか
これは「要求定義書」になりますね。
要求定義書っていうのは顧客の要求だけが書き連ねられているドキュメントではなく、
利害関係者(顧客,投資者,開発チーム等)の一致した要求が書き連ねられるもの
です。 このため OS は Windows で、というのも投資者(開発側企業)の思惑だったり
顧客の要望だったりする。
最近の開発だと、OSの選定が設計扱いされることは少ないんじゃないか?
なお、要求定義書にデザパタが出てくることはまずありません(変更に強いシステムという
要求はあるけど)。
> そして、VBのEXE起動して「出勤ボタン」を押しますとか
> Accessのファイル開いて「出勤ボタン」を押しますとか
> ブラウザ起動して出勤退勤のページに移動して「出勤ボタン」を押しますとか
これは画面設計書でしょう。 画面設計にいわゆる GoF のデザパタが出てくることは
ありません(芸術的なデザインのパターンはあるでしょうが)。
-----
> ああ、要求の洗い出しの段階で「変更されそうなところは予め聞いておく」っていう意味かな?
> しかし、変更箇所を予め考慮しておくっていう作業自体はデザパタとは関係がないし、
関係ないことありませんぜ。 こういった作業はデザパタを適用する上で大きな布石となります。
「オブジェクト指向のこころ」に載っている共通性/可変性分析ってーのは、かなり上流工程の
作業になり、こういった行為を通じて構築対象のインタフェースをクローズアップしていくこと
ができます。 ということで、この工程を実施する時点でもうデザパタを意識することになるのです。
38 :
33 :2006/03/16(木) 13:11:16
> 仕様の打ち合わせの段階からSEとPG、両方が参加すればいいのにとか思ったりするわな。 > でも、一緒に打ち合わせ行こうよとかいうと「えー、いやです」とか言い出すPGも多いんだけど。 そうなんだよな〜。 仕事の面白さを取って責任を取るか、仕事の面白さを捨てて責任逃れをするかってとこで、 みんな後者を取っちゃうんだよなぁ。
なんかごちゃごちゃしてるけど、 結論としてはデザインパターンは設計の話ってことでいいの?
どこまでを設計と呼ぶべきかによる、って結論に落ち着くはず。
デザインパターンは内部設計の話です
やっぱり、設計段階でソースが出てくるのは同考えてもおかしい。
こういうフローチャートを書くとこんなソースになるんだよ っていう教え方はわりとありふれてると思うのです
アブストラクトファクトリとシングルトンが 同じ設計レベルで出てくることってあるんかいな?
>>44 シングルトンを「インスタンスの個数を一定数にする」ものだと考えると
アブストラクトファクトリと同じ設計レベルになる。
もっともシングルトンは「インスタンスの個数を1個にする」という上述した
要求の特殊解なんだが。
47 :
34 :2006/03/17(金) 11:25:30
>>37-38 おー、びっくりした。基本設計で「これは○○パターンが適用できますよ!」とかを売り文句にするのかと思った。
>これは画面設計書でしょう。 画面設計にいわゆる GoF のデザパタが出てくることは
ここで伝えたかったことはあれです。あれあれ。
「コンピュータで実現すれば今までの手作業がこの程度の手間で実現できますよ!」とか売り文句みたいなもんです。
システム化することによってメリットがあるのかを明確にするため、そんなことも書くでしょう。
>関係ないことありませんぜ。 こういった作業はデザパタを適用する上で大きな布石となります。
んー、まぁ、要件によって実装は変わるから、デザパタを適用するか、しないかも確かに変わってくるし、
基本設計時点でも関係あるっちゃあるが、ないっちゃない感じじゃないか?
48 :
34 :2006/03/17(金) 11:46:10
>>38 (;´-`)。o(そ、そうか!あいつら責任逃れのためか!あのやろう!)
まあ、そこで責任逃れしても、仕様と違うもの作って、
結局は作り直しさせられて残業の責任を負うはめになると思うけどね。
49 :
33 :2006/03/17(金) 12:40:57
>>47 > ここで伝えたかったことはあれです。あれあれ。
> 「コンピュータで実現すれば今までの手作業がこの程度の手間で実現できますよ!」とか売り文句みたいなもんです。
> システム化することによってメリットがあるのかを明確にするため、そんなことも書くでしょう。
悪い。 ここんところの日本語がまったく理解できなかった。
文章の断片に反応するが、「システム化することによってメリットがあるのかを明確にする」
というのは要求定義書の役割であって、画面設計書とは別物という認識なのだが。
基本設計というのは要求定義が完了してから始まる工程であり、そこからデザパタは適用できる
と主張しているわけっす。
> 基本設計時点でも関係あるっちゃあるが、ないっちゃない感じじゃないか?
オブジェクト指向技術を採用して開発を行う、、、となった時点で、変更容易性とかの話しに直結
するのが普通だと思うぞ。
基本設計ってーのは、平たく言えばシステム化対象となる問題領域に境界線を引いていく作業だと
思っている。 その時にどの部分をカプセル化して変更を封じ込められるようにするのかを検討する
ことは当然のことじゃないか?
50 :
34 :2006/03/17(金) 13:33:09
>文章の断片に反応するが、「システム化することによってメリットがあるのかを明確にする」 >というのは要求定義書の役割であって、 あっ。そりゃそうだ。まあその、手順だね。システム化することによってどんな手順・操作になるかとか。 >オブジェクト指向技術を採用して開発を行う、となった時点で、変更容易性とかの話しに直結するのが普通だと思うぞ。 ある部分の処理が、将来変更するか否か、柔軟性を持たせるべきか否か、重要度が高いか否か、 それはデザパタや、オブジェクト指向を意識せずに開発を進めた場合でも考慮することじゃないか? それで内部設計の段階で、ここはこうなる可能性があるから柔軟性を持たせようって話になると思うんだけど。 まあ、デザパタを適用することを考えながら基本設計していくと確かに違ってくるんだろうけど・・・ なんか違う気がする。
51 :
33 :2006/03/17(金) 14:06:42
>>50 私の頭の中にある基本設計ってーのは、要求定義書が終わってから始まる一連の作業であり,
ユーザーのシナリオを一つ一つ分析しながら、サブシステムに分割していき、最終的には大まか
なクラス設計が完了するところまでと思っています。
で、サブシステムの分割や大まかなクラス設計を行う時点では、洗い出したサブシステムや
クラスの責務を決めないといけないので、この時点でインタフェースに着目する必要があるわけです。
そして、インタフェースという観点で設計を行い始めた時点でデザパタの適用というものは視野に
入っているというのが私の考えです。
> まあ、デザパタを適用することを考えながら基本設計していくと確かに違ってくるんだろうけど・・・
> なんか違う気がする。
確かにまぁ、「どこかでデザインパターン使えないか?」といった感じで目を皿のようにして探しながら
基本設計するというイメージではなく、インタフェースを主にして考えながら「どういった切り口で
インタフェースを考えたら、うまくまとめられるのか?」といった観点で作業することになる。
しかし、デザパタを知っておくことで考え方の道筋が整理されるから、ここでのヒラメキが得やすくなる
ということが言いたい。
そう言う意味じゃ「デザパタを適用すること」が目的だと言っているのではなく,「デザパタの知識を利用
することでインタフェースを使った考え方ができるようになること」が重要なのだと思っている。
そして、それが基本設計にも適用できると主張している根拠になっているわけ。
>>51 GoFの23パターンだとそのレベルで適用するのってあったか?
パターンという括りならわかるけど
俺はそのレベルで適用可能なものってデザパタって言葉とずれてると感じるのだが
53 :
33 :2006/03/17(金) 21:03:37
>>52 おおまかなクラス設計を行うと言っても、頭の中に実現可能性を想い描くことが
できなければ絵に描いた餅になる。 そういった点で GoF の23パターンを見た場合、
適用できないものの方が少ないと思う。
私の場合、よく使うのはBridge、AbstractFactory、Strategy、Observer、Visitor、等々
54 :
52 :2006/03/17(金) 21:18:37
>>53 なんか俺はちょっと違うことを考えていたらしい
実現可能か考えずに、より適切なモデリングするぐらいのものかと思ってた
言語まである程度意識してるクラス設計まで ってことでいい?
55 :
33 :2006/03/17(金) 21:51:21
>>54 いいっす。
そもそも、言語を考えずにモデリングするってーのは、はなはだ危険な行為だと思う。
だいたいクラス設計と言った瞬間に、オブジェクト指向言語の採用が前提となってるので
言語を意識しないモデリングなんてあり得ないと思うが。
基本設計時に詳細にとらわれて詳細の海に溺れてしまうのはいけないことだが、詳細に
立ち入ってはいけないということではない。 むしろ詳細を(頭の片隅ででも)考慮すること
なしに作った基本設計など、実現可能性のあやふやなゴミと同じだと思う。 上流工程は
下流工程のことを考えた上でないと成果物を作ってはならないと思っている。
蛇足だが、この辺りのことを理解してないSEが多く、下流工程を意識することなくモデリング
しようとするSEがいるためにSEとPGがいがみ合ってるということもあると思う。
クラス設計時に名詞と動詞を抽出するなんてアプローチを使ってちゃ、下流工程を意識しよう
にも意識できないわな。 そんな設計だと実装時にギャップで苦しむのは目に見えている。
56 :
52 :2006/03/17(金) 22:05:51
>>55 アナパタは言語意識しないよね あのレベルなのかと思ってた
ソフトウェアを作るためのモデリングじゃなくて、現状把握のためのモデリングかと
基本設計って結構範囲が広いんだな
設計段階からデザインパターンを使いまくろうなんて考えていると、 アンチパターンになるぞ。 実装していって、気持ちが悪くなったらデザパタ使ってリファクタリングする。
58 :
33 :2006/03/17(金) 22:20:45
アナパタは結構毛色が違うよね。 あれは要求定義書を作る際に使うものだと認識してまふ。 要求定義=Whatの定義、設計=Howの定義なのでどうしても切り口は違って くるかな。 ということで今日はボチボチ帰って寝るわ〜。
なんにしてもやっぱり設計の話でソースコードがでてくるのはおかしい。
俺がGoFのデザパタ意識するのは ・(ツールレベルの)フレームワークの設計/実装をしてる時 ・実装コードのリファクタリングをする時 だけ。 設計か実装かと言われれば、俺の意識だと実装。 前者は人によっては設計と呼ぶかもしれない。 アプリレベルのフレームワーク設計してる時には とたとえばJ2EEデザインパターンや アンチパターンは大いに意識するけど GoFを意識することはない。
>>57 > 設計段階からデザインパターンを使いまくろうなんて考えていると、
> アンチパターンになるぞ。
> 実装していって、気持ちが悪くなったらデザパタ使ってリファクタリングする。
リファクタリング時にデザパタが有用であることは認める。 しかし、設計時にも間違い
なく有効だ。
リファクタリングの時にしかデザパタを使わないという考え方が成立するのは、XPのように
必要最小限のシステムを作った後、各サイクルを1週間程度で回していくというプロセスを
採用した時だけだと思うぞ。 ある程度の大きさのシステムを数ヶ月単位で回していく場合、
その考え方では初回のリファクタリングの作業量が莫大なものとなって破綻してしまう。
それから、アンチパターンについてだが、確かにアンチパターンというものは常に頭に
置いておく必要がある。 しかしアンチパターンのほとんどは「ものごとのバランスをとるため」
に存在するのだ。
「分析地獄」というアンチパターンがあるからといって、分析はやらないでおこう、、、なんて
ことにならないのと同じことだ。
>>60 つ
>>46 >>61 アプリレベルの設計でも Bridge パターンはよく使うぞ。
このパターンは、日本で最も過小評価されているパターンなんじゃないかと思う。
俺も「こころ」本を読むまで Bridge を正しく認識していなかったが。w
(他にも当たり前のように Strategy とか使うけど。)
なんにしてもやっぱり設計の話でソースコードがでてくるのはおかしい
うちだとアプリレベルの設計はもっと大枠で捉えてしまうんすよ。 プロセス・スレッド間の通信には何使うとか、 他システムの通信方法がキモいから この部分はラッパーでカプセル化しちまおうとか、 DAO層はあのやり方で実装しようとか、 その程度だけ決めて実装(含むプロトタイプ作成)に入っちゃう。 小規模で言わなくても分かってる同士だからうまく行ってるけど 大規模になったらきちんとフレームワーク設計やらなならんのだろうなぁ、とは感じる。 どうやら「こころ」が良本らしいので読んでみようかな。
>>64 「プロセス・スレッド間の通信には何使う」や「他システムの通信方法がキモいから
この部分はラッパーでカプセル化しちまおう」ってーのは、大枠で捉えているという
よりも、「そこにあるものを使う」っていういわばボトムアップの発想じゃないかな。
「DAO層はあのやり方で実装しよう」というのも、レイヤーありきの発想でボトムアップ
に近いと思う。
こういった「あるものを流用」したり「技術からの要求を主」にする設計は、顧客の要求する
ものを取り込むタイミングが難しく、顧客ニーズからブレたものができる危険性がある。
大規模開発をする予定があるのなら、トップダウンの視点は身につけておいた方がいいと
思うぞ。 この視点は小規模開発でも有効だし。
66 :
34 :2006/03/18(土) 13:14:44
>>51 うーむ、詳細設計をしつつ基本設計をする。って感じに聞こえてしまうなぁ。
基本設計でクラス設計を完了させるってのはクラス図とかも基本設計書に書いちゃう感じなの?
それだと俺が働いてきた会社の基本設計とは違うかもしれない。
というか基本設計とかって働いてる場所によって意味合いが変わってくるかもね。
「こころ」か。良本らしいので俺も読んでみようかな。Bridgeはいいパターンだよね。
漏れがよく使うのはDecorator、Bridge、Factory Method、Strategy、Flyweightとか。
他のは理解はできるけど、いい使い所が思いつかなかったりする orz
それぞれのパターンのうまい使い方の情報交換とかしたい。
こころ たけーよ こころ orz 昨日、本買ったばっかりなのに
68 :
33 :2006/03/18(土) 14:46:19
>>66 > 基本設計でクラス設計を完了させるってのはクラス図とかも基本設計書に書いちゃう感じなの?
いや、クラス設計は完了しないっす。 業務オブジェクトのモデリングが主な目的で、
主要なクラスと主要なメソッドだけを記述したクラス図ができるだけです(あっ、パッケージ
関連図も成果物です)。
詳細設計では、さまざまな内部メソッドを追加し、クラスが追加されることも当然あります。
シーケンス図も詳細設計で考えますかね。
> それぞれのパターンのうまい使い方の情報交換とかしたい。
いいですねー、それ。 どんな感じでやりゃいいのか、イメージはできてないけど。
TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
俺は Template Method が一番利用頻度高い。 その次に来るのは Adapter や Decorator、Singleton。 DIコンテナ使うことが殆どなので 潜在的には Factory パターンの利用回数がダントツなんだろうか。 Template Method はDIコンテナと親和性が高いので多用してしまう。
なんにしてもやっぱり設計の話でソースコードがでてくるのはおかしいよな
>>74 これをメタフィッシングパターンと命名する。
> それぞれのパターンのうまい使い方の情報交換とかしたい。 とか言っちゃったけど、言いだしっぺの俺がまずなんか書かねば…。
俺がプロトタイプ作成→リファクタリング→Template Method適用に至るよくある手順 (1) 詳細は無視して大まかな流れだけを実装する。 (2) 細部に肉付けして簡単なテストが通ることを確認する。 (3) 一部の処理が特定の条件下では異なるため、その処理と、条件分岐の部分を書く。 テストが通ることを確認する。 (4) 別の条件だと別の処理を書かなくてはならず、いい加減面倒になってくる。 もっとスマートに書けないものかと思案する。 どう考えても Template Method パターンです。本当にありがとうございました。 (5) という事で書き直す。テストも通る。
構造に関するパターンは設計段階でも話が出る可能性はある。 振る舞いに関するパターンはほとんどでない。
>>77 よくある手順って…おまいは毎回そんなことを考えてるのか。
いい加減、最初からわかれよ。
>>78 振る舞いに関するパターンでも Command,Interpreter,Observer,Visitor なんかは
大まかな設計レベルでも十分考慮対象だったぞ。 それ以外はちょっと詳細な設計
レベルになるかもしれんが。
あと、生成に関するパターンも構造に関するパターンと対にして設計時点で使うわな。
>79 最初は動くものを作って、だんだん仕上げてく。 こっちの方が最終的に早く出来上がるし、 変な設計に振り回されないので見通しも良くなる。 別フレームワーク作るわけじゃないんだから。
>>81 曳光弾形式の開発ができる現場だとそれもいいんじゃない?
行き当たりばったりなだけじゃん
>>83 悪く言えばそうだけど、XPなんて正にそれじゃん。
行き当たりばったりだったとしても、そのプロセスに顧客を巻き込めれば無問題。
スパイラル開発で各サイクルを早く回そうとするのもまったく同じこと。
ただ、そういったプロセスを使えない開発の場合には、まったくもって指摘通りになる。
そしてこの場合、デザパタはリファクタリング時だけでなく、設計時にも活用することになる。
そんだけのことじゃない?
俺は84じゃないが、最初は出来るとこまで作って、 後からどんどん洗練してくやり方なんて最近じゃ普通の考え方だと思うんだけど。 むしろ、一気に完成形を目指さず、変更されることを意識しつつ、 少しづつ仕上げていくやり方の方が変更に強いもんができるんじゃないかと。 最近のアジャイル開発とか言われてるのもこんな感じの考え方でしょ?
設計する時だってプロトタイプ作成を並行して 頭で考えたことが実際に実現可能か調べながら進めていく。 んで一発で完璧な設計にたどり着くことなんて稀で いろいろ試行錯誤しながら進めていく。 このプロトタイプ作成作業を実装フェーズにカウントすると 行き当たりばったりだと罵られて、 設計フェーズにカウントするとお咎め無し? 俺には同じものに見える。
>>86 > 俺には同じものに見える。
同じものだ。
しかしプロトタイプを実装フェーズだと考え、それをそのままの形で成果物に
してしまうと成果物が無茶苦茶汚くなることがある。
もちろんそれはプロセス側で対処すべき問題なのだが、そういった対処が
なされていなければ、「行き当たりばったりで作った汚いコード」という謗りを
受けることになる。
プロトタイプを設計フェーズだと考える場合、そのプロトタイプは実装フェーズ
に引き継がれないという暗黙の前提が生まれるため「行き当たりばったり」という
表現は妥当ではなくなる。 ってーか設計フェーズは試行錯誤するのが当たり前。
なるほど。
このスレではわりと好意的な評価のようなので こころを買ってみた。 最初は眠くなる話が多い気がする。 良さが分かるまでにしばらくかかりそうだ。
>>89 もしや、他にデザパタの本読んだ経験無い?
結城本でFAかと思ってた
結城本はかなりメジャーだからむしろ宣伝するやつが少ない
「ここは○×パターンでコーディングする」と書かれた仕様書が上から落ちてくる のであれば、結城本でも十分だろう。 しかし自分で適用可能なデザインパターンを見つけ出す(=自分で仕様書を書く)場合、 結城本だけではツライと思う。 (練習問題を飛ばさずに真面目にじっくりやってれば、できるかもしれんが。)
>90 結城本は持ってる。 デザパタそのものの有用性は自分なりに理解してる。 結城本の感想は93氏に近い。 過程すっ飛ばして天からデザパタが降ってくるスタイル。 パターンの暗記は出来ても理解はありえないなと。 「こころ」は前書き読む限りだと過程を重視してるようなので期待。 まだ第一部読んでるあたりで、UMLがなんちゃらとかそんな話。 非常に眠くなる。読み飛ばせばいいのだけど、それが出来ない性分。
ある程度パターンを暗記したら、あとは実際にデザパタを意識したコードを読むのが良いと思う。 クラスライブラリを勉強するのがいいかもしれない。 C#とかJavaのクラスライブラリリファレンスをみると勉強になったりする。 あとは使ったことないオブジェクト指向言語の勉強するといいかもしれない。RubyとかD言語とか。 後はフレームワークとかも。Log4jとかRailsとか。 論を勉強するのもいいけど、やっぱり証拠もないと理解しにくいかと。
てっきりあの「あなたの考えを広げるためのヒント」が 結城本の特徴なのかと思ってた。 あれの域にとどまらず、もっと応用の指針について 解説されてる本があるのね。
結城本はGOFの劣化版でしかない GOFのわかりやすいところ(結城が理解できたところ)を 初心者向けに言い直しただけ それ以上の情報はいっさいなし オブジェクト指向のこころとアジャイルソフトウェア開発の奥義を読んで、 リファレンスとしてGOFを手元においておけばいいと思う
GOFはなんでC++を選んだのだろう
どういうこと? Smalltalkで全編書けってこと? GoF本オリジナルは1995年だからJavaはありえんよ
日本語版なら付属CDにJavaソースあるしね。 確か、SmalltalkとC++のうち話したいことがわかりやすいほうで例示する、みたいなこと 書いてなかったっけ。
>>99 単純になんでだろう、と思っただけなんだ。
そうか、Javaなかったのか。そりゃ仕方ない。
結城さんに抽象的なモノを説明させるとかなりヤバい。 例とか背景とかなしで、方法だけを詳しく掘り下げる。 同マルチスレッド編もそんなスタイル。途中で読むの止めた。 具体的な内容だとすごく分かりやすい・読みやすいもの書いてくれるんだけど。 HOW TO 本が彼の本来のフィールドだと思う。
あるシステムのGUIコンポーネントを表示する部分の設計をしているんだけど、 綺麗な設計が浮かばなくて悩んでます。 Componentは0〜複数個のFrameを持っていて、 Frameには0個か1個のComponentが入り、描画の仕方はComponent自身が知っている、 というのが基本設計で、 「WindowコンポーネントはMenuBarフレームとStatusBarフレームを持っている」 「MenuBarフレームにはMenuコンポーネントが入る」 という感じで定義されていく予定なんだけど、 フレームの大きさに合わせて描画するコンポーネントが一般的なのはいいけど、 フレームの中に入ったコンポーネントの大きさによって描画が変化するコンポーネントがあって、 一度の再描画で全部綺麗に更新するためにはトップダウンでもボトムアップでも駄目で困ってます。 こういう場合、どういうパターンが有用だと思いますか?
Composite
トップダウンでできんじゃないの?
>>104 のいうとおりCompositeで。
トップダウンだと、例えばWindowコンポーネントがMenuコンポーネントを中に持つとき、 1. Windowコンポーネントが自分自身の高さ、幅を持つ(例;width=640 height=400) Menuコンポーネントが入るべきフレームを設定する(フレームの大きさは幅640、高さ不定) 2. MenuコンポーネントはWindowコンポーネントの幅に応じて高さが決まる (幅が狭いとメニューが二行になったりする。今回は30pxと決定) 3. WindowコンポーネントはMenuコンポーネントのすぐ下にToolBarコンポーネントが入るフレームを設定する。 この位置は、Menuコンポーネントが自分自身の位置を決めることによって初めて決まる。 今回のようにこの順番で描画してくれるなら問題ないのですが、 例えばToolBarが先に初期化されるようにプログラマに記述されたら、そのタイミングではToolBarを置く位置がわからなくなります。 二回走査すればいいのでしょうが、今ひとつすっきりとしなくて困っていますが、 とりあえずCompositeで書いてみるかな…
そういうのはパターンと言うよりアルゴリズムの話
二回走査しなければいけない原因を分析 アルゴリズムの問題 構造の問題 一回走査で代替するにはどう走査すべきか 新しい手法はどのパターンを適用できるか(できなくても問題ない。銀の弾ではない) と手順踏めば良いだけのこと いきなりパターンに解を求めるのは違うよ
>>109 108じゃないけど本質的には同じじゃないか ^^;
本質は同じだけど、視野が狭くなるでしょ 元の課題の本質が理解できていない人がとるべき行動ではない
まあ、そんなこと言ってると、このスレの視野が狭くなって話題が無くなるけどな いいじゃん本質は似たようなもんなんだから。そこからパターンの話が広がってくかも試練氏。
そろそろJ2EE5.0パターンとか出てこないものか…と思う。
115 :
デフォルトの名無しさん :2006/05/08(月) 14:39:08
シングルトンのgetInstanceに引数があるのはおかしいでしょうか。 ファイルを複数管理するクラスで、 アプリ起動時に必要なファイルを読み込み、 メソッドに応じて読み込んだファイルの内容を返すという処理をさせます。 初期化の段階でファイルのルートパスが必要になるので getInstance(String path)のようなパターンをオーバーロードしようと思っています。 getInstance(String path)はアプリの初期化処理内で1度だけ呼び出し、 ほかはgetInstance()を呼び出すようにしようと考えています。
>>115 シングルトンって言われると違和感が多少あるけど、処理自体は変じゃないと思いますよ。
>>115 オレなら初期化用のメソッドを作るかな。
>115 getInstance(String) の呼び出しを 一回に限定しないとならんわけだけど それはどのように実現するつもり? ファイルパスだけでいいのなら、 プロパティファイルなりで指定して 静的初期化ブロックで処理してしまえば良いのでは。 (javaじゃないなら環境変数などで渡す)
そんなかんじでよさげ。 ハッシュ(マップ)みたいなものにファイルパスをキーにして 自分のインスタンスを複数保持すればいいんでね? ハッシュから取り出せなかったら場合に、同期で初期化すればよいかと。
>>116-119 お忙しい中、良レスありがとうございます。
今まではプロパティファイルに絶対パスを指定しておいて初期化メソッドの中で読み込むようなことをしていました。
Webアプリだと環境によってデプロイされる場所が変わってしまい、環境毎にプロパティファイルを設定するのがたいへんでした。
ファイル自体はWEB-INF/fileの位置においてあるので
ServletConfig#getServletContext().getRealPath + "/WEB-INF/file"のようなかたちでパスを作り
初期化メソッドにパスを渡すような構造に変更しました。
デザパタとは外れますが >環境毎にプロパティファイルを設定するのがたいへんでした。 war作るたびに設定編集するのは大変なんで ・環境の数だけ設定ファイルディレクトリ作成 ・環境依存の設定ファイルを全てぶちこむ ・環境の数だけwar作成 ・warを作成する時には環境に適した設定ファイルを使用する ・warの作成は設定の選択も含めてantで行う。 にしてみてはどうでしょうか。
>ServletConfig#getServletContext().getRealPath + "/WEB-INF/file"のようなかたちでパスを作り 初期化メソッドにパスを渡すような構造に変更しました。 個人的には ・クラスパス直下に、設定ファイルへのパス一覧を記述した.propertiesファイルを置く。 もしくは ・web.xmlに設定ファイルへパス一覧を記述する。 が好き。 コードがすっきりするよ。
123 :
デフォルトの名無しさん :2006/06/04(日) 02:34:27
if文はあんまりつかいません と言い換えればOK? 説明文で躓いてるならそれで十分だけど 内容で躓いてるなら 「状態を変更するif文は必要」 「状態を判断するif文は不要」 と考えれば少しは納得いくかも
switch(状態){ case 朝: currentState = mornig; break; case 昼: currentState = day; break; case 夜: currentState = night; break; } currentState.showMessage(); こうしか思いつかないんですけど、なにか根本的に間違ってますか?
>>123 意味的な話をすると、State パターンってのは、表示メソッドが showMessage01 〜 showMessage03 まであったときに、
showMessage01────┐ showMessage02────┐ showMessage03────┐
│ 朝表示するメッセージ │ │ 朝表示するメッセージ │ │ 朝表示するメッセージ │
│ 夜表示するメッセージ │ │ 昼表示するメッセージ │ │ 昼表示するメッセージ │
│ 夜表示するメッセージ │ │ 夜表示するメッセージ │ │ 夜表示するメッセージ │
└──────────┘ └──────────┘ └──────────┘
と
朝表示するメッセージ─┐ 夜表示するメッセージ─┐ 夜表示するメッセージ─┐
│ showMessage01 │ │ showMessage01 │ │ showMessage01 │
│ showMessage02 │ │ showMessage02 │ │ showMessage02 │
│ showMessage03 │ │ showMessage03 │ │ showMessage03 │
└─────────┘ └─────────┘ └─────────┘
のどっちが使いやすいかーって話にも関連してくる。ちなみに下が State パターン
>>125 違う違う。状態は予めセットしておくの。
んで showMessage したいときに currentState.showMessage()
128 :
123 :2006/06/04(日) 03:33:02
>>126 なんとなくわかりますが…
>>127 その状態はいつセットするんですか?
123のサイトの説明ではさっぱり。
currentStateには状態がかわった時にmornigなりdayなりがはいるんですよね?
実装がわからないです。
バカでもうしわけないです。
>>128 いつセットするか……。
少なくとも showMessage の直前までには正しい状態がセットされてる必要があるね。
逆に考えると、『状態がセット』 されるタイミングと 『 実際に showMessage 』 されるタイミングを離すことが出来る
ってのも、メリットの1つじゃないかと。
状態は変わったときだから その場合は時間が経過した時になるかな? showMessage()しかないから利点が見え難いかもしれない 朝・昼・夜にできることがshowMessage以外にも10種類あって Timerで時間がたったときに状態を変更すると考えるといいかも すると状態変更はTimerの監視部分だけになって あとはstateを呼ぶだけで勝手に動作が切り替わる
『状態がセット』 というより、『状態を判断するタイミング』 って言ったほうが良いかな。 タイミングってのは、コード上の箇所も含むよ。 先に状態を判断しておいて、後からその状態に従った動作を行わせるってのも State パターンで行えるし。
132 :
123 :2006/06/04(日) 03:56:15
うーん、いまいちよくわからないですね。
朝.showMessage();
昼.showMessage();
夜.showMessage();
の3つのメソッドを作って状態みてどれかのメソッドを呼び出す。
このやり方とサイトの説明の差は
>>129 さんの
『状態がセット』 されるタイミングと 『 実際に showMessage 』 されるタイミングを離すことが出来る
しかないように思えます。
今日はもう寝ます。明日また考えたいと思います。
みなさんありがとうございました。
133 :
123 :2006/06/04(日) 03:58:09
>>130 さんのがなんとなくわかるかも…
明日その辺も考えてみます。
>>132 ちなみに、こういうメリットもある。
State パターンってのは、『状態』 と 『その状態のときに行う動作』 を ”1つに” まとめておくから、 (
>>126 )
currentState.showMessage() するときには、currentState に何がセットされてて、どういう動作を行うのか考える必要はないんよ。
ただ showMessage() すれば、その状態に合った動作が行えるってことは保障されてる。
だから、勝手に MyState のサブクラスを自作して、それを currentState にセットしても動くかもね。
たとえば後からStateに夕方を追加したくなったとすると Stateを使わない方法では 1.currentStateに状態をセットする箇所に夕方の場合を追加 2.showMessageの中のifやswitchに夕方の場合を追加 showMessage以外にも似たメソッドがあったらそれら全ての中のswitch文を更新しなきゃならん。 つまり2の作業があちこちに散らばっていて見落としが起こりがちだし ちょっと間違えると既存の朝昼夜の動作にもに影響が出かねない。 Stateクラスとしてまとまっている方法では 1.currentStateに状態をセットする箇所に夕方の場合を追加 2.夕方クラスを追加 クラスを増やすぶん、追加すべきコード量自体はむしろStateを使わない場合より多くなりそうだが 2の作業については変更箇所が新規クラスの追加という形で一箇所にまとまっているため 既存の朝昼夜は基本的に触らなくてすむ。
136 :
135 :2006/06/04(日) 21:22:31
補足。 状態ではなくメソッドのほうを増やしたくなったとき Stateを使う場合では朝、昼、夜クラスのメソッドをそれぞれ追加する必要がある。 状態の種別のほうが追加や変更を受けることが多そうならStateを使うといい。
137 :
123 :2006/06/05(月) 11:43:58
いろいろと説明ありがとうございます。 ・朝、昼、夜の状態で行いたい処理が複数ある場合はStateパターンを使う意味がある。 朝、昼、夜クラスとそれらを使うクラスの4つ 夕方が増えた場合の変更箇所 夕方クラス追加。使うクラスの分岐追加の2箇所。 ・処理がshowMessage()のみの場合(処理がひとつの場合)Stateパターンを使う意味があまりない。 (状態が増える可能性はあるが処理が増える可能性はない。) 朝、昼、夜のshowMessage()メソッド3つ。 スイッチで各showMessage()をよびだす。 夕方が増えた場合の変更箇所 夕方メソッドの追加、スイッチの分岐追加の2箇所。 とゆう認識でよろしいでしょうか? でもまだ疑問が。 いろいろサイトをみてまわったんだけど、ほとんどの所でStateパターンはifは使わないと書いてます。 でも今までのやり方だと状態を変える時結局ifが必要で、 ただのポリモルフィズムの説明に思えるんですが…
>>137 >・処理がshowMessage()のみの場合(処理がひとつの場合)Stateパターンを使う意味があまりない。
割とそうではない場合も。このあたりはケースバイケース。
>でも今までのやり方だと状態を変える時結局ifが必要で、
>>124 >ただのポリモルフィズムの説明に思えるんですが…
認識としては全く正しい。多態を使用して、”オブジェクトで状態を表す”のが State パターン
>>137 1.状態を変えるための判断としてのif
2.(今現在の)状態を判断するためのif
がごっちゃになってない?
Stateパターンだとifは使わないというのはおそらく後者のほうかと
前者はどうしようもないよね。
140 :
123 :2006/06/05(月) 13:35:35
りょうかいです。 すっきりすることができました。これでやっと次に進めます。 ありがとうございました。
141 :
デフォルトの名無しさん :2006/06/06(火) 00:53:15
>>135 コード量では後者の方がむしろ追加分量が増えるという所が何とも吐き気がするんだが…w
インデントとか改行みたいなもんだよ コードの見通しを良くするために使う。 また、見通しが良くならないのであれば使うべきではない。
一番大事なことは 状態のような概念をオブジェクトとして扱うという考え方 なんじゃないかと思う
一昔前はオブジェクト=モノ。 モノに操作を与える=クラス。 だったすからねえ。 ていうかオブジェクト指向のオブジェクトって言葉が もう時代にそぐわない気すらするですよ。
エンティティのほうがまだまし?DBのほうで既成の用語なんで使いづらいけど
この調子で幸せになれる議論をお願いします
しかしやっぱ、そんなに議論する内容ってないよねこのスレ。
148 :
デフォルトの名無しさん :2006/07/07(金) 23:17:05
commandパターンとstateパターンの違いがよく分からん。 commandパターンは、命令をクラス化して、その派生クラス のexecute()を呼んで処理させる。 stateパターンは、状態をクラス化して、その派生クラスの hogehoge()とか、fugafuga()を呼んで処理させる。 結局、名前が違うだけで考え方は一緒のような気がするんだ が・・・という俺の愚痴。
>>148 Strategy と State と Command は、どれも多態で処理を切り替えてるから、
おそらく知らない人が見れば同じに見えると思う。
ただ、意味的な物は随分異なる。重点はそこかと。
そうかそうか。よーくわかったぞ。
考え方は一緒だけど、使う箇所が違うってだけで分けられたパターンって結構あるよね。 前々スレあたりでGoFも一部の似たようなパターンは無くすとかいってなかったっけ?
>>141 テストケースのコード量も加味して考えるといいのでは。
StateとStrategyは構造は同じだけど、意味の区別がやや不明瞭。 Commandは意味も構造も違う。 GoFの原典を読むとそんな感じだな。
154 :
デフォルトの名無しさん :2006/07/08(土) 02:58:41
そんな事いったらChainOfResponsibilityだってたんなるtree構造じゃん
そうか。なるほど。うん。お前の言いたい事はよくわかったぞ。
156 :
デフォルトの名無しさん :2006/07/08(土) 04:29:30
何がtree構造だ?馬鹿。
どうやるとこのスレ盛り上がるのかな。
なるほど。GoF信奉者は馬鹿ばっかりだという事がよくわかったぞ。
159 :
デフォルトの名無しさん :2006/07/08(土) 22:04:42
ごめん。 オレが。 フェブってた。
フェブってたという言葉がググレません。 トミーフェブラリーのことかー!
ファブってたのtypoじゃないか
ファブリーズのことかー! それは言うならファビョるじゃないかな、たしか。
現在ゲームをつくっていてどういうパターンを使えばいいか悩んでいます アドバイスをお願いします。 空で変な生き物(まある種の鳥)が動き回るという部分を作っているのですが、 ここで鳥Aと鳥Bはお互いに相手の位置を参照して動きを決めます。 そのため、 空Skyのオブジェクトが鳥A,鳥Bへのオブジェクト参照していて、 同時に鳥Aと鳥BもSkyオブジェクトを参照するというデータ構造にしています。 このようなものを実装するのに適したデザインパターンを教えてください。
165 :
デフォルトの名無しさん :2006/10/21(土) 01:40:01
age
>>164 表示という親クラスを作って
空、鳥A、鳥Bをそのメンバにする。
鳥Aと鳥Bの相互作用が絶対に必要なら
Birdsという鳥全体の動きを仕切るクラスを作って、
そこに鳥Aと鳥Bを入れる。
>>164 Observer
はどうでしょう。
鳥Aは鳥Bの位置を監視し、その値がかわったら、自分(鳥A)の座標をupdateする。
鳥Bも同様。
>>168 無限ループに突入しないようにしないとな
まだ結城本読了&自分のプログラムにいくつか採り入れる っていうレベルで、まだGoFのカタログ読んでないです。 結城本のBridgeの「関連しているパターン」に AbstractFactoryが載ってるんですけど 引用: Bridgeパターンに登場するConcreteImplementor役を 環境にあわせて適切に構築するために、 AbstractFactoryパターンが用いられる場合があります Implementorが「抽象的な工場」、ConcreteImplementorが「具体的な工場」 なのか ConcreteImplementorが「抽象的な工場」で、それを継承して「具体的な工場」 なのか 状況次第なんですかね? そろそろGoF読まなきゃと思いつつ、なかなかとっつきにくい
そもそも >Bridgeパターンに登場するConcreteImplementor役を >環境にあわせて適切に構築するために、 構築されるものが ConcreteImplementor なんじゃないの?
>>171 BridgeパターンのConcreteImplementorが
AbstractFactoryの「抽象的な工場(AbstractFactgory)」を構築するのか
「具体的な工場(ConcreteFactory)」を構築するのか
ということがわからんのです(;´Д`)
>>172 AbstractFactory パターンを使って、ConcreteImplementor を作る、
だと思うよ。クラス図を書けばすっきりする予感。
>>173 なるほど、そういうことだったんですか。。。
やっと頭の中でクラス図がぼんやりできてきました。
デザパタを教条的に使うだけじゃ、いかんですな。<自分
ありがとうございます
>>175 書き換えられなかったらどうするのか、って話だ。
void ColorPuts()()
>>175 あなた程の天才がなぜこんなスレを見てるのですか
Adaptor - 貴方は委譲しますか?継承しますか? 漏れは原則委譲派
>>180 case by case だけど、俺は継承だな……
委譲(包含+転送)しか使ったことないです。 継承の方が優れてるケースってどんな時でしょうか。 基本的に adapter is a adaptee な状態にはならんので 継承使おうと言う気が起きないです。
183 :
181 :2006/11/29(水) 01:17:07
あ、ごめん。普通に勘違いした。委譲だ委譲。 よく考えなくとも Adapter クラスを継承することは大前提なんだよな。 すまね orz
結局継承によるアダプターは誰も実践してない罠。 でもアダプターパターンの解説見てると 継承による方法が先の場合が多いのはなぜなんだぜ。
委譲よりも継承の方が、初心者にはOOっぽく見えるんだぜ?
継承による場合は override によって処理を上書きすることで 完全にコントロール出来ることが利点だと説明するサイトがあったが コントロールしちゃったらアダプタでもなんでもないと思った。
187 :
デフォルトの名無しさん :2006/12/28(木) 20:59:47
質問なんですが、ファクトリパターンってインスタンスが一つあればいいってのはわかるんですが、 メソッドをstaticじゃなくて、シングルトンパターンにする必要があるのですか? どうせなら、インスタンス作らないで、staticメソッドにしてアクセスした方がいい気がするのですが インスタンスを生成するかstaticにアクセスするかどちらの方がいいのですか?
一概には言えまい staticにしてしまうとファクトリ事態を抽象化することが出来んからな
189 :
デフォルトの名無しさん :2006/12/29(金) 00:46:41
>>182 adapter has a adaptee?
client → Target △ | Adapter→Adaptee TargetはClientに対するInterfaceだからAdapterがTargetを継承するのは当然なのでは? AdapterはAdapteeに委譲するのは当然だし
>>191 当然だと思う。
でも世のデザパタ解説サイトだと
「継承」「委譲」の2種類を例として出してる場合、
「継承」ではTargetはクラス、Adapterはそれを継承する形になってて
「委譲」ではTargetはインターフェース、Adapterはそれを実装する形になってる。
本質を考えれば継承の場合でもTargetはインターフェースだろ?と思うんだけど。
(というか継承はいらねえと思われ。)
オリジナルのGoF本を読んでないので分からんけど。
>>192 クラスでもいいのでは?
Targetとしての振る舞いに共通なものがあるのだとしたら
抽象クラスとする事もアリだと思うけど
Client → Target
△
;
AbstractTarget
△
|
Adaptar → Adaptee
まあ、↑みたいにするAdapterパターンの説明としては複雑になるから 省略してTargetをクラスにしてるんだと思うけど
クラスが悪いとかクラスじゃできないとか言ってるんじゃなくて。
Client からは統一的に扱える、同じように見えるって側面を強調するなら
インターフェースでいいじゃねえかと。
委譲のパターンでもTargetはインターフェースで説明できるのに
そっちの方がより無駄のない本質的な説明になるのに、
なんでクラスなの?と。
(
>>192 では委譲・継承とクラス・インターフェースの組み合わせが逆だった。)
↓これが一般例で、他はもう特殊例でしょ?
<<interface>>
client → Target <|・・・・・Adapter ・・・・・|> Adaptee
implements uses
ひどいところでは
継承使うパターンがデフォですよ、
単一継承でいかんともしがたい時には
委譲使うパターンで回避ですよ、
に近い説明すら行ってる。
なんかもうコードが共有されるなら継承が最高の解なんだよ、みたいな。
それは15年前に通ってきた道だろう、と。
それをいったらデザインパターン自体が出てからだいぶ時間がたってるから 当時の説明をそのまま鵜呑みにしてもしょうがないでしょ。 もし初心者がそれ見て今の時代にアンマッチな知識をインプットしてしまう 事に懸念を感じるなら、自分で「こう解釈するのがいいですよ」って説明する サイトでも立ち上げてみればいいw
>>195 >↓これが一般例で、他はもう特殊例でしょ?
それは少し乱暴だと思うが・・・・・
そう熱くなるなよw
>>195 っていうか、「委譲」って言葉の使い方間違ってね?
Effective C++ みたいに、時代に合わせて新しくなるデザパタ本があればいいのにな。
GoFのデザインパターンは、モデリングの世界の"Hello World" 見たいな物になってしまったンだと思うね
ほす
「それはパターンから外れているから駄目だ」とかは全然駄目なセリフの例ですね
ほす
いまさらデザインパターンを語ることはあるまい
デザインパターンってもう語りつくされたん?
語れるほど言葉を持たないというのが正確なところかw
これはよく使うパターンって何?
Iterator
Singleton、Factory、Template あたりかなぁ。
こんぽじっと
こーるばっく、こまんど、
微細主義,機能分割,集団無能化・・・
213 :
デフォルトの名無しさん :2007/02/10(土) 20:34:33
結城さんのMLってどうやって送信先メールアドレスを変えるんだ? 進級2つ登録したから古い方だけ購読解除できればいいんだが まぁ4月になればアドレスが使えなくなるから放置でもいいんだけど
NullObjectのような、GoFの23には含まれていないパターンについて勉強したいのですが、 みなさんはどのように勉強されましたか? 個人的には本で勉強したいので、参考になる書籍などを示してほしいです。
216 :
デフォルトの名無しさん :2007/02/12(月) 19:33:51
age
boostのコードを読むと、すごい勉強になった
219 :
デフォルトの名無しさん :2007/02/12(月) 20:55:12
デザインパターンを勉強すると、 自分が頭良くなってスゴイSEなったってカン違いするヤツ、 多いよな・・・
一人前のSEって感じでしょ
GOFデザインパターンはマイクロアーキテクチャーの一種に分類され、 その対象領域は一般にプログラムと呼ばれている、いわゆる動作単位であるから、 どの様に考えてもプログラマの職域に属する事項であるかと
>>221 「マイクロアーキテクチャー」って一体何の事だか、
分かっている?
SEではないな
半導体設計が思い浮かんだ。
225 :
デフォルトの名無しさん :2007/02/19(月) 23:50:05
>>219 結局デザインパターンって、フレームワーク作る時にしかあんまし使わないかなあ
勉強が足らんな
227 :
デフォルトの名無しさん :2007/02/20(火) 00:13:46
フレームワーク使う側でも使う。 java.lan.io.* なんてデコレータパターンの塊だし コレクションフレームワークはそのままイテレータパターンの実装だし。 フレームワークが面倒見てくれない粒度の細かいオブジェクトの組み立てには それはもうファクトリやらテンプレートやらのオンパレードさ。
229 :
デフォルトの名無しさん :2007/02/20(火) 00:33:57
>>228 io自身がデコレータでしょ
使ってる側は意識しないはず
イテレータは素人でも使うよ
イテこまし…いやなんでもない
つーか、あるものを利用するだけで自分では使わないんだw
プログラマなんてみんなあるものを利用するだけでしょ アセンブラでもマシン語でも。
いんや
ゴフ!
ちょっと皆さんに助言願いたい事があります。 例えば、ゲームプログラムなんですが、 あるキャラクタークラスYがあったとしてキャラクタークラスは内部に AI処理を担当するクラスZをコンポジションでもっていたとします。 で、AIのタイプにはいくつかあって(タイプA/B/C)、それぞれの タイプにも、細かく引数によってパラメータの指定ができるとします。 AI担当クラスZはA/B/Cの抽象クラスか、あるいはA/B/Cをコンポジションで 持っていてもまぁなんでもいいのですが、 他のクラス(ゲーム進行管理クラスなど)からそのキャラクターのAIの動作を 変更するために、例えばAI処理をタイプBに変更、そしてB特有のパラメータを設定できるとします。 こういう事を実現するために、現在はクラスZを持っているキャラクタークラスにも、 タイプA,B,Cいずれの処理に切り替えるメンバ関数、あるいはそれぞれのタイプ別にパラメータを 設定する独立したメンバ関数を設定しています。 でもこういう事をすると、AIのタイプを増やすたびにキャラクタークラスにもそれに応じた メンバ関数を追加する手間が必要になってしまいます。 もっとスマートなやり方は無いものでしょうか?
他のクラス ──→ AIクラス △ ┌───┼───┐ │ │ │ タイプA タイプB タイプC だろ普通
>>235 >キャラクタークラスは内部にAI処理を担当するクラスZをコンポジションでもっていたとします
これ、Composition とは言わないだろう……
>AI担当クラスZはA/B/Cの抽象クラスか、あるいはA/B/Cをコンポジション
だから、Composition じゃなくて Strategy
>からそのキャラクターのAIの動作を変更するために
今度は State?
>にもそれに応じたメンバ関数を
どういうメンバ関数? それほど増えるとも思えないが。
>もっとスマートなやり方は無いものでしょうか?
無い。これが上限であり下限。
割りきりが必要。極端に変な動作はさせないほうが吉。
エエェェェ・・・?
>>235 他のクラスオブジェクトへの参照を持つ事をコンポジションというのではないのですか?
ZにA,B,C,それぞれに特有のパラメータを設定するためのメンバ関数を追加するのがいやなので、
いっそZへの参照を利用側に渡してしまおうかと思ったのですが、内部のオブジェクトの参照を
外部に渡してしまうのは好ましくないようなので、どうしようかと思ったのです。
Zのメンバ関数のいくつかは、キャラクタクラス以外のクラスから呼んで欲しくないものがあるので・・・。
書き間違えました。 誤:ZにA,B,C,それぞれに特有のパラメータを設定するためのメンバ関数を追加するのがいやなので、 正:キャラクタークラスにA,B,C,それぞれに特有のパラメータを設定するためのメンバ関数を追加するのがいやなので、 です。
>>240 ABCがAIだろうがキャラクターだろうが同じじゃハゲ
┌─→AIクラス │ ◇ 他のクラス ─┤ │ │ ↓ ┌→キャラクターA ├─→キャラクター <|─────┼→キャラクターB │ └→キャラクたーC │ ┌→キャラクターA用のセッター └─→プロパティセッター<|───┼→キャラクターB └→キャラクターA用のセッター
まちがいたw ┌─→AIクラス │ ◇ 他のクラス ─┤ │ │ ↓ ┌→キャラクターA ├─→キャラクター <|─────┼→キャラクターB │ └→キャラクたーC │ ┌→キャラクターA用のセッター └─→プロパティセッター<|───┼→キャラクターB用のセッター └→キャラクターC用のセッター
Javaで書くとこんな感じ AICharactor iaChar = ai.getCharactor(); PropertySetter setter = PropertySetterFacotory.getSetter(aiChar); setter.set(iaChar,otherObject);
プロパティじゃなくてパラメータだなw
>>235 そういうときこそ継承使えばいいじゃない
全 AI が必要とするパラメータを一つの巨大なクラスに集めて、それを渡すことにするとか。 各 AI はそのオブジェクトを一つ受け取って、自分に関係するメンバだけ触ることにすれば、インターフェイスは共通化できる。 AI が増えても、そのクラスにメンバを増やすだけで、他は一切書き換えずに済む。 再コンパイルは必要だろうけど。
みなさん、ありがとうございます。
>>247 その方法も考えていました。なんかオブジェクト指向的に完璧な解決策じゃない
気がしていたんですが、それが一番手っ取り早いのかもしれませんね。
・・・・・・・・
パラメータをいじる権利のある人がAIを生成して もしも途中でパラメータを変更する必要があるならそのままそいつが参照を持ちつづけ キャラクタは自分が生成されるときにAIへの参照を貰い受けるような形のほうがいいと思う パラメータを設定できないtickするだけのインターフェイスで貰えるならなお結構
>>235 なんかよくわからんけど、直感的にBridgeパターンが頭に浮かんだ。違うかな。
オブジェクト指向ってホントウに垣根が高いんだな・・・・
たぶんずれると思うけど。 ・ゲーム進行はキャラとAiBuilderを知ってる。キャラへAiをセットする ・キャラはAIだけ知ってる ・AiとABCTypeはAiBuilderによって生成される ゲーム進行 ----> AiBuilder------- ↓ ↓ | キャラクタ ----> <Interface>Ai | △ | | ↓ AType BType CType
ずれすぎてだめだった。 ABCはAiのサブクラスね。
全角スペースを使い玉へ 半角スペースは続けて使うと一つにまとめられちゃうのだ
テスト あああ
interaface Param{ } interface Ai{ doHoge(Param param); doFuga(Param param); } interface AITarget{ setAi(Ai ai); Param createParam(); } class Character implements AITarget{ }
>>256 これは専ブラが半角スペースをユニコードに変換するタイプなんでおkなんだよ
キャラクターなんていうデカイ括りがなんで必要なのかわからん まずキャラクターありきでデザインするのよそうよ
260 :
デフォルトの名無しさん :2007/03/02(金) 21:48:08
今回初めて Visitor パターンを使ってみようと思ったんだけど、 Visitor パターンって巡回順(次のaccept) は、Element に書いた方が、巡回順が再利用できていいと思うんだよね。 でもそうすると、巡回終了処理用のメソッドが欲しくなる。 結城さんの本しか見たことがないんだけど、 この実装方法は、正攻法? 邪道? ex) public void accept(Visitor vis) { vis.visit(this); Iterator it = contents.iterator(); while(it.hasNext()){ ((Element)it.next()).accept(vis); } vis.visitEnd(this); //← これのこと }
最近はaspectあるからVisitor要らなくね?
なわけないだろ。 aspectとかDIって害虫だろ。 そんな迷走してるより、 とっととクロージャ取り入れて、正常進化して欲しい。
なわけないだろ。aspectとDIは本流だろ。
AOP&DIの文脈でクロージャの話が出る理由が分からん。
それが正常進化とも思えん
クロージャはDにもあるし、Javaにもいずれ実装されるからだろ。
Javasist 系は、VM が後方互換のないバージョンアップをしたとき、 手の打ちようがないよな。 Aspect がうまい具合に言語仕様に入るなんてこともなさそうだしな。
ランタイムでウィービングすりゃいいじゃん。
2ちゃんで煽りながらデザパタ学習した池沼が 古い話題を壊れたレコードのように繰り返すスレ
ま 敢えて言うほどの事でもないがの
271 :
269 :2007/03/14(水) 22:13:31
こんなスレ未だに見てる奴が居る事実に感動 元お豆のsずきさんかな
たかひろくんのデザパタ幼稚園
ごふっ
質問です。 テンプレートメソッドパターンを適用しようとして気になったのですが、 ConcreteClassの方で内容が一緒になるものがいくつかある場合はどう書くべきでしょう? (内容が同じになるものが複数組あります) 内容が異なるものもあるのでこのパターンを使う必要性自体は依然あるのですが、 このままでは冗長です。 ぱっと思いつくのは、組ごとに共通のクラスを作っておいて 各コンクリートクラスは共通クラスのただのラッパーになる、という設計ですがおかしいでしょうか? 使っているのはPHP5なので多重継承はできません。
276 :
デフォルトの名無しさん :2007/03/26(月) 18:21:23
age!
ConcreteClassのユーザーから見て、 その「処理が同一だけど異なるクラス」とやらは 「全く同じクラス」にしてはいけないものなの?
278 :
275 :2007/03/26(月) 19:18:30
木を切る部分を別クラスにして田中君と鈴木君の両方で使えるようにスりゃいんじゃねーの?
差し障りが無ければどんな場面に使おうとしてるのか聞きたいです。 もう一階層挟んだら綺麗にまとまったりしないかとか。
メモリが必要になったときに一度だけ生成されて、それ以降の記述では 必ず最初に確保されたメモリが使われるようなパターンは何というの? C++風に描けば if(a == 0)a = new HOGE; //aを使った処理の前にこれが必ず入る aを使った処理… 全部グローバル変数にすればいいんだろうけど、使わない領域は 確保したくないって時にやる(a が不要になったときは回収してもOK)
>281 Singleton
284 :
275 :2007/03/27(火) 12:17:40
>>279 >>275 で書いた共通クラスというのはそういうイメージなのですが、
タイプAクラス、タイプBクラスみたいなのを作って各ConcreteClassがそれをメンバとして持つ様な感じですかね?
>>280 symfonyでモデルクラスをDBスキーマから自動生成後、
各モデルクラスに同じ機能を持たせたい(基本的にその機能の実装はモデルクラス毎に違うが、同じものもある)というケースです。
っていうか、そのモデルは何を表してるモデルなのよ? DBから生成されたものに後付で持たせたい機能って言う意味がわからん モデル=状態ならばそれ自体が処理するメソッドを持たすべきではないな
なんかモデル層がぶくぶく太っていく様が想像できて怖いんですが。
>>280 まず、モデルの定義を明確にしろ。
・DBエンティティをそのまま表したクラス(状態)を「モデル」と呼ぶのか、
・それとも問題領域に現れるクラス(状態+振る舞い)を「モデル」と呼ぶのか、方針を決めろ。
後者であれば、
>>278 の例で言うと版画作成者 Tanaka, Suzuki 自体をモデル化しろ。
次にTanakaと Suzuki 振る舞いとして、版画作成処理 cutPrint()メソッドを追加する。
版画作成の手順はほぼ共通だが、手順の詳細が同じだったり違ったりするという話なので、
cutPrintの処理内容をストラテジーパターンにして外出し(委譲)する。
具体的な処理方法は、ストラテジーパターンのConcreteStrategyクラスに記述する。
ここで、テンプレートパターンを使う。
ストラテジーパターンの抽象Strategy==テンプレートパターンのAbstractClass
ストラテジーパターンのConcreteStrategy==テンプレートパターンのConcreteClass
となるようにする。
もし、TanakaとSuzukiが全く同じ版画作成処理をするならば、
同じConcreteStrategyクラスを生成して呼び出せば良い。
違う処理をするなら、違うConcreteStrategyを生成して呼び出せば良い。
それだけの話ではないか
288 :
287 :2007/03/28(水) 07:36:24
symfonyってのをちらっと眺めた感じだと >・DBエンティティをそのまま表したクラス(状態) どうもこっちみたいだから、 そもそも適用するレイヤを間違ってる説が有力。
ODBMS屋乙。
> そもそも適用するレイヤを間違ってる説が有力。
それは前提を勝手に仮定した偏った意見に見える。
>>275 の話が
・どのようなアプリケーション・アーキテクチャ〜レイヤ構成を前提としているか
・一つのレイヤ限定の話なのか
・複数のレイヤにまたがった話なのか
によって、いくらでも回答の仕方があるだろう。
例えば、
下のレイヤで、オブジェクトの静的状態をDBMSに格納し、
上のレイヤで、オブジェクトの振る舞いをどう扱うか
という問題を仮定した場合にも、
・上のレイヤのオブジェクトに、振る舞い(ロジック)のみ記述し、静的状態を含めない方法
・上のレイヤのオブジェクトに、振る舞い(ロジック)と、下レイヤから持ってきた静的状態
を兼ね備えた「ドメイン・オブジェクト」を当てはめる方法
の二通りが考えられる。
>>287 は、後者の立場から説明した。
補足: 前者の立場でも DBMSエンティティ=静的状態=ドメインオブジェクト と呼ぶことがあるが、 オブジェクト指向本来のドメインオブジェクトは、後者。
292 :
275 :2007/03/28(水) 12:42:19
symfonyは一つのテーブルから二つのクラスを生成する。
テーブルのレコードに相当するクラスと、テーブルに対して検索・書き込みなどを行うクラス。(後者にConcreteStrategyを持たせてる)
問題領域に現れるクラスが内部的な実装方法としてDBにデータを保存するようになっているだけ、と考えてる。
なのでそのクラスにそのデータを使うメソッドを書こうかと。
今、
>>287 の方法でやっていますがこれで良さそうです。
ありがとうございました。
エンティティとデータアクセスオブジェクトが自動生成ってことか データアクセスはデータアクセスに特化させる方がいいだろねー クラスの「役割」のくくりを大きくすれば、計算からデータの編集、保存まで一緒くたに するって考え方もアルンかもしレンガ、普通はもっと細分化するもんだ。 public WoodCutPrintContext{ public void doWoodCutPrint(){ Coodinator coodinator = getCoodinator(); Hanzai hanzai = coodinator.getHanzai(); DrawProcessor drawProcessor = coodinator.getCutProcessor(); hanzai = drawProcessor.draw(hanzai); CutProcessor cutProcessor = coodinator.getCutProcessor(); hanzai = cutProcessor.cut(hanzai); PrintProcessor printProcessor = coodinator.getPrintProcessor(); printProcessor.print(hanzai); } } public 田中君 implements Coodinator { ・・・ } public 鈴木君 implements Coodinator { ・・・ }
×;DrawProcessor drawProcessor = coodinator.getCutProcessor(); ○:DrawProcessor drawProcessor = coodinator.getDrawProcessor(); w
>>293-294 > public void doWoodCutPrint(){
身元バレバレっすよ兄貴ぃ
閑話休題
他の言語、他のフレームワークを使っている人間に
余計なコメントをつけても混乱するだけだ。
もしアドバイスをつけたいなら、Javaではなく
PHP5+symfonyの例に即したアドバイスをしろ。
例えば、
・ データクラスの生成(検索、保存)
・ データクラスの処理(計算、処理)
はべき乗パターンに則って別クラスにすべきだ、などという説は
そのような冗長な設計が「PHP5+symfony」に適しているかどうか、
という観点で議論すべきである。
だが、俺はそこまで突っ込むつもりはない。
そんな事をいちいち調べるつもりはないし、
質問者も困惑するだけだからだ。
>>293 つか、今気付いた。
おまいは TemplateMethod Patternを共用したい
という質問に対して、全然別の回答をつけている。
特に、クラスの命名がデタラメだ。
×× public WoodCutPrintContext{ ... }
× public class WoodCutPrintContext{ ... }
○ public class WoodCutPrintProcess { ... }
----------------------------------------------------------------------------
デザインパターンにおける Contextの用例
1. Interpreterパターン
http://www.hellohiro.com/pattern/interpreter.htm 言語に対して、文法表現(Expressionクラス)と、
文法表現に基づいて文を解釈するインタプリタ(Interpreterクラス)を定義する。
(注: Inerpreterクラスは付帯的に、言語の束縛〜副作用を表す評価環境(Context)を持つ)
2. Stateパターン
http://www.hellohiro.com/pattern/state.htm オブジェクトの内部状態が変化したときに
オブジェクトの処理内容を変えられるようにする。
(注: オブジェクトの取り得る内部状態の集合をContextクラスにまとめ、
個々の内部状態とその処理内容をConcreteStateクラスとして実装する)
----------------------------------------------------------------------------
>>293 のクラス名 WoodCutPrintContext は、
クラスの役割を表現しておらず不適切な命名と言える。
----------------------------------------------------------------------------
デザインパターンにおける Contextの用例 【追加と訂正】
2. Stateパターン 【訂正】
× (注: オブジェクトの取り得る内部状態の集合をContextクラスにまとめ、
個々の内部状態とその処理内容をConcreteStateクラスとして実装する)
○ (注: ここでは、複数の内部状態をとるオブジェクトを、仮にContextクラスと呼んでいる。 ←【訂正】
個々の内部状態とその処理内容をConcreteStateクラスとして実装する)
3. Strategyパターン 【追加】
http://www.hellohiro.com/pattern/strategy.htm Strategyパターンはアルゴリズムを、それを利用するクライアントから独立に変更できるようにする。
それぞれのアルゴリズムをカプセル化(Strategyクラス)してそれらを交換可能にする。
(注: ここでは、アルゴリズムを使用するクライアントを、仮にContextクラスと呼んでいる。
個々のアルゴリズムは、個別のConcreteStrategyクラス (〜A, 〜B, 〜C)に記述する。
個々のアルゴリズムは、Strategyクラスとしてカプセル化され、交換使用可能になる。)
----------------------------------------------------------------------------
もしかして
>>293 は、
鈴木、田中 == StrategyパターンのConcreteStrategyクラス、
WoodCutPrintContext == Strategyパターンのクライアント (Contextクラス)
と言いたかったのか?
だが、それでは
・鈴木と田中が同じ手順(Strategy)で版画を彫る
・鈴木が田中の手を借りて版画を彫る
が全く同じ表現になってしまう。これは不適切だ。
↑「同じ手順」って言うと、まるで「抽象TemplateMethodクラス」の事言ってるみたいだな。 「全く同じやり方」って言い直せば「ConcreteStrategyクラス」の話だと判る。
■
>>293 の表現 「鈴木が田中の手を借りて版画を彫る」
/*
>>293 のコード */
public class 鈴木君 { // ConcreteStrategy
// 版画を彫る
public Hanzai createWoodCutPrint() {
// 鈴木君はコンテキストを使って版画を彫る。
// 注: 鈴木君のコンテキストには手配師へのコネがあり、
// 手配師は、仕事の各工程をメンバーに適当に割り振る。
WoodCutPrintContext context
= WoodCutPrintContext.getinstance();
// 鈴木君は、寄せ集めメンバーがバラバラに各工程を担当した
// ツギハギ細工を、自分の成果として公開する。
return context.doWoodCutPrint();
}
}
↓
/* 「手配師が田中君しか集められなかった場合」の *
* 等価コード */
public class 鈴木君 { // ConcreteStrategy
// 版画を彫る
public Hanzai createWoodCutPrint() {
// 田中君を拉致る
田中君 agent = 田中君.getInstance();
// 田中君に強制労働させ、成果を横取りして提出する。
return agent.createWoodCutPrint();
}
}
■正しい表現 「鈴木と田中が全く同じやり方で版画を彫る」 public class 鈴木君 { // 鈴木君には版画を彫るスキルがある。 public WoodCutPrintStrategy getWoodCutPrintStrategy() { // 鈴木君のスキルは、一般にAと呼ばれるスキルである。 return WoodCutPrintConcreteStrategyA.getInstance(); } // 版画を彫る public Hanzai createWoodCutPrint() { // 鈴木君は自分のスキルで版画を彫り、成果を提出する。 return getWoodCutPrintStrategy().doWoodCutPrint(); } }
302 :
デフォルトの名無しさん :2007/03/29(木) 18:00:19
>>300 バグを発見しますた。
鈴木君の一人プロジェクトが無限ループを起していて
いつまで経っても成果が出てきません!鈴木君ハサーン
/* 「手配師が鈴木君本人しか集められなかった場合」の *
* 等価コード */
public class 鈴木君 { // ConcreteStrategy
// 版画を彫る
public Hanzai createWoodCutPrint() {
// 鈴木君が自分を拉致る
鈴木君 agent = 鈴木君.getInstance();
// 鈴木君はいつものようにメンバーに強制労働をさせて、
// 成果だけ横取りするつもりだったが、
// 結局自分一人では何もできずに
// 貯え(VMスタック)を消費しつくして終了
return agent.createWoodCutPrint(); // 無限ループで throw RuntimeException("スタックオーバフロー")
}
}
エロゲで使われているパターン Singleton 他なんかある?
304 :
300 :2007/03/29(木) 18:52:15
>>302 バグスマソ( ; -_-)
>>294 版鈴木君の等価コードはこうだ。
public class 鈴木君 { // ConcreteStrategy
// 版画を彫る
public Hanzai createWoodCutPrint() {
/* 以下、手配師付き変形TemplateMethod(コンテキスト)内の等価コード */ //{
// 鈴木君は手配師を呼ぶ。(メンバー一人の場合、自分が手配師になる)
Coordinator slave = this;
// 手配師に各工程担当者を集めさせて、
// 版材を準備し、版材処理を実行する。
Hanzai hanzai
= slave.getCutProcessor().cut(
slave.getDrawProcessor().draw(
slave.getHanzai()));
// 版材を刷る。
slave.getPrintProcessor().print(hanzai);
//}
return hanzai;
}
public Hanzai getHanzai() { reuturn new Hanzai(); }
public 切り方 getCutProcessor() { return 切れ方_0893D.getInstance(); }
public 書き方 getDrawProcessor() { return 書き方_1919Z.getInstance(); }
public 刷り方 getPrintProcessor() { return 刷り方_0212A.getInstance(); }
}
// Functorパターン
public class 切り方_0893D extends 切り方 { public Hanzai cut(Hanzai hanzai) { /* 何もしない */ } }
public class 書き方_1919Z extends 書き方 { public Hanzai draw(Hanzai hanzai) { /* 何もしない */ } }
public class 刷り方_0212A extends 刷り方 { public Hanzai print(Hanzai hanzai) { /* 何もしない */ } }
305 :
デフォルトの名無しさん :2007/03/29(木) 19:46:45
まとめると、
>>275 =
>>284 の質問(
>>292 で解決済)
テンプレートメソッドで、処理が同じものがある場合に、
(注: 同じなのは、TemplateMethod単位か、個々のメソッド単位か不明)
どのようなクラス設計をしたら良いか?
>>279-280 、
>>285-290 の回答
TemplateMethod単位で同じものがあったら、
それをStrategyパターンで外出しして共用すれば良い。
※ここまではOK
>>293 の回答
TemplateMethodの個々のメソッド単位で同じものがあったら、
それをStrategyパターンで外出しして共用すれば良い。
※
>>293 の実装コードは
ドメインモデル(鈴木君, 田中君)に、その本来の責務と無関係な役割
Coordinatorインタフェースを割り付けている点がおかしい。
鈴木君、田中君と、Coordinatorは、明らかに分離すべきである。
306 :
305 :2007/03/29(木) 19:47:36
>>293 の実装コードの問題点
分析/設計で得たモデルの特性として、
「手順を構成する複数の工程について、
各工程の処理方法にバリエーションがあり、
なおかつ、各処理方法は互いに交換可能」
な事が明らかならば、
>>293 の実装もありえる。
しかし
>>293 の実装の根拠が、単なる「コード再利用目的」だったとしたら、
不吉な匂いがする。・・・数100人月のシステムで、
このように見通しの悪い設計をして、デスマーチ化したのを見た事がある。
どのような場合にこの実装/設計が破綻するかと言うと、
設計/初期実装に見落としがあって、
Hanzaiインタフェースに後からバリエーションを持たせる必要が生じた場合
である。この場合、Hanzaiインタフェースのバリエーションに関して、
各処理方法は互いに交換可能でなくなる。
正直に言おう、デスマーチ化したシステムにおけるHanzai相当の変化要素とは
なんと「入出力とDBエンティティ」だった、という事を。バッカでぇ〜
307 :
デフォルトの名無しさん :2007/03/29(木) 20:14:36
デスマーチ化したシステムにおける「完成した版画」相当の要素は「画面」ね。 プロトタイプ作成時は、「版画」は1種類だけ考えれば済むから、 その版画作成に使う版材も、処理手順も、詳細処理方法も1種類ずつで済む。 ・・・プロトタイプのやり方をアーキテクチャ設計文書として配って、 開発もバッチグーね?とお気楽モード。 ところが開発展開になってから、 「版画は一種類だけじゃなくて複数ある」って当たり前の事実に気付く。次いで、 「異なる版画には、異なるサイズや材質の版材が必要」な事とか 「異なるサイズや材質の版材には、異なる処理手順や詳細処理方法が必要」 ってな事にも、おそまきながら気付く。 アーキテクチャ設計ハターンwwww ・・・いや、気付いてても気付かないフリしたんだろう、 アーキテクチャ設計のボンクラ共は。 じゃ、互いに異なる処理手順や詳細処理方法を、どうやって共用すればいいか・・・ 幾多の戦場を潜り抜けてきたCOBOL上がりの現場連中は、その難題に気付く事もなく問題解決してた。 その問題解決とは「データ構造や処理は一切共用せず、画面毎に別々のデータ構造と処理を書く」だったwww 共用しなけりゃTemplateMethodもStrategyも一切関係ねぇじゃん。バカかこいつら、と思った。 それでは、正しい解決方法はどこにあるのか それを私は知っているが、このレスにはもう余白がないので書けないw
308 :
鈴木 :2007/03/29(木) 22:31:38
おまいら、俺の名前を気安く使うな、不愉快だぞ 続きは「佐藤クン」で
上がダメなら、下の名前ならおk? 例えばひろゆきとかゆきひろとかたかゆきとかあと
310 :
デフォルトの名無しさん :2007/03/29(木) 22:49:30
問題はドメイン・モデリングの欠落だなw
311 :
デフォルトの名無しさん :2007/03/29(木) 22:55:01
問題領域が「版画作成」なら、最終目的は「版画」だけど、 問題領域が「業務処理」なら、最終目的は「画面」じゃねぇ〜よなw つまり、画面中心で設計したら火ぃ噴くの当たり前っつう話
312 :
デフォルトの名無しさん :2007/03/29(木) 22:57:26
「業務処理」の目的は、DB更新と電文(w。
314 :
鈴木 :2007/03/29(木) 22:59:24
>>309 それもダメだ、かすってる
鈴木の続きは「都築」でどうだ
315 :
デフォルトの名無しさん :2007/03/29(木) 23:03:13
>>314 じゃニックネームで手を打とうぜ。
例えばPackard, Tinkerbell, 卓球、うーんRuecktくらいでどうだ
閑話休題
318 :
デフォルトの名無しさん :2007/03/29(木) 23:10:48
>>312 ある種の基幹系業務システムは、
構築難易度を下げて抽象化すると、
結局、マスタメンテ型アプリに帰着する。
すると、最終目的がマスタ更新ってのも
そんなにずれていない。
するとオブジェクト指向で書く必要ないんだな、これが。
(終了)
319 :
デフォルトの名無しさん :2007/03/29(木) 23:13:24
)再開(
GoFなんでカビの生えたパターンに未だにとらわれている初心者共乙w
321 :
デフォルトの名無しさん :2007/03/29(木) 23:17:18
ソフトウェア・プロダクトライン系の開発方法論の話しようぜ。
322 :
デフォルトの名無しさん :2007/03/29(木) 23:22:56
>>321 M$のHワラ氏、ITアーキテクチャ誌に連載してたね、2年ほど前。
CMU/SEIのCMMIと、CMU/SEI近辺で定義されたプロダクトライン、
所詮は別物だけど、あの近辺は元々俺の領分だから(どこがだよ)
ちょっと後悔(ウツウツウツウツシクウツウツシクシクウツウツウツウツウツシクシクシクシクウツウツウツ
そんな事じゃいかん。俺はCMU/SEIはともかくとして、
日本のCMMI連中とは全然話が合わないんだったw
なんか、プロダクトライン・アーキテクチャ周りでいい話ねぇの?(爆
324 :
デフォルトの名無しさん :2007/03/29(木) 23:38:44
>>320 確かに飽きてきたのも事実
だが使いこなせてる奴が意外と少ないのも事実
325 :
デフォルトの名無しさん :2007/03/29(木) 23:45:29
だが使いこなせてる奴は10年前から退屈してるのも事実
326 :
デフォルトの名無しさん :2007/03/29(木) 23:49:47
2PLoP (2ch Pattern Language of Programming)報告:
Python初心者の人が、Javaで書かれたGoFパターンをPythonに移植しようとしてて、
まあ判ってるPython関係者にはスルーされてたんだけど、こないだ中止宣言出してた。
彼に同情的な人が言うには、「PythonはGoFパターンサポートしてるけど、Javaとはやり方が違う。
トップダウンにJava版GoFをPythonに移植するような翻訳物するんじゃなくて、
Python書きが書いた膨大なコードからパターン抽出するほうがよっぽどためになる」つってた。
http://pc11.2ch.net/test/read.cgi/tech/1172431242/
糞コード放置してった
>>293 は
今どこで野垂れ死んでいることやら
>>326 Pythonというか、いわゆる軽量言語にデザパタはいらんのじゃないかなぁ。
大規模開発にはそもそも向いてないでしょ。
もしかしたら、オブジェクト指向すらいらないかもしれないし。
馬鹿にして言ってるのではなくて、住み分けがあるだろうと。
大規模開発は javaなり c++ なりでデザパタを使って書けばいいし、
身近なユーティリティーを書くなら、軽量言語というか
perlででも書いた方がいいし。
大規模開発に向かん言語で、デザパタっていっても
そもそも意味がないと思うんだな。
329 :
デフォルトの名無しさん :2007/03/30(金) 00:14:09
>>328 常識的な意見ってツマンナイよ
rubyからrailが生まれたし、javascriptからAJAXが生まれた
そんなご時世なのだ
330 :
デフォルトの名無しさん :2007/03/30(金) 00:18:07
>>328 マジレスするぞ。
Pythonは関数言語的機能のほかに、
metaclassシステムやら、動的言語の性質をあちこち持ってるから、
C++やJavaよりよっぽどSmalltalk寄り。
そこにあろうことかJava版GoFを移植したってのが笑い所。
あと、後半部「ボトムアップでパターン抽出」
これは別に間違ってないだろ。
むしろ、将来Javaに取り入れるべき言語機能やパターンを
発見できるかもしれない(もう金脈は小さいと思うけどな)。
文句ばっか言って他をけなしてないで、
学ぶところは学びなさいってこったw
関連ないが、Perlのプロトタイプ系OO拡張、あれは結構糞だ。 OOの面倒くさい所と、Perlのいい加減な所がダブルで来る。 でも、Javaと同様なクラスライブラリ書き始めると、 あっちの方がよっぽど融通利いて手早く完成する。 さすが90年代のLispと呼ばれただけの事はあるな。 関連ないが、Javascriptのプロトタイプ系OO機能、あれは最高だ。 あれ一つでずいぶんJavascriptのコードが書きやすくなる。 問題はjavascriptエンジンのバグやエラー報告の不充分さ。 あれ使って10年程前にAJAX風アプリ書いてた時は、 試行運用中に山のように実行時エラーがでて閉口した。 今の連中は幸せだよなぁ。あれで、Netscapeがまだ生き残ってたら 万々歳なんだが。 パターン関係ないチラ裏スマソ
>C++やJavaよりよっぽどSmalltalk寄り。 て言われても、Smalltalk てそんなにいいのか? 動的言語と言われた時点で、うーみとなりそうだけどなぁ。 型は、事前に論理的誤りを検出するためにあるんだぜ? それを最初に省いたら、あとから泣きみるだろ。 それでデザパタが必要とされるような大規模開発に 向いてるといえるのだろうか?
> OOは大規模開発向け だなんて地に足のついてない発言してる人が まだ国内に居ると知って、ワロタ 済まないが、実績作ってから言ってくれ おまいらの作ってるのはOOじゃねぇだろ 単にOO系言語でOOP風の事をしました(でも中身はCOBOLそっくり) だろ
>>232 あぁーあ。今度はCS系関数言語厨房か。
マイクロソフトリサーチの人が
なんとかしてくれるだろ。
> デザパタが必要とされるような大規模開発 どっから出てきた妄想ですか?
336 :
デフォルトの名無しさん :2007/03/30(金) 00:31:22
なんだよ、Py厨だけじゃないのかよ。 てか、py厨が引っ掻き回してるのか? ただな、デザパタなんてなくてもやれるし、あったらあったで 便利だし、ぐらいのところでいいだろ。 実際、それ以上でもそれ以下でもないし。
> 型は、事前に論理的誤りを検出するためにあるんだぜ? そんなキミには、汎用純関数型言語Haskellを使って、 monadic programmingを駆使した通信ミドルウェア開発が オヌヌメ。使用検証技術も必須だよ?jfitsの人がやってるような奴
339 :
デフォルトの名無しさん :2007/03/30(金) 00:36:05
大規模(自称)OO開発の失敗例 ケーススタディ
>>306-307 ,
>>310-312 ,
>>318  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
に解決策提案するまで、
大規模OO開発へのデザインパターン適用の話題自粛で
お願いします。
何この盛り上がりようw
たかびー祭+ピチョンパターン祭 合同イベント
おいおまいら騒ぐな > 大規模OOにデザパタ必須 って言ってる人の大規模は、 せいぜい数千行〜数万行ぽっちの事だぞ、きっと
>>328 どうぞご自由に個人〜数人の範囲で
大規模開発しててくださいです。
いや、それくらいの規模が一番いいと思うよ。
がんばれー
火ぃ噴くのは、プログラムもろくにできないのが
数十人単位で集まっちゃうような地獄の話だからw
なんなんだよ、この盛り上がり。 そんなにヒマがあるなら、その、なんだ、Pythonのその膨大な過去の 素敵なコードの資産から、スマートなパターンを抽出して、 俺らをあっと言わせてくれよ。 もう、ずいぶん作業は進んでるんだろ? ここで威張ってるぐらいなんだから。
>>344 /~ytakagi/ に直接言え。
もっとも連絡先も書いてねぇけどw
盛り上がってもいいけど、もっと具体的な話してくれ。 抽象論は聞き飽きた。
347 :
293 :2007/03/30(金) 00:50:44
物凄いレス着いたw
>>295 PHP5+symfonyなんてしらね
>>296-297 で座パタなんてクソ喰らえw
>>298 > WoodCutPrintContext == Strategyパターンのクライアント (Contextクラス)
>と言いたかったのか?
その意味も含んでるけど
>だが、それでは
> ・鈴木と田中が同じ手順(Strategy)で版画を彫る
> ・鈴木が田中の手を借りて版画を彫る
>が全く同じ表現になってしまう。これは不適切だ。
が意味不明。
どこをどうすれば鈴木君と田中君の接点が見えてくるのか?
>>300 勝手に解釈して話を進めないようにw
>>301-
目が疲れたから読めん
っていうか、どうしても「鈴木」や「田中」っていういかにもわかりやすい要素ががでてくると、
ソコを主体に考えてしまう悲しい性がワロスw
一体何を聞きたいんだ? ・ソフトウェア・プロダクトラインのための資産管理 ・大規模開発へのOOおよびデザパタ適用の是非 ・そのほか
349 :
デフォルトの名無しさん :2007/03/30(金) 00:54:30
とりあえず、
>>293 は
・話の発端(PHP5+symfony)も見えてないし
・クラス命名のセンスもないし
・クラス設計のセンスもないし
・等価コードの意味も理解できないし
・目が悪くて人の話も聞かない
奴である事だけはかろうじて理解できた
でなんか用かよタコ
> >だが、それでは > > ・鈴木と田中が同じ手順(Strategy)で版画を彫る > > ・鈴木が田中の手を借りて版画を彫る > >が全く同じ表現になってしまう。これは不適切だ。 > が意味不明。 > どこをどうすれば鈴木君と田中君の接点が見えてくるのか? お前はシャレも解せぬ不粋な人間だと理解した
> っていうか、どうしても「鈴木」や「田中」っていういかにもわかりやすい要素ががでてくると、 > ソコを主体に考えてしまう悲しい性がワロスw はいはい釣れた釣れた
352 :
293 :2007/03/30(金) 01:09:32
終わりか? >・クラス命名のセンスもないし >・クラス設計のセンスもないし それは否定できんなw ほいじゃーね
思い切り東陽町スタイルだな。あの糞コード
> public WoodCutPrintContext{ 単にソースコード保守するだけの 運用チームじゃないかな、彼は
>>293 の元設計の問題点
1. 詳細設計〜実装の主眼を「コード再利用率の向上」に置いたのが誤り。
小手先のテクに走らず、分析〜設計段階で一貫したドメインモデルを用い、
それを素直にコード化して、保守性・拡張性を高める事こそ重要である。
2. 継承や委譲を駆使した「差分コードプログラミング」は煩雑過ぎて人間の手に余る。
もし本気で「差分コード」を扱いたいなら、アスペクト指向開発方法論(AOSD)を取り入れ、
差分定義の組み込みはAOP言語のweaving機能に任せろ。人間の手でやるな。
・・・だが残念な事に、アスペクト指向言語はまだ底辺現場で使える段階にはない。
つづく
356 :
293 :2007/03/31(土) 00:03:16
>>293 から50レス以上あって
くだらない能書きは大量に吐き出されたが
もっと良い解決方法を提示するコードが出てこないとはw
所詮は口だけ、本を読んだだけの頭でっかちで現場で使えん奴らばかりだなw
コリャデスマがなくならないわけだ
357 :
デフォルトの名無しさん :2007/03/31(土) 02:06:50
お前のコードの問題点は示しただろ?すずき
>>356 一応いっておくが、おまいに絡んでるのはキチガイ一人だけだ。
359 :
デフォルトの名無しさん :2007/03/31(土) 11:48:32
>>358 議論しているのをキチガイ呼ばわりする奴って
どこにでもわくのな
360 :
デフォルトの名無しさん :2007/03/31(土) 11:52:26
【ひろたかと2ちゃんの不思議な関係】 ・ひろたかがかつて在籍していた会社は全て、ひろたかが去った直後に 2ちゃんでしつこく攻撃される。 ・ひろたかの元仕事相手、脳内ライバル、 その他ひろたかが自分にとって脅威だと感じる対象は、 2ちゃんのあちこちのスレに中傷文が書かれる。 ・ひろたかが出没するスレには 常に「キチガイ」「発狂」を連発する荒しが発生する。 ・2ちゃんに居る頭も性格も悪い粘着に ← いまココ 噛んで含めるように高度な概念を教えてやると、 いつの間にかたかひろ本人も同じ意見を主張するようになるw ・ひろたかは論破されていても、それに気付かないフリをして勝利宣言をする。 ・ひろたかは論破されると、他のスレで暴れる。 ・ひろたかは成りすまし/匿名発言をよくするが、それが見破られると 「あれは自分に悪意を持っている一味の仕業だ」と苦しい言い訳をする。 さ〜て、また荒しが発生するのかなw
361 :
293 :2007/03/31(土) 12:56:20
>>358 そういわれるとちょっと寂しい気も・・・w
>>357 ,359
議論になってな(ry
>>360 「いまココ」ってところで、「ひろたか」が「たかひろ」になってるってことか・・・w
362 :
デフォルトの名無しさん :2007/03/31(土) 13:15:59
>>361 議論になっていないと考える低脳はお前だけだ
363 :
293 :2007/03/31(土) 13:27:20
だってボク低脳ですから
>>293 の元設計の問題点 (つづき)
2-1. Bridgeパターン・スパゲティ (クラスの過剰分割によるOOモデルの崩壊)
>>293 のコードで省略されているクラス/コードを補足すると、
>>304 のようになる。(※1)
※1.createWoodCutPrint() の //{ ... //} 内は、下記の等価コード。
WoodCutPrintContext.getInstance().doWoodCutPrint()
>>293 は、TemplateMethodの各工程の処理詳細 (draw(),cut(),print()) を共用するために、
「Coordinatorパターン」とでも呼ぶべき「変形Bridgeパターン」を導入し、
Coordinatorで処理詳細の選択できるようにした。
(注:蛇足だがこの種のカスタマイズには、
古くから使われている DI (Dependency Injection)パターンの方が適している。
更に蛇足だが、カスタマイズ内容はコード中に直接記述したりはせずに、
外部ファイル(XML形式)に分離記述して後から変更可能にするのがマナーである。
このコード(
>>293 ,
>>304 )は、その字面の単純さにもかかわらず、
挙動を読み取りにくく、保守性/拡張性が低い。(前提条件の変化に対し柔軟性が低い)
くだらねえことをいつまでもグダグダ書いてるが、
>>275 の問題の本質は
「テーブルとクラスをどうやってマッピングするか」ってところにあることに気づけや。
マッピング後のクラス設計以前の問題。
んでhibrenateとか見る限り、今のところ碌なやり方は存在しない。
366 :
デフォルトの名無しさん :2007/03/31(土) 13:59:48
うっせぇぞ低脳。 お前はさっさとODBMS営業逝ってこいや 負け犬が
ODBMS(w ぷぷぷ もう10年前にたかひろの子分に 「(製造業など一部の特殊分野を除いては) 仮想記憶方式のODBMSなんてもう売れねぇよ」 って伝えたはずだけど。まだ悪あがきしてたんか。おめでてぇなw
そん時に提示した代替手段が、 ・ ORマッピングによるRDBMSとの共存 ・ Stonebreaker氏のORDBMSの発展 だったな。
>>293 の元設計の問題点(つづき2)
(2-1. Bridgeパターン・スパゲティ (クラスの過剰な分割によるOOモデルの崩壊))
>>293 のコード(及び
>>304 の補足コード)は、その字面の単純さにもかかわらず、
挙動を読み取りにくく、保守性/拡張性が低い。(前提条件の変化に対し柔軟性が低い)
(1)挙動を読み取りにくくなる原因:
原因(1-1) データと処理の分離記述による、カプセル化の破壊。
(2)保守性が悪い原因:
原因(2-1) カスタマイズ内容のハードコーディング。
クラス選択の変更や、クラスの新規追加の度に、コード修正が必要になる。
(2)前提条件の変化に対し柔軟性が低くなる原因:
原因(3-1) モデルの過剰な単純化により、現実世界の複雑な問題に適応できなくなる。
以下では、その原因を探る。
原因(1-1)データと処理の再分離による、カプセル化の破壊
オブジェクト指向では、データとその処理をカプセル化し、クラスを導入する事で
(1)データ操作の局所性
(2)外部操作インタフェースの限定、
(3)型システムによる安全性/信頼性の向上
が可能になり、それを利用してプログラムの信頼性/可読性/保守性の向上を図れる。
しかし
>>293 ,
>>304 のコードでは、
データ(Hanzai及びバリエーション)と処理方法(〜Processor)を別々のクラスに分離記述した後、
関連するデータクラスと処理クラスを適切な方法で再カプセル化しなかったため、
オブジェクト指向のメリットが得られなくなっている。(非OO的コード)
371 :
293 :2007/03/31(土) 15:13:25
>>365 が僕の考えからは少し極端な意見だがいいこと言った。
まず「パターンありき」の考え方はそもそもおかしい。だから敢えてTemplateMedhodパターンに
とらわれないコードを書いたんだがね。
自分のレスの後だったんでよっぽど悔しかったんだろうw。
だが少しだけ付き合ってあげようw
>
>>293 のコードで省略されているクラス/コードを補足すると、
>>304 のようになる。(※1)
なりません。
>
>>293 は、TemplateMethodの各工程の処理詳細 (draw(),cut(),print()) を共用するために、
・・・・
> このコード(
>>293 ,
>>304 )は、その字面の単純さにもかかわらず、
> 挙動を読み取りにくく、保守性/拡張性が低い。(前提条件の変化に対し柔軟性が低い)
カプセル化を否定しているように聞こえるが?
そもそも鈴木君や田中君をドメインとして(まぁドメイン領域内のある部分ではあるが)時点で設計が
崩壊してるんだけどw
>>278 の要件を分析してみると、
1.このケースの主処理は木版が作成プロセスである。
2.鈴木君や田中君は木版画作成プロセスのバリエーションである。
この2点から、木版画作成プロセスを中心に考えて、どのように違いを吸収していくかを考えないと遺憾のとちゃうの?
で、
3.木版画作成プロセスから見た場合、鈴木君や田中君(、山田君、佐藤君・・・・)の役割は、
木を塗ったり切ったり印刷したりの方法論を持っているオブジェクト。
4.鈴木君や(略)画持っている方法論は、皆違う場合もあれば同じ場合もあるから、鈴木君や田中君(ry)と独立するべき。
(そもそもの
>>275 の要件)
となるのが自然な設計だと思うけど?
372 :
365 :2007/03/31(土) 15:25:41
>>371 キチガイにかまわないであげてください。
373 :
293 :2007/03/31(土) 15:34:06
>>372 むむ・・・
スレが荒れてしまいますな・・・
まぁ彼が言うクラス粒度が細かくなりすぎると見通しが悪くなるのは事実だけどね
その辺の加減が難しい・・・
>>293 の元設計の問題点(つづき2)
(2-1. Bridgeパターン・スパゲティ (クラスの過剰な分割によるOOモデルの崩壊))
原因(3-1)モデルや型の過度な単純化による、複雑な問題への適応能力低下。
現実の問題は、
>>293 のような単純な構造は持っていない。
まず、データにはバリエーションがある。
例えばデスマ事例(
>>306-307 )で指摘されているように、
操作対象となるオブジェクト/データ(Hanzai)は一種類ではなく、
実際には何種類ものバリエーションが存在する。(分析モデル)
Hanzai <─┬ 原料Hanzai <─┬ 木版<─┬ 柔かい木版
│ │ └ 硬い木版
│ ├ ゴム版
│ ├ 芋版
│ └ 銅版
├ 加工中Hanzai<─┬ 下絵中Hanzai
│ └ 切除中Hanzai
└ 完成した版画版
※ ここでHanzaiのサブクラスは、
工程進行に伴う状態変化 (原料→下絵中→切除中→完成) と見なせる。
ただし、後工程になるほどデータの内部構造は複雑になっていく。
次に、データはしばしば単純なモノシリック構造ではなく、
複数のデータを内部構造として持つComposite構造を持つ。
完成した
版画版 ◇┬ 背景部 ◇─(略)
(人物画) └人物部 ◇┬ 頭髪
├ 顔 ◇┬ 目
│ ├ 鼻
│ └ 口
├ 上着
当然のように、処理もこのComposite構造の対応している必要がある。 人物画のゴム版画の為の 切除処理 ◇┬ 背景部 ◇─(略) └人物部 ◇┬ 頭髪パターン切除 ├ 顔 ◇┬ 目をリアリスティックに表現する切除 │ ├ 鼻の膨らみを表現する切除 │ └ 口の生々しさを表現する切除 ├ 毛皮パターン切除 それでは、切除工程の操作は、作成対象データ(人物画)と同じComposite構造を持ち、 素材×Compositeの要素数分必要になるのか? そんな事はない。 例えば、頭髪パターン切除と、毛皮パターン切除には同じ切除テクニックが使える。 これが現実世界の共用だ。
御託はいらん 読む気も無い
378 :
デフォルトの名無しさん :2007/03/31(土) 16:12:41
【そして、現実の世界へ・・・】
それではここで、精神性疾患患者たかひろの設計でデスマ化した
デスマ事例(
>>306-307 )に戻ろう。
途中から読んでいる方には何の事やらサッパリ判らないだろうから
説明を加えると。
>>293 のコードは、精神性疾患患者たかひろが、その劣悪なる知能で設計し
その結果デスマを巻き起こしたコードと極めて類似している。
したがって、
>>293 の詳細な分析は、デスマ事例コードへの解決策を与えるのである。
いまごろ解決しても、お前の頭がおかしくなったのはもとには戻らん。 あきらめろ。
380 :
ワロス :2007/03/31(土) 16:46:39
「版画の世界」から、「デスマ・システム」への概念マッピング(・∀・)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 【版画作成アプリ】 【マスタメンテ型基幹システム】 [主要ドメイン] 版画作成プロセス マスタ更新プロセス [主要データ] 下絵、原料版材 入力 (画面入力,電文入力) 完成した版画版 出力 (DB更新,電文出力,) (付帯的な画面出力) [主要プロセス]版材取得 入力取得 下絵作成 入力取得 版材の品質チェック 入力チェック 下絵と切除テクのマッチング 業務チェック 切除処理 DB参照、演算処理、DB更新 印刷処理 出力処理 (画面出力,電文出力)
381 :
デフォルトの名無しさん :2007/03/31(土) 16:49:08
【たかひろと2ちゃんの不思議な関係】
・たかひろがかつて在籍していた会社は全て、たかひろが去った直後に
2ちゃんでしつこく攻撃される。
・たかひろの元仕事相手、脳内ライバル、
その他たかひろが自分にとって脅威だと感じる対象は、
2ちゃんのあちこちのスレに中傷文が書かれる。
・たかひろが出没するスレには ← いまココ (・∀・)
>>358 ,
>>371 ,
>>379 常に「キチガイ」「発狂」を連発する荒しが発生する。
・2ちゃんに居る頭も性格も悪い粘着に
噛んで含めるように高度な概念を教えてやると、
いつの間にかたかひろ本人も同じ意見を主張するようになるw
・たかひろは論破されていても、それに気付かないフリをして勝利宣言をする。
・たかひろは論破されると、他のスレで暴れる。
・たかひろは成りすまし/匿名発言をよくするが、それが見破られると
「あれは自分に悪意を持っている一味の仕業だ」と苦しい言い訳をする。
さ〜て、まだ荒しを続けるつもりかな?
382 :
デフォルトの名無しさん :2007/03/31(土) 16:51:04
またたかひろが暴れてるな そう。お前自身の信仰は誰も問題にしていない。 例え神の存在を否定する信仰だろうと、 ここ日本では誰もメクジラなど立てない。 お前が問題なのは、 お前がお前自身の信仰を大切にしているのと同様に、 他人も自身の信念や大切なものを抱えながら生きている という事を理解せずに、 ・他人の信念を批判しまくったり、 ・自分勝手で不合理な自己主張をおしつけたり、はたまた 匿名で 他人の名前を挙げて 執拗な人格批判/いやがらせを繰り返している という事実にある。 お前と正式に顔を合わせて以来もう数年経つが ある日突然ネット上で名前を挙げて非難が開始され俺はとまどった。 俺は匿名で非難を浴びるような生き方は、これまで一切していない。 なのに、お前に会ってしばらくしてから突然攻撃が始まった。 最初はお前の周辺に異常者が居て、俺を攻撃してるのかと思った。 ・・・でも結局お前がその異常者本人だと気付いた。 お前しか知りえない情報、お前しか感じ得ない感情で キチガイじみた様相で攻撃してくる奴は、お前しかいないって。 悔い改めよ。そしてお前が迷惑をかけた人、一人一人に許しを乞え。
荒しはスルーするとして。
>>380 その概念マッピングは、
>>375-376 と多少ズレている。
マスタメンテ型システムってのは、
システム開発の都合で業務処理を極端なまでに単純化して、
業務処理アプリ=DBテーブル編集アプリ
と見なすもんだ。
すると主要ドメインはあくまで業務処理プロセスであって、
マスタ更新プロセスではない。
384 :
デフォルトの名無しさん :2007/03/31(土) 17:08:41
>>379 たかひろ、お前が壊れているのは最初から知っている。
お前が壊れた設計をしていたのにも、1週間と待たずに気付いた。
当然の事ながら、問題の解決策もすぐに判った。
ただ、お前がお前自身の精神状態の異常さに気がつかずに、
多くの人々に多大な迷惑をかけ続けた経緯には、
さすがの俺も心が痛んだ。
だから、あえてお前の古傷を持ち出し、
お前の行動を是正しようとしているんだ。
謙虚になれ、たかひろ。
お前はお前が思っているのの1/100も有能ではない。
単なる空っぽの本棚だ。お前の頭は
385 :
375 :2007/03/31(土) 17:16:39
>>375 の分析モデルがズレたので、再投稿
------------------------------------------------------------
【版材の分析モデル】
Hanzai <─┬ 原料Hanzai <─┬ 木版<─┬ 柔かい木版
│ │ └ 硬い木版
│ ├ ゴム版
│ ├ 芋版
│ └ 銅版
├ 加工中Hanzai<─┬ 下絵中Hanzai
│ └ 切除中Hanzai
└ 完成した版画版
------------------------------------------------------------
386 :
375 :2007/03/31(土) 17:17:57
あれ?まだずれてる。
>>375 の分析モデル図差し替え
------------------------------------------------------------
【版材の分析モデル】
Hanzai <─┬ 原料Hanzai <─┬ 木版<─┬ 柔かい木版
│ │ └ 硬い木版
│ ├ ゴム版
│ ├ 芋版
│ └ 銅版
├ 加工中Hanzai<─┬ 下絵中Hanzai
│ └ 切除中Hanzai
└ 完成した版画版
------------------------------------------------------------
>>383 「マスタメンテ型アプリ」設計が導入されたのは、
今回ではなく、何世代も前の電算機導入の頃の話だろう。
それ以来業務処理は「マスタメンテ型アプリ」に合わせて変形し成長した。
だから今さら「マスタメンテ型アプリ」抜きの業務処理プロセスなど
存在しない。
業務処理プロセス(の一部) ∝ マスタメンテ型アプリのプロセス
としても大きな咀嚼はないだろう。
もし、新システム提案の初期に業務分析の専門家が入り、
提案を新しい業務プロセス設計の形で詳細に残していたら・・・
そこから正確なドメイン・モデルを作成できるのかもしれない。
だが今時の新システム構築なんて、大抵中身はマイグレーション。
COBOLプログラマがプログラムの動きを日本語で説明して「設計書でござい」
なんて言い出すおバカな世界だからなぁ・・・
388 :
デフォルトの名無しさん :2007/03/31(土) 17:54:57
>>365 さて、そろそろORマッピングスレを爆撃に行くかw
389 :
369 :2007/03/31(土) 19:59:13
バカの相手をするのはつもりは一切ないが、
バカの勘違い/妄言を見て、他の人が間違った理解をするとよろしくないので
簡単に
>>371 の間違いを指摘をしておく。
なおここで
>>371 とは、元レス
>>369 に対するバカの妄想であり、
ここでは引用符> を先頭に付けて示してある。
A.>
>>365 が僕の考えからは少し極端な意見だがいいこと言った。
ORマッピングの話は、
>>275 の前提条件のスコープ外。
議論に直接関係ない話を持ち込んで、議論を撹乱するのは
詐欺師の常套手段なので、みなさん気を付けるように。
また、もしORマッピングに興味を持った人が居たら、
まずはデータベース板の該当スレを参照すると良い。
B.> >
>>293 のコードで省略されているクラス/コードを補足すると、
>>304 のようになる。(※1)
> なりません。
これは自分で補足コードを書いて見れば簡単に確認できる。
結果は
>>304 のようなコードになるはずだ。
(但し
>>364 に説明してあるように、等価コード部 //{〜}// 内は
>>364 ※1と読み替える)
確認作業はコーディング能力のある人にしか実行できないが、
それは致し方ない所だろう。
390 :
369 (>>389つづき) :2007/03/31(土) 19:59:56
バカの相手をするのはつもりは一切ないが、
バカの勘違い/妄言を見て、他の人が間違った理解をするとよろしくないので
簡単に
>>371 の間違いを指摘をしておく。
なおここで
>>371 とは、元レス
>>369 に対するバカの妄想であり、
ここでは引用符> を先頭に付けて示してある。
C.> > このコード(
>>293 ,
>>304 )は、その字面の単純さにもかかわらず、
> > 挙動を読み取りにくく、保守性/拡張性が低い。(前提条件の変化に対し柔軟性が低い)
> カプセル化を否定しているように聞こえるが?
はい、みなさん注目!!!
これが典型的な詐欺師の手口です。騙されないように。
元レス
>>369 は
>>293-294 のカプセル化破綻問題を指摘している。
自分の問題点を指摘された
>>293 は、逆上して事実と反対の事を言い出している。
1.システムの全体像が見えていない以上、
処理の動作主体をモデル化しておく必要がある。
ここで動作主体とは、「鈴木君」や「田中君」である。
2.動作主体が「鈴木君」や「田中君」であり、
プロセスは
>>293 の最初のクラス=WoodCutPrintProcessクラスである。
391 :
369 (>>389つづき) :2007/03/31(土) 20:05:01
バカの相手をするのはつもりは一切ないが、
バカの勘違い/妄言を見て、他の人が間違った理解をするとよろしくないので
簡単に
>>371 の間違いを指摘をしておく。
なおここで
>>371 とは、元レス
>>369 に対するバカの妄想であり、
ここでは引用符> を先頭に付けて示してある。
1.> このケースの主処理は木版が作成プロセスである。
このケースでは、システムの全体像が見えていない以上、
処理の動作主体をモデル化しておく必要がある。
ここで動作主体とは、「鈴木君」や「田中君」である。
2.> 鈴木君や田中君は木版画作成プロセスのバリエーションである。
前述のように、動作主体が「鈴木君」や「田中君」であり、
プロセスは
>>293 の最初のクラス=WoodCutPrintContextクラスである。
(なおこのクラスの名称 "WoodCutPrintContext"は、内容を適切に表していない。
正しくは、"WoodCutPrintProcess"と命名するべきである。根拠は
>>297 参照)
たかひろがバカなのは判ったから とにかく sageを覚えろ
あらあら、よく見たらアイツ
またまた敗走宣言してるやん
>>379 ワロス
>>380 GJ!
「版画作成プロセス」と「マスタメンテ・プロセス」は所詮は別物、
もともと厳密に1対1に対応するものではない。
そこで
>>380 の齟齬の悪そうな部分を若干修正してみた。
大きな変更点は「版画作成プロセス」でなく「版画版作成プロセス」とした点。
----------------------------------------------------------------------
「版画の世界」から、「デスマ・システム」への概念マッピング part2
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
【版画版作成アプリ】 【マスタメンテ型基幹システム】
[主要ドメイン] 版画版作成プロセス マスタメンテ・プロセス
[主要データ] 版材原料 入力 (画面入力データ)
下絵 DB参照データ
加工中の版画版
完成状態の版画版 出力 (DB更新データ)
刷り上がった版画 表示 (画面表示データ)
[主要プロセス] 版材原料取得 入力取得
版材作成 入力チェック
下絵取得&下絵処理 業務チェック, DB参照
切除処理 演算処理, DB更新
印刷処理 画面表示
----------------------------------------------------------------------
修正結果を見ると、両者の対応関係はそんなには悪くない。
むしろ、別物にしてはずいぶん良い対応関係を持っている、と言える。
---------------------------------------------------------------------- 「版画の世界」から、「デスマ・システム」への概念マッピング ver.2  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 【版画版作成アプリ】 【マスタメンテ型基幹システム】 [主要ドメイン] 版画版作成プロセス マスタメンテ・プロセス [主要データ] 版材原料 入力 (画面入力データ) 下絵 DB参照データ 加工中の版画版 完成状態の版画版 出力 (DB更新データ) 刷り上がった版画 表示 (画面表示データ) [主要プロセス]版材原料取得 入力取得 版材作成 入力チェック 下絵取得&下絵処理 業務チェック, DB参照 切除処理 演算処理, DB更新 印刷処理 画面表示 ----------------------------------------------------------------------
ある意味すごいなw 未だにコードが出てこないし解釈間違ってるけど、このエネルギーはスゴイ。 便所の100wと比喩してはいけないw
397 :
396 :2007/04/01(日) 05:00:48
スマソ 誤爆した
まあまあ
元々の質問はもうとっくにクローズしてるし、
>>293 はjavaとよく似た擬似コードで記述されたクラス設計に過ぎんから、
代替コードを示す必要もない。
現在議論されているのは、
>>293 の背景にある設計理念の問題、
そして、それに類する設計を現実に適用した時のギャップね解決方法だろ。
理解できないなら結論が出るまで静観するがよろし
399 :
デフォルトの名無しさん :2007/04/01(日) 08:41:27
このスレ、爆発力はあるな 問題は火のつけ方
あとそんなに自分の主張に自信があるなら コテつけてレスしろ
おまぃはバカなんだから黙っとけ
いやさ、例の「精神性疾患の俗称連呼」の人、 別スレで暴れまくっててえらい騒ぎになってるわ。 どうも東京都在住の44歳の人物らしい。 44歳にもなって2ちゃん三昧とは幼いね。
リアルワールドが悲惨なんだよ、きっと
よしよし
NGワード推奨:キチガイ
某スレで、コーディング能力も設計能力も疑わしい44歳の人が 「擬似コードを元にした議論はよくねぇ〜」とか叫んでて笑えた。 「print文入れて動作を見ればいい」ってそれなんて名前のBASIC言語?w
なんと言う春休み。 思わず読み飛ばしてしまった。 このスレはしばらく伸びる。
>>407 自分がそれだから、そうやって相手を封じたい訳ね。
ま、相手なんてお前の脳内にしか居ないんだけど(藁
誤爆?
>>412 おまえが自己の行動に無自覚な精神障害者である事はよくわかった。
ここのスレ主はそろそろ鉄格子付き個室病棟の中か。 頭も性格も悪いスレ主に意見すると ひたすら泥沼に引きずり込もうとあがくから 始末が悪い。
スレ主は、OOやデザパタに対して、狂信的な宗教感情を持っている。 その信仰はあまりにも愚かで盲目的であり、 自身の独自解釈とは異なる意見を持つ者に対して 狂信的信者の狂ったな正義感を持って攻撃と排除を試みる。 しかし、世の中に広く受け入れられる技術ノウハウというものは、 そのようなカルト的宗教活動とは一切無縁のものである。
個人的な技術ノウハウの蓄積は、 ・日々の実践と経験を通じた、メンタルモデルの形成 ・合理的思考による、メンタルモデルの検討と洗練 ・明確な目的意識に基づく、合目的なノウハウの抽出と洗練 を通じて行われる。 そして世の中に広く受け入れられる技術ノウハウというものは、 個々人のノウハウを、他の専門家を交えた健全な議論に晒し、 目的と手段の合理性を詳細に検討し、 その過程で多くの人々が同意し共感する事を通じて、 初めて成立するものである。
注: 誤解のないように注記しておく。 ここでスレ主とは、今回のスレを立てた人物の事ではなく 関連スレのど真ん中に居座り、罵詈雑言を撒き散らしては議論妨害を繰り返す、 牢名主のような人物の事である。
GoFってなんて呼べばいいの? 個人的にはゴフって読んでるんだけど、公の場で使ったら笑われたりする?
ゴフゴフ
護符としての効能はあるんだろうか?
__ i<´ }\ , - 、 ヽ.._\./ .ンく r-兮、 __ ∠`ヽ.! / ヾニEヲぐ ,ゝ-> さすがGoFだ。 /_`シ'K-───‐-、l∠ イ デスマくらっても l´__,/l\、_ ̄0¨0)゙@Yヘ, -┤ 何ともないぜ。 . l'___|⌒ヾ''ー==、ーr='イ i二| / .」 i /./7r‐く lー! . f. ヽ‐i人.∠'< _i. l,.-ゝ. トiヘヘ「ト〈 `X トレi7__| 〉ト:トハj`! i. / トー┤lルj,リ /‐+----+‐l iー--i---ヾ'〃 . l_i____i__| |___i,__i_|
荒らしは帰ってくれ
あっちの隔離スレ、すげぇ荒れようだな。 こっちであんまヘタレな擬似コード出してくるから ちょっとからかってやったらすぐキレ出して、 改めて問題点を7レス分ほど指摘しただけで 延々と一週間もこの騒ぎだ。 狂信者って本当に怖いね。
イタイ・・・・
State パターンで相談です。各 State クラス間でコンテキストを共有したい 場合に、相互の依存度を下げるにはどういったイディオムが使えますか? 例えば、ウィザード形式のインストーラの画面を State と見なすと、 A 画面で設定した内容を次の B 画面でも使いたいとか、最終的には、 全ての画面で設定した内容をもとに処理を行いたい、など。 Context を各 State のコンストラクタに渡してあげれば目的は達成できる のですが、各 State が興味があるのは Context の限られた一部分であり、 Context 全体を渡すのは不釣り合いな気がしています。 もう一つの悩みは、Context が受動的な「共有データクラス」の役割を 演じることになるというものです。どうもこの構造がしっくりこない というか、オブジェクト指向っぽくないと思うのです。 あるいは、こういう場合にはそもそも State パターンは使わないとか、 そういった指摘でもかまいませんので、よろしくお願いします。
その前にStateパターンのクラスズをよく見て依存関係を シッカリ把握しなさい
430 :
428 :2007/04/21(土) 10:02:23
>>429 問題にしているのは以下のような依存関係です。
Controller has a State
Controller has a Context
StateA is a State
StateB is a State
>>430 私が問題にしているのは
>各 State が興味があるのは Context の限られた一部分であり
です。
StateはContextに興味はありません。
ハッタリ業務コンサルのデザインパターン解釈はダメダメだな
まー独自解釈して苦しんでしまう事は初心者にはよくあることだから気にする必要は無いw
434 :
428 :2007/04/21(土) 10:44:02
>>431 Context という言葉を使ったのがまずかったですね。ごめんなさい。
GoF では Context が State に処理を移譲することになっていたかと
思いますが、ここでは「共有データ」の意味で Context を使ってます。
つまり、Controller が State に処理を移譲していて、各 State は
Context を参照・更新するという構造です。
State が Controller に無関心だと言う点についてはもちろん同意です。
今回の悩みどころは、各 State の「成果物」を共有する時のうまい手段は
ないものか、というものです。
GoF に従うなら、
Context has a State
Context has a SharedData
StateA is a State
StateB is a State
で、StateA や StateB が SharedData を参照更新する、という感じです。
ContextがMediatorになるんじゃないの?
WebApplicationやStrutsと同じジャマイカ
扱うデータの型や処理の型を問題にせずSharedDataでひとくくりにするから 概要設計レベルではContextで解決したつもりになっていても 詳細設計レベルで一気に破綻するんだろ。 ハッタリコンサル(初心者)の典型だな
>>435 Mediatorで相互依存性を弱めるというのは正しい方向だが
それをContextと呼び続けるのは病気だ。
今ならDIだろ。
いまどき概要設計/詳細設計かよ
ハッタリコンサルはメーカ毎の工程名の相違に鈍感 OMGの工程名対応表でも見とけクズ
いまどき工程かよw
ハッタリが話題ずらしに必死だな 上空レベル、海面レベルとでも読み替えておけクズ
>>435 > ContextがMediatorになるんじゃないの?
ContextではなくMediatorだろうな、
古臭いデザパタ厨房の妄想に合わせてやれば
ハッタリ必死すぎるぞ カプサイシン摂取過多でそろそろ拳銃乱射事件かw
ハッタリコンサルの仕事: 奴隷コーダに一画面分のコードを書かせ、 それが複数画面で使いまわせると信じ込んで 詳細設計の雛形にする
ハッタリコンサルの仕事2:概要設計 一画面分のコードで、データ類がContextにまとめられているのを見て、 Contextというクラスを作れば複数画面にも対応できるとはずだ という妄想設計をすること。
>>446 お、宗旨替えか?
そうだよSE/コンサルはコーダ以下なんだよwやっと気づいたか
>>448 はぁ?
お前がダメ人間だからといって、
他もダメ扱いすんな。
中小企業のダメコンサルに比べたら
大企業のSEには中にはまともなのが居るよ。
例えば俺。
コーディングもできるし(あたりまえ)、
科学技術にも口出しできるし、
ダメコンサルを叩いて再起不能にする事もできる。
お前を今叩いているようにな
ここで叩かれてボロボロになってるハッタリコンサルって、誰なの?
>コーディングもできるし(あたりまえ) コンプまるだしw
>例えば俺。 日中カキコしまくりのヒキコモリが大企業のSE?w
>>453 みっともねぇ〜ないい歳こいた親父が
2ちゃんごときで必死になっちゃってw
仕事場でオナニー三昧2ちゃん三昧って
それなんていう引き篭もり部屋?
455 :
428 :2007/04/21(土) 12:00:16
うーん。Mediator だとクラスの数が増えてしまうので、ちょっとおおげさ かなという気がします。コストとメリットがバランスしないというか。 問題をうまく処理できることはもちろん大切なんですが、「やり過ぎ」も 避けたいなと。 データ共有型 State パターンは割とありがちなことかと思ったのですが、 検索してもあんまりピンとくるものがないんですよね。まあ、探し方が 悪い気もしますが、どちらかと言うと状態遷移の問題に着目したものが 多かった気がします。 C++ だし参照渡しでお茶を濁そうかなと思ったり。
>>454 おめえは気の利いたこといってるつもりなんだと思うけど、
とにかくセンスが無さすぎる
妄想に基づく独自解釈をGoogleで探しても、適切な例が出てくるわけない。 StateパターンにおけるContextクラスの役割は約一ヶ月前に書いた通り。 お前の負けだ。観念しろ
>>456 キチガイのセンスに合わせるのは難しいな
四流大学出はそういう会話が得意なんだろうけど。
>>446 手足として使った奴隷コーダに強烈な恨みを買っているのが
ハッタリコンサルのダメダメな所。
「勝手に引き抜いて、変な仕事ばかり回してきて
あのバカは一体何様のつもりだ?」
って泣いてたぜ、奴隷コーダちゃん
>>459 そうそうw
そういえばあのコーダも使えなかったよなw
Javaのクラスはオブジェクトじゃない!とかわけのわからないこといってたしw
>>460 そういえばあいつ、頭おかしくなって会社やめちゃったってなw
ヒキって2chばっかやってるらしい。
版画とかよばれてるしw
>>461 ああ、あのゴミか
ほんと死ねばいいのにな
>>462 同意w
おれがあいつならとっくに吊ってるw
464 :
デフォルトの名無しさん :2007/04/21(土) 13:34:37
>>460 バカが発振し始めたな
デブのことだよハッタリ高弘ちゃん
早速スレに晒しときましたw
467 :
デフォルトの名無しさん :2007/04/21(土) 13:39:24
おいおまいら、アドレナリンは俺専用のオモチャだ 勝手にアドレナリンをいじるな 暇つぶしに適当な書き込みをするとすぐ怒り出すのでとても面白い
>>467 カプサイシンの間違いじゃねぇの
半島人臭いし
ムッキー、ファビョーン(笑
おいハッタリをあんま構うな あまり追い詰めると 出身校(四流大)で拳銃乱射事件起こすぞきっと
>>469 そうそうw
版画もちょっと煽るとすぐファビョるしなw
半島に帰れよw
ハッタリ高弘の好物 キムチ餃子
さぁーってと 昼休みのハッタリいじめはそろそろ飽きたし 四月の休日を満喫してくるか(←満喫に行くって意味じゃないよw
版画版画ってバカにすんな!! Javaのクラスなんかオブジェクトのわけないだろ! たしかにハッタリたかひろも俺も鮮人だが、それがどうした! 低脳どもが!
ハッタリの成りすましはクオリティが低くて萎える
GoF本って独習C++を一通りやった程度の知識で理解できますか?
メモ:ハッタリは半島人
>>477 基本的に経験則のまとめ本だから、必要な状況にならないと理解しにくいのが多い。
まあ理解出来る出来ないに関わらず一冊持っとくのは良いと思うよ。
こういうのには盛り上がるんだなw
ほら、宗教の人だから自作自演で信者獲得したフリしないと気が済まないんだろ
GoF本を今時会社の机にこれ見よがしに置いてあるの見ると笑える
キチガイって飽きないの?
アーキテクチャパターンの質問で悪いんだけど、 MVCパターンにおいて、 「押されたボタンに応じて新しいサブWindowをオープンする作業」のような、 Window遷移を管理する人(実現する人)って誰になるの? Model? View? Window遷移もアプリケーションの中核処理になるから、 Modelの責務の範囲内なのかなとも思うんだけど、、実際どうなの?
どーでもねーよ
>>487 画面の制御なんてモロにViewだと思うんだけど。
UIモデルだな
491 :
3年前 :2007/07/11(水) 11:24:49
Domain-Driven Designのエッセンス 「ドメインモデリング」は、アプリケーション開発において最も重要な部分だとされています。 しかしその割には、フレームワークの使い方やアーキテクチャの設計方法など技術に関す る解説書はたくさんあるものの、ドメインモデリングそのものを扱った書籍はほとんど無か ったと言ってもいいでしょう。 Eric Evansの『Domain-Driven Design』(以降DDD)は、「ソフト ウェアの真の複雑さに挑戦する」という副題からも分かるように、ドメインモデリングに正面 から取り組んだ待望の書籍です。 DDDは、海外では非常に評判の高い書籍です。本書の出版前からMartin Fowler氏により 「期待できる内容だ」と推薦されていたり、GoFの1人であるRalph Johnson氏は自身のブロ グで本書を「4、5回は読み直した」と賛辞を送っています。Spring Frameworkの開発者Rod Johnson氏も、最近のプレゼンテーションでDDDを紹介しながら、「Java EE開発者がこれ から進むべき道はリッチなドメインモデルだ」と発表しています。また、MDAツールSculptor のように、DDDを積極的に採用したツールやフレームワークも登場しつつあります。 しかし、日本では翻訳書がいまだに出版されていないこともあり、本書の出版から3年近く 経った今でも、まだまだ一部の通の人たちにしか広まっていないように筆者には思われます。 また、原書を読まれた方の中からも「本が分厚すぎて読みきれない・・・」という嘆きの声も 聞かれます(DDD難民という言葉もあるそうです)。 そこで本連載では、全3回に分けて、DDDの全貌を簡潔に紹介してみたいと思います。 DDDはタイトルからは一見分かりにくいのですが、いわゆるパターン本の1つです。 しかし、DDDは全体が読み物の体裁で編まれているため、パターンカタログが読み物から 独立しているもの(『デザインパターン』『J2EEパターン』『エンタープライズアプリケーション アーキテクチャパターン』など)に比べ、パターンの閲覧性は良くありません。本連載では、 すでに一度読破された方にも有用な資料となるように、パターンカタログとしてDDDを再構成 してみます。
へー
ここって何も知らん人でも書いていいんだろうか・・・ 一つのパターンを適用、っつーか使うっていうのなら何とかできるんだけど、複数のパターンを組み合わせるとなるといきなり手が止まる・・・ デザインパターンはいいコードを書いていれば自然に適用されている物、っていうことなの・・・?
一つ使うも複数使うも難易度に差はないだろ 理解しないでサンプルコード改変してるレベルと見える
デザインパターンって、「組み合わせて」使うような例ってほとんどないんじゃないかな。 一つのモジュールの別々の箇所で複数のデザインパターンを併用することはよくあるけどねー。 Java のクラスライブラリがいい例。
497 :
デフォルトの名無しさん :2007/10/31(水) 00:50:37
難しいことはいいからデザパタって ホントに役に立つのかどうか教えろよ
>>497 OOPを一から自分で設計するのは骨が折れるぞ
バグも紛れ込むし
お前に使いこなせねえよバーカ
>>497 仕事なら役に立つよ
一単語だけで意図が伝わる
501 :
デフォルトの名無しさん :2007/10/31(水) 00:58:01
>>497 自分のそれまでの経験とセンスだけで、
後々のメンテとかになるべく困らないような
設計するのは難しいから、頭のいい先人たちが
編み出した有用なパターンを知っておいた方が楽。
ていうか知らないとかなり大変。
>>498 かなりできる人間が過半数超えてれば使えるし、
超えて無いとロスの方がでかい。
C++でのcrtpとか言語毎に形成されたイディオム的なパターンは実用性も高いし、初心者にも分かりやすいと思う 結局言語の所まで落とさないと使えないしね というかC++だとそういうidiom使わないとたちどころに言語になるし GoFで紹介されてる各パターンは役に立たないけど そこで使われる考え方っていうのは言語ローカルなイディオムを理解するのに役立つかなぁと思ったけど、 もう少し勉強が進んだらまた違う感想になる気がする
505 :
デフォルトの名無しさん :2007/11/14(水) 02:08:15
デザインパターンを使わずにスマートに書く方法とかって どんな感じなんになるんでしょうね? たとえば、うどんをそばを作る場合なんかはほとんど 工程は一緒なのでテンプレートメソッドに使うんだろうけど みなさんならどうやって書きますか? ふと考えるといろいろあるけどどれもいまいちな気が。 1どんぶり用意 2うどんかそばを入れる 3だしをそそぐ
GoFが役に立たないとか、デザインパターンを使わずにスマートに書くとか・・・学生さんかね?
507 :
デフォルトの名無しさん :2007/11/14(水) 08:14:51
>>506 なんだか継承になれすぎて使わないパターンがあまりおもいつかなかったもので使わなかったらどうだろうかと思ったんですけど。
>>505 昔は仕様書を元に上から下へ逐次式に書いたものだよ。
仕様書がすべて、はじめに機能をすべて洗い出せることこそ能力。
これに慣れたままSEになり30代を迎えると、もう補正が効かない。
あと、現場でやっている人は、GOFどうこうを意識している人はあまりいないとおもう。
509 :
デフォルトの名無しさん :2007/11/15(木) 02:57:13
>>508 >これに慣れたままSEになり30代を迎えると、もう補正が効かない。
そういう人を一般的に才能がないという。
勉強する意欲がない人はいくら若くてもダメ。
転職するならお早めに。
510 :
デフォルトの名無しさん :2007/11/15(木) 03:47:08
>>508 ちょっと前にやったプロジェクトで、GOFに死ぬほど拘ってる
プロジェクトリーダーが居て困ったことがあるな。
最近、GOFを勉強したらしく、なんか頭がすごく良くなったカン違い
してるみたいで、設計がGOFのどれかのパターンになってないと、
全部NGにされて、直すのに苦労したよ・・・
>>508 GoFすら意識してなくて機能をイメージできるものか?出来てるつもりじゃないか?
設計なんて茨の道さ。 もんどりうってじたばたして、 痛い思いしながらGoFにしがみついたり、 手放したり、またGoF読み直したり、 もんどりうったり、じたばたしたり、 GoF読み直してピンときてみたり、 こなかったり、もんどりうって、ピンときたり。
全ての設計要素は何らかの秩序の上に存在すべき だが設計要素や立脚する秩序をすべて表現する必要はないってこった 達人の書いたオプソのコード読んでも、凄さが伝わりくい理由がそこにある気がする
>>512 オッパイ揉んでピンときたり
が抜けてね?
ソースコードの見た目がかっこ良くなるので使ってます
開発環境のバージョンによって、含まれるライブラリが違うため、 どちらのバージョンでも動くように、実装を切り替えるということがしたいのです。 XMLのラッパーライブラリのエンジンの実装を切り替える、というようなことです。 Strategyパターンを使うのがよいのでしょうか? 最初は、Decoratorパターンと区別がつかなかったのですが、 GOF本のDecoratorのところにあるように、 ・中身を取り換えるのが、Strategyで、 ・外側を取り換えるのが、Decorator ということで、 中のエンジンを取り換えるのは、Strategyパターンということでしょうか?
>516 あんまりパターンの名前にとらわれずにしたほうがいいと思われ。
うむ。 とりあえず作りたいように作って、似たパターンがあったらそれに合わせていく方向で。
>>517-518 ありがとう
過去レスででてたけど、作ってみてリファクタリングの時に考える方法やってみる
// Hoge.h #ifndef HOGE_H #define HOGE_H class Hoge { public: static Hoge* New(); virtual void Foo() = 0; virtual ~Hoge() { } }; #endif // Hoge.cpp #include "Hoge.h" #include <iostream> class Hoge_ : public Hoge { public: virtual void Foo() { std::cout << "Hoge::Foo" << std::endl; } }; Hoge* Hoge::New() { return new Hoge_(); } // main.cpp #include "Hoge.h" #include <boost/scoped_ptr.hpp> int main() { boost::scoped_ptr<Hoge> hoge(Hoge::New()); hoge->Foo(); } こうやって実装を pimpl より隠蔽してるソースを見たんだけど、 このデザパタの名前って何?
「〜パターン」 とかの名前がついてるわけではないのね。
strategyじゃね
派生クラスを1つしか作らないこと前提で目的も違うから strategy じゃないな。
質問させてください Compositeパターンで作られたクラスに インターフェースの拡張を施した新しいクラスを作りたいときは Bridgeパターンを使いますか?
自己解決しました
自己解決したらできれば、解決法を書いていきましょう 後で見た人の参考になりますよ
528 :
デフォルトの名無しさん :2008/02/27(水) 09:21:02
フラグを1ビットではなくカウンターで持っておき、ON扱いを1より大きい 値(仮にA)とします。ONしたい状況ではいきなりAを代入するのではなく 1ずつ足していき、OFFしたい状況ではすぐにゼロを代入します。 こういう、ONにするときだけショックアブソーバー付きな動作をする フラグはデザパタではどういう名前が付けられてますか?
自家発電しました
アンチパターンだな
最近デザインパターンを勉強しだしたんですが GoFの23個のうち2〜3個組み合わせて何か簡単なものを作るとしたら どんなものが思い浮かびますか?
STL
Template Method との組み合わせは結構考えられるかと。
コマンドパターンとなんかで、 GUIツールのアンドゥの練習
やっぱり、アンドゥ、リドゥの練習にしといて
Memento パターンと Command パターンの複合か。
わかりました やってみます
c++です DecoratorパターンでConcrete ComponentとDecoratorを区別して Concrete Componentの型を知る方法はdynamic_castを使うしかないですか?
>>539 型を知って何をするかによって方法が変わる気が。
RTTI(dynamic_castもその1つ)を使うか、Concrete Componentのメンバに型を示すIDのようなものを用意しておくか。
そもそもスレ違い。
541 :
デフォルトの名無しさん :2008/05/09(金) 11:50:43
鈴木高弘スレw
ゲーム作ろうと思い、デザインパターンの勉強をしてるんですが Singletonをどんな風に使うのか今一ピントきません。 Singletonじゃないと困る場合。 Singletonだと助かる場合。 出来たら例を示して貰えないでしょうか。
あちらで聞いてみます
>>545 デザインパターンの考え方が分かりやすくて助かりました。
AA入ってるのって、一見とっつきやすそうだが…、 読みにくくもあったり…しかし微笑ましいのだけは確か。
例自体は具体的で読みやすいんじゃないか? デザパタ本て(全部とは言わないが)ほとんどが 説明のための説明みたいな本になってるし。
シンプルファクトリーって始めて知った ファクトリメソッドとアブストラクトファクトリしか知らなかった デザインパターン的には常識なの?
この手のものは先に名付けたもん勝ちだから あまり仔細にこだわろうとするな。 > ファクトリメソッドとアブストラクトファクトリしか知らなかった 知ったかどうかよりも理解できたかどうかが大事なんだが。
>>552 わかりやすいし、筆者の理解度は高いと思う。
自分の言葉で言いなおしてるところで、
的が外れていないので高感度アップ。
Abstract Factory 一塊のオブジェクト群を沢山の種類用意する
は、恥ずかしながら今までみたどの解説よりスッとくる一文だった。
例というなら、GoFの元ネタはウィジェットや言語の実装で現われたパターンだから、 自分でウィジェットや言語を書けば何を言ってるのかすぐわかる
うじぇー奴
>>552 FlyWeightってこのページで書かれているような感じなの?
zsh line editorのwidgetでも使えますか!?
だったら読み終わったときに評価書いてくれ
560 :
デフォルトの名無しさん :2008/06/18(水) 18:46:30
MVCモデルについて質問です。 javaであればModelでは描画するメソッドを一切実装せず、描画メソッドについてはすべてViewで実装するという事ですか? 例えば、Modelのオブジェクトにdrawメソッドをdelegateしたい場合などもあると思いますが、 そういう時もViewまで先送りにした方がいいですか?
描画はモデルじゃね?
>Modelのオブジェクトにdrawメソッドをdelegateしたい場合などもあると思います 例えばどんな時? デザパタの本にありがちな、 Shape インタフェースに draw メソッドがあって Circle でも Triangle でも draw 呼べば片付きますよ、 的な話って、いかにも説明のための説明って気がしてならん。
ここまで一切コントローラの話題が無い件
>>562 まさにそういう時。
アルゴリズムでdraw可能なオブジェクトをいくつかはじきだす。
その時にそいつにdrawメソッドを持たせておいた方が都合がいいのでそうしているが、
癒着してるようで気がかり。
長い;;
>>565 当たり前すぎるくらいに当たり前のこと書いてるな。
でも、この当たり前が理解できてないやつが殆どだ。
モデル自体が保存メソッド持ってるフレームワーク見せられて
「なんでこんな設計なの?」「便利だから」
意味不明の回答で泣きそうになった。
次の会社でも探すか。
568 :
デフォルトの名無しさん :2008/06/21(土) 00:25:48
データモデルと永続化は別か,そうかそうか
>>567 あたり前田のクラッカーってどうなったんだろう?
> モデル自体が保存メソッド持ってるフレームワーク見せられて 普通じゃん。
>>567 むしろ保存とか読み込んで再構築とかいう手間を見せ付けてはいけない
シリアライズ機能くらい普通じゃん
シリアライズを提供することと保存の主体であることは別じゃね?
Save(IOutputStream* stream) Load(IInputStream* stream) みたいに外部に保存主体があるわけじゃなくて、 まさか内部に保存主体があるのか?
dbの話じゃないの?
>>574 保存主体ってなんですか><;;
# Save(IOutputStream* stream)
これだと「何を」みたいな目的語が全く存在しない
.NET Frameworkだと、シリアライザクラスに分けてあるね。
クラスを分けるのは便利な面もあるけど、 保存すべき情報は外部に見せることのできる情報ばかりではないからね。 両方できるようにしてどっちにするか選択できるのが一番良い。
Save(PersistContext pContext)とかになってPersistContextの実装しだいでDBにもXMLにも保存できるのが吉かと。
>>552 のAbstract Factoryの頁を読んでみたんだけど、
とても違和感を感じる、というよりはっきり言って全く間違っているように思うのだが
これは俺の方が間違ってる?
俺がおかしいなと思った点は、
(1) void Create( AbstractWeapons *AbsWep)みたいな"具体的な"値を引数で
取るメソッドのどこが"Abstract"(抽象)なのか?
思うに、この著者は"Abstract"の意味を取り違えているのではないか?
確かに「武器」はAbstractWeapons という型に抽象化されてはいるが、
Abstract Factoryの"Abstract"ってそういう抽象化のことを指しているんじゃないのでは?
(2) 1とも関係するが、著者は自分で『オブジェクト内部で作ってもらった方が、
外部の人は渡すべき武器について知らなくて良いので楽になる』と(もっともな)事を言っているのに
できたコードは全然そうなってない。
>>580 そういう疑問を持ったときは実際にプログラミングするのが早い
>>580 (1)AbstractなのはMacheneでもWeaponでも無くFactory、
void Machine::CreateはConcreteなWeaponもConcreteなFactoryも知らない
(2)Machineの内部でAbstractなFactoryがWeaponを生成している
実際に生成されているWeaponsを知っているのはConcreteなFactoryのみいう言う状態
と捉えれば別にその2点は間違ってないと思うけど…
#LispとかMLでサンプルを書いたOOP系の本が見たい
まぁWeaponをインタフェース名にしろと思ったな。 AbstractWeaponsImpl みたいな感じで なんらかの共通処理を持った実装クラス名にすることはあるんだが インタフェース名にAbstractcなんやらーってあんまりしないなあ。 宗教だけど。
584 :
デフォルトの名無しさん :2008/09/08(月) 11:09:58
あげ
読み始めたけど、道のりなげぇぇぇぇ。
586 :
デフォルトの名無しさん :2008/09/08(月) 20:11:30
Context と Context のユーザーが 互いにインスタンス参照をもちあう作りが ものすごく不吉な感じするんだけど そのあたりどうなんだろう。
Head Firstの本ってどう?
abstract Factoryパターンと、Factory Methodパターンの違いについて述べよ。 また、ファクトリパターンがどういう場合に有効なのか知るところを述べよ。 生成メソッド(例えばファイル読み込みなど)を生成すべきメソッドに持たせるとどのような不都合が起こるのかを述べよ。
>>588 俺持ってるけど良いよ
ホントに重要なパターンだけを優先順位を付けて展開してる、
最初は秘術的なobserverパターンから初めてるのも好感できる
observerはstrutsやMVC関連で良く使われるパターンだよね
591 :
デフォルトの名無しさん :2008/09/10(水) 00:47:57
>>590 でもピザパターンとかが無いからなぁ・・・
入門としては良書だけど、見通しが利かないってとこがちょっと。
Head Firstで基礎を勉強したあとの補強にいいのはGoF本?
593 :
デフォルトの名無しさん :2008/09/10(水) 20:58:10
Amazon.co.jp: Head Firstデザインパターン―頭とからだで覚えるデザインパターンの基本: エリック フリーマン, キャシー シエラ, エリザベス フリーマン, バート ベイツ, Eric Freeman, Kathy Sierra, Elisabeth Freeman, Bert Bates, 佐藤 直生, 木下 哲也, 福龍興業: 本
http://www.amazon.co.jp/dp/4873112494 http://images-jp.amazon.com/images/P/4873112494.09.MZZZZZZZZZ.jpg これですか?
高すぎるんですがwww
「デザインパターンによるJava実践プログラミング」っていう本がぱっと見GoF本に似てる感じがしたんだけど、 これを読めばGoF本読まなくっていいかな?
どれ読んでも難解だよな ゲームで説明しているページが一番分かりやすい。 1個だけ間違ってるのあるけど
GoFをまるぺけのところと照らし合せながら読むのがいいと思う
Head Firstシリーズのデザパタ本を読んだ後に同じシリーズのオブジェクト指向設計の本 をちょっと立ち読みしてみたら内容がかぶってる気がしたんだけど、 前者を読んだ後に後者を読む価値はあるかな? 両方読んだ人いたら教えて。
599 :
デフォルトの名無しさん :2008/09/21(日) 15:39:38
stateとstrategyの違いを教えてください。
実装クラスで表現されたモノによって呼び方が変わるだけで、構造上の違いはないよ。
Gofって所謂カタログ本だと思ってた。
>>598 ある
602 :
デフォルトの名無しさん :2008/09/28(日) 10:00:51
過疎どすな
デザパタてはやり過ぎない不思議
604 :
デフォルトの名無しさん :2008/10/02(木) 15:47:16
渇祖
605 :
デフォルトの名無しさん :2008/10/05(日) 14:25:10
>>599 「目的が違う」ってことでいいのかな?
stateはアルゴリズムを動的に切り替えられることに意義があり、
strategyはアルゴリズムを分離することに意義がある
とか。
stateの方、それ違くね?
Compositeってやつのみっつのくらすをひとつのクラスにすることは出来るの?
609 :
デフォルトの名無しさん :2008/10/09(木) 12:31:35
っていうか、「何でお前が勝手にルール決めてんの?つか誰?」って感じしない?
>>609 OOPのノウハウを共有するために呼び名を決めたほうが良いね、ってのが
デザインパターンの意義なのにルールも糞もあるもんか。
おまいが好きなノウハウに好きな名前を付けたけりゃ、そうすればいい。
それを共有しようとする奴は誰もいないだろうがなぁ。
612 :
デフォルトの名無しさん :2008/11/11(火) 15:28:48
あげ
まだあったか
614 :
デフォルトの名無しさん :2008/12/16(火) 13:36:00
あげ
615 :
デフォルトの名無しさん :2008/12/23(火) 01:08:25
Amazonから 「ケント・ベックの『実装パターン』、 Amazon.co.jpでお求めいただけます」 メールキタ━(゚∀゚)━!! ↓ N瀬監修T社翻訳........orz
シングルトンってインスタンスが初めて呼ばれるまで本当にそのインスタンス生成されていないの?
初回に new しているタイプは言うまでもなく、 getInstance内でstatic変数として確保しているタイプでもそうなる。 クラスのstaticメンバ変数として作っちゃうと、mainより前に作られる。
そもそも シングルトンってインスタンス誕生の瞬間までカバーしてたっけ?
>>617 それはプログラミング言語によって異なるだろう。
>>618 シングルトンは初めて使う時に生成するもんじゃないのか?
明日は成人の日か
シングルトンて北朝鮮放送の読み方のように言えるよね
싱 글똔 さんか。
624 :
:2009/01/18(日) 21:54:19
デザインパターンじゃないんだけど実装パターンに書かれてる Pluggable Selector てのがいまいちわかりません。例に出てくるJUnitもよく知らないし。 誰か教えてください。
シングルトンは任意の実行コンテキスト内でインスタンスの個数を制限するだけで、 いつインスタンス化するかはお好きに。 リファレンスカウントがなければ解放してもいいし。
>>624 どこに書かれていて、何が分からないのか分からない。
626が全否定
628 :
デフォルトの名無しさん :2009/01/22(木) 02:08:22
すいません。アドバイスください。 車CarContextの走行状態をStateパターンで CarRunState, CarHighwayRunState, CarIdleStateと設定して、 Stateの派生クラス内で状態遷移の判定を行っているとします ここで予想外に水陸両用車ShipCarContextが増えて CarSwimStateの状態を増やそうとした場合に、 今まで派生クラス内で行っていた状態遷移の判定を CarContext、ShipCarContext内で行うべきでしょうか? CarContextが状態遷移の判定ルーチンで膨れあがるのが嫌で、 State派生クラスで状態遷移の判定を行っていました 諦めてShipCarContext用の状態判定Stateクラスを一から作り直すか、 CarContext内で状態遷移の判定を行うか悩んでいます 定石があれば教えていただきたいのですが
>>628 おそらく定石からは外れるだろうけど、StateManagerみたいな管理クラスを間に挟んで、そこで状態遷移を一元管理させてる。
GOFのStateパターンに従った場合、OOぽいアプローチにできるが、遷移の流れを把握しにくくなるような気がする。
また状態遷移も、今の状態、次の状態、遷移時のアクションが分かれば済むようなもの、まれにガード条件、分岐条件が加わるような場合しか使ってこなかったので、これらの情報を設定ファイルに吐き出して、実行時に状態遷移マネージャに読み込ませてる。
おかげで状態遷移はそれほど膨れ上がらないが、アクションは1〜数クラスにまとめてしまうので、膨れ上がるね。
FactoryMethodパターンとかAbstractFactoryパターンって解放のことまで考えられてないけど、 解放ってどうするの?
>>630 所有権を持っているオブジェクトが破棄してあげればいいんじゃね。
通常だと、Factoryにより生成されたオブジェクトを保持してるオブジェクト
おそらく問題としていることは、複数のオブジェクトでFactoryにより生成されたオブジェクトを保持してる場合を気にしているものと思われる。
所有状態が複雑になるため、このような状態は極力避けるべきだと思うが、どうしても複数で保持する必要があるのなら、参照をコピーした際に所有権も移動させるか、または参照カウンタを実装し、最後まで保持してるオブジェクトに解放を行わせるかのどちらかかと。
633 :
628 :2009/01/23(金) 02:45:12
>>629 ありがとうございます。参考になりました。必ずしもGOFってわけでもないですよね
>GOFのStateパターンに従った場合、OOぽいアプローチにできるが、遷移の流れを把握しにくくなるような気がする。
たしかに把握しにくいです。
とりあえず今回は、それぞれのStateに分散した処理をそのまま使い回したいので、
(泥沼な気もしますが)CarRunStateを例にとると
void CarRunState::update(Context * context);
で読み込んだContextからCarContextにダウンキャスト可能なら、CarContextの遷移判定を行い、
ShipCarContextにダウンキャスト可能なら、ShipCarContextの遷移判定を行うように処理を分けようと思います
CarContextとShipCarContextで判定処理が混在するので、CarRunStateの処理があまりに膨れるようなら、
ダウンキャストではなく、CarRunStateから、CarRunStateForCarとCarRunStateForShipCar
に分けるという方針で行こうと思います
それやるくらいなら・・等、ご意見を頂ければとてもありがたいです
デザインパターンなんてもんが存在してるってことは、オブジェクト指向はまだまだってことでは?と言ってみるテスト
単なる護符だよ
>>634 逆だよ デザインパターンが48個になったら完成
48手だろ
48のデザインパターンと52の関節技ですねわかります
四苦八苦、4x9+8x9=108 で人間の煩悩の数だけでデザインパターンがあるのではないか
642 :
デフォルトの名無しさん :2009/02/09(月) 18:03:46
確認なんだけどハッシュはイテレータ作れないよね?
要素に順番にアクセスできるのがイテレータだと思うんだけど、 ハッシュの場合のイテレータの『順番』ってのはどういうのを考えてるの?
ハッシュド・ビーフが食いたくなった
>>642 Map<K,V> m を iterate したいってことか?
for (Map.Entry<K,V> e : m.entrySet()) { K k = e.getKey(); V v = e.getValue(); }
for (K k : m.keySet()) { V v = m.getValue(k); }
用途に応じて好きな方を使え。
そういう意味の質問でないならお前の日本語が悪いから知らん
646 :
デフォルトの名無しさん :2009/02/10(火) 01:18:54
なんだその暗号は
アルファがベータをカッパらったらイプシロンした。なぜだろう
range based for loop
649 :
デフォルトの名無しさん :2009/02/11(水) 00:47:28
Uncopyableパターンってどういうときに使ってますか?
あ、GetInstanceで参照を返すようなSingletonオブジェクトの場合は 受け取り側の変数に参照ではなく実体の変数を使われないようにするために使えますね
>>649 面倒くさくてポインタそのまま扱ってるクラスが大量に扱われるときに
コピーコンストラクタを作らずに入れておくとか。
class CSomethingManager { public : CSomethingManager &GetInstance(){ static CSomethingManager instance; return instance; } private : CSomethingManager(){} ~CSomethingManager(){} }; //CSomethingManager &instance = CSomethingManager::GetInstance(); CSomethingManager instance = CSomethingManager::GetInstance(); instance.DoSomething();
ユーザーがついうっかり(もしくは何も考えずに)、&を書き忘れてしまうようなことが起こらないようにするために
あ、つーかSingletonでコピーコンストラクタを禁止するから関係ないのかw
>あ、つーかSingletonでコピーコンストラクタを禁止するから関係ないのかw スマソ。日本語おかしすぎた つまりUncopyableパターンでSingletonオブジェクトのコピーを出来なくする使い方があると思ったんだけど、 そもそもSingleton自体に(コピーコンストラクタをprivateで定義することで)そういう考え方が備わってるから 意味ないと気付いた
657 :
デフォルトの名無しさん :2009/02/20(金) 00:33:02
10個位のクラスに、同じような処理を行う長〜い1個のメソッド(1000STEP超)があるのですが、 これを今度共通化するなりしてまとめようという話になり、うまくデザインパターンが利用できないかなと考えています。 (デザインパターンに当てはめる必要はないのですが・・・) クラスA 処理1 処理2 処理3 クラスB 処理1 処理3 クラスC 処理2 処理3 とまぁ、同じような処理を行っているので、 共通クラス 処理1 処理2 処理3 と記述して、呼び出し元のクラスで通る処理を切り替えられないかなと思っているのですが、 こんな用件に対応するデザインパターンてございます? AbstractFactoryやFactoryMethod、Templeteなどが使えないかなと思うのですが、 結局それぞれのクラスから共通している処理を抜き出しても元々のクラスと同じ数だけクラスが増えることになりそうな気がして、 それだと単に処理抜き出してクラス作っただけで終わりそうなので・・・。 デザインパターンの理解が出来てないのかとも思うので、何かやりようがあったらどなたかご教授ください。
A、B、Cの処理ABCが全て同じならクラスは一個でいいだろ クラス 処理A() 処理B() 処理C() クラス a = new クラス() クラス b = new クラス() クラス c = new クラス() 微妙に違うならインタフェースを作って継承するだけじゃ? クラスA:インタフェース クラスB:インタフェース クラスC:インタフェース private test(Iインタフェース t) { t.処理A(); t.処理B(); t.処理C(); }
template method
>>657 オレもTemplateMethodに一票
後みんな、原本の翻訳はしないの?
デザパタのパターン名なんてよく覚えられるな。 覚えてるやつって丸覚えしてんの? ちゃんと意味わかって使ってる?
design patterns by functional programming paradigm とかないのかな?
GoF 23パターンまでぐらいなら。 意味の方は、人と話すときはその都度ググってるw
本当によく使うのは5個くらいだから名前も覚えてる。 その他は名前聞いてもああ聞いたことあるなくらいで 後からクラス図見れば十分間に合う。 暗記力のテストじゃないんだし。
perlの演算子覚えるのに比べれば楽勝楽勝
デザパタの生まれた経緯を考えると名前で呼び合うのが自然なんだろうな。 でもなんかしっくりこない。
>>657 別の視点から。
処理1〜3が同じ引数を持つのであれば、各処理をそれぞれ一つのクラスのメソッドとした上で、
Decoratorで積み上げる、という考え方もあると思う。
Javaや.NET系のStreamをイメージしてもらうと分かりやすいかも。
Decoratorで処理123を組み合わせで積み上げる場合 クラスABCを生成するためにSimpleFactoryでも用意してあげた方がいいのかな?
http://codepad.org/KUsbGdYn ・基底クラスにfactoryを持たせてみた
・decoratorパターンってhookだなぁと思った
・大量のdecoratorを使うときは定義にマクロを使ったらいいかも
・posthookとprehookの形にできるようにすればもっと柔軟に扱えるかもしれない
>>657 なんかすっごい、デザパタ以前の問題の気がw
OOPに嗜まずしてデザパタ適応は無理。
卑下することは無いと思うけど、別のパラダイムだよな 宣言型のプログラミングじゃなくて、動的な奴 で、こう言うのってなんて言うんだ?
672 :
669 :2009/02/25(水) 20:53:45
ガーンこういうのdecoratorって言わないのかー ちょっとゴフ見直してくるわ
>>670 たぶんOOP以前の問題だろうな
答えてる方もあやしいな、Decoratorなんて目的が違いすぎる
何でもかんでもデザパタ使えばいいと思ってる奴らが多そう。
なんでもかんでもhookを使って実装しているemacsに対してひとこと
>>674 オマエがそう思うならそうなんだろ オマエの頭の中では
現実は逆だ。コード設計の意図を次使う人に少しでも伝える為に
藁にもすがる思いでデザパタを入れておく
>>674 同感だな
無理やり導入された名ばかりのパターンは害悪でしかない
>>657 に対するDecoratorがいい例だし、Templete Methodも使うべきじゃないだろう
静的に結合されるcommand patternのようなものを作ればいいんだな よしやってみる
いや
>>669 が最初からDecoratorでない
もういいよw
こういう流れ知ってるからw
わざと煽らなくていいし、いいたいことはいったし
680 :
669 :2009/02/26(木) 07:28:39
>>679 とりあえずどこがdecoratorじゃないか教えてよ
>>657 FactoryMethodパターンは生成に関するパターンでつよw
AbstractFactoryパターンはオブジェクト郡の生成に関するパターンでつよw
AbstractFactoryパターンを勘違いしちゃってる人が多いでつ。
657は、DecoratorかTemplete Methodでググって要求に合う物を使えば良いだろう
>>669 はDecoratorになって無いと言うのがよく解らん
C++のobj->method()->method()の記述が何か別な意味でも持つのか?
OOP的な意味で
>>681 >>657 はたぶん処理1〜3の中にそれぞれクラスA〜Cに対応した処理の分岐があると
言っているんだろう。
だからクラスA1〜C3を作って、A1〜A3を生成するAファクトリ……のような感じで
AbstractFactoryパターンを適用し、その際の共通の部分に対しFactoryMethodや
TempleteMethodを適用しようと考えたんだろう。考え方自体はそれほど間違ってない。
Factory Method パターンはインスタンス生成の抽象化を目的としているのに対して、 Abstract Factory パターンの目的はあくまでも関連するインスタンス群の生成 API の集約化である。 異なる目的を達成するための手段がたまたま似たような形となったに過ぎない。
俺の好きなデザパタ。ベスト3+α。 1) Mediatorパターン 相互作用をこいつに任せると爽快。 相互作用の記述のみに特化したクラス、 という明白な目的を持てるのも嬉しい。 2) FactoryMethodパターン 今でもポツポツこれ使う。 インスタンス化をサブクラスに任せる。自由なような不自由なような。 このパターンが好きなのは某JavaMLなどで○木さんが暴れていたのを見るのが好きだったから。 3) Observerパターン 通知する側される側、で分けちゃうのが何よりスカッとする。 3.1) Stateパターン これを知ったとき、「ああ、これがOOPか…」と感動した覚えが。
>>686 俺も同意だな
初心者には魔法っぽく見えるのはこんなもんでしょ
ところで、SINGLETONは旨いのかな?
スコッチの話なんだが...
この4つは魔法っぽく見えて他は見えないのか、その差が分からないな Observerは割と人気がありそうだけど、他は結構変わった感性な気がする
デザパタは初心者にとって魔法に見えるというより、 ムダなものに見えてると思う。実体験ではそう感じた。 1) ムダに仕組みを複雑にして、ワケのわからんクラスが増えてしまう 2) デザパタだのなんだの言うけど、こんなの前から似たようなのやってる。 Cでも出来る(とか言ったり)、テンプレートでもできる(とか言ったり)、 OOPLじゃなくてもできる(とても気軽に言う)、 これって○○パターンの派生(気軽に定義をぼやかす)と言えるんじゃね(と言ったり)。 そう思うんなら、せめて無理矢理使うのだけはやめてほすぃ(´;ω;`)
>>689 そりゃそうだろう。
極論すれば、よく見かけるのに名前を付けただけ。
デザパタってクラス図とかも状況に応じて変化するんでしょ? あんまり意識しすぎても意味ない気がするんだけど…
それがどうした
ぼく
694 :
デフォルトの名無しさん :2009/03/03(火) 10:28:19
> デザパタだのなんだの言うけど、こんなの前から似たようなのやってる。 デザパタの本を渡した新人が9割9分返してくる言葉www
結局のところ、デザパタは難しいんよ。 だから、知ったか大発生になるんよ。 デザパタの価値を知るのは、 「設計の困難>デザパタ学習の困難」 な場合だけだよ。 デザパタ適応で何が柔軟になるのか、 パターンをカタログ化して嬉しいのか、 そこがピンと来ないんよ。 設計で苦しんでないと、ピンと来ないんよ。
デザパタ覚えたての新人が増えたようだな 悪い方に育ってないが、デザパタはそんな仰々しいもんじゃねーよw
デザインとかいってるけどその名にふさわしいのって一部だけだろ シングルトンなんてただのコーディングテクニックっていうレベルのものじゃん
ところで、SINGLETONは旨いのかな? スコッチの話なんだが...
そのネタ定期的にみるな。
多分だが、
>>697 は「デザイン」の意味をよく解ってない。
どうでもいいわ
Visitorはダブルディスパッチの模写だ、とかっていうんだけど、 ダブルディスパッチって要は2つのクラス階層で処理を分岐させることではないの? Bridgeもそうだと思って検索してみたんだけど、なんかそうでもなさげ なんか勘違いしてる?
ダブルディスパッチはvisitされるオブジェクトがVisitorを兼ねる場合のパターンと 見なすこともできる。 どちらの方が都合が良いかは場合によるので一方が他方の模倣というわけではないな。
705 :
デフォルトの名無しさん :2009/03/13(金) 23:44:51
ダブルディスパッチってのは、 例えばクラスAとBにそれぞれ3つの派生クラスa0,a1,a2,b0,b1,b2があったとして、 組み合わせによって動作が異なる場合の解決策。 これをA→Bの順で2回ディスパッチすると、最大9パターンの動作が存在しうる。 Bridgeの場合、 例えばクラスAの委譲先はa0,a1,a2,...、クラスBの委譲先はb0,b1,b2,...というように、一方向の関係になっている。 a?がBの委譲先になったり、b?がAの委譲先になったりはしない。 AもしくはBから1回ディスパッチすればいいので、最大6パターンの動作が存在しうる。 …あんま自信ないけど、こんなかんじで合ってる?
>705 MSはなぜ顔写真を載せようと思ったのか
BridgeはむしろStrategyのContextクラスがインタフェース階層化された場合と 見ることが出来る。これはモジュールを疎結合にするための構造化の手法だが、 マルチプルディスパッチやVisitorは単純に複数の引数型を動的に解決する方法であり、 つまり条件分岐の上等なやつでしかない。
Bridgeパターンよくわからんね。
>>706 パターンの目的が知りたいのか構造が知りたいのか分からないからレスもしにくいんだが、
Visitorパターンの目的はダブルディスパッチで、ダブルディスパッチは関数のオーバーロードを実行時の型によって行う動作のこと
ポリモーフィズムを使ってどうやって実現するかを考えればだいたいの人はGoFの構造を考え付くと思う
Bridgeパターンの目的はクラスのある部分を分離してしまうこと
分離元クラスと分離されたクラスがそれぞれ1つずつならpimplみたいな形になるけど、それぞれがクラスツリーを形成する場合を考えればだいたいの人は(ry
名前をつけることでイメージを固定化するというか共有するというか 大抵のパターンは解かってる人なら大抵思いつくことなんだと思う 解からん人や入門者にもイメージを伝えやすいし
あぼーん
713 :
デフォルトの名無しさん :2009/04/29(水) 20:48:01
>3.1) Stateパターン > これを知ったとき、「ああ、これがOOPか…」と感動した覚えが。 私は逆に、オブジェクトの振る舞いの実装がオブジェクトではなく 状態にあるってのが違和感あってだめだった 同じ「腹痛」状態でも、胃薬飲む人、我慢する人、病院行く人と 色々あるからオブジェクトそのものも状態の一つじゃないかと
いや多分stateパターンの実装方法が「OOPっぽい」って思ったんじゃなかろうか
BridgeってCで言うところの関数ポインタ渡しだよね?
Stateで状態が組み合わせだった場合どうなるんだろ
設計ミス
>>717 関数ポインタ渡しはStrategyだろ
>>718 Boost.Statechart
>>710 何度見てもVisitorはキモいと思う
関数型言語のパターンマッチとかC++のtraitとかで何とかならんのか
>Statechart NFA->DFAの変換をしろということか
C++のtraitsの方が何やってるのかさっぱり解らない どうもテンプレートは苦手だ
>>722 traitsはtemplate引数の型をコンパイラに自動判別させるための仕組み
イテレータは知っての通り5つの種類がある
これをいちいち型指定しなくてもコンパイラが判別してくれるようにする
char_traitsのほうかもしれないぞ
弾幕STG作るのに最適なデザインパターンって何でしょうか? 1.弾の描画処理と当たり判定を決めるクラスと 2.弾の動きを定義するクラス を作ってコンストラクタで1.のクラスのポインタを渡すように してみましたが使いづらいです・・。
マイクロスレッド? いや知らないけど
STG作ったことないけど 弾、敵機、自機、当たり判定、描画処理 で分けちゃえば? 当たり判定と描画処理はmediatorで
728 :
725 :2009/05/28(木) 22:50:07
>>726 ググったら弾幕風講座がヒットしました。これ使うと複雑な弾幕も作りやすくなるとのことですが・・
C++で出来るんでしょうか?
コルーチンがあると意外とたのしい そんな徹夜明けの今日
コルーチンからはModula-2しか思いつかない私。
732 :
725 :2009/05/30(土) 23:45:55
>>732 弾、敵機、自機、当たり判定、描画処理とかクラスがあった時に
お互い直接やり取りはせずに必ずMediatorを通してやるのが
Mediatorパターン
弾や機体といったActorが高機能でなければ、それぞれ単なる構造体にでもして 統一的なモジュール、つまりMediatorが管理するようにする。 Mediatorは内部処理が汚くなりやすいのが欠点だが 逆に泥臭い処理がどうしても必要な時にそれを閉じ込めるために使える。
735 :
725 :2009/06/04(木) 23:41:38
どういう風に便利なのか、よくイメージがわきませんがとりあえず組んでみます 組んでみればわかるかな
シューティングなんて作るのは簡単なんだから、とにかくいろいろな組み方を試して 自分にあったやり方を見つけりゃいい マイクロスレッドも一応試しとき
それぞれのパターンに書いてあるクラス図は 必ずその通りにしなきゃならんのかね 心意気だけ同じじゃダメ? visitorとかあのままだと使いにくくてたまらんのだが
好きにいじくっておk。 しかしvisitorはあんまいじりようがないと思うんだが。
いや クラスをデータ部分と処理部分に分離したいのはパターン通りなんだけど 分けた後のクラスの両方、もしくは片一方が 抽象/具象に分けるまでも無いときとか
絶対遵守のルールじゃないんだから、アレンジすればよろし。 あくまでも「よくあるパターン」を一般化したものなんだから。
741 :
デフォルトの名無しさん :2009/06/23(火) 09:22:08
もっといいのはアレンジの前に、 ほんとにパターンが適合できるか、 使うべきかどうかを考え直すこと。
デザインパターンって普通パターンの基底クラスを作って派生クラスから使うものなんですか?
必要だからあるのです
ただの用語セットだと思った方がいいんでね?
検索機能でオプションの項目が沢山ある場合に使えるデザインパターンを教えてください
>>745 オブション項目間の依存関係があるなら、
Mediatorパターン。
コレにチェック入ってる時だけこれとこれを有効、
ソレにチェック入っている時だけさらにこれらを画面に出す、とかそういう。
逆に言えば項目間の依存関係がなければ必要なし。
助言ありがとうございます 理解を深めて挑戦したいと思います
748 :
デフォルトの名無しさん :2009/07/10(金) 23:09:57
ぬこかわえ
誤爆しました><
>>741 「パターン指向リファクタリング入門~ソフトウエア設計を改善する27の作法」
この本にはある程度つくってからパターンにあてはめりゃいいみたいなことが
書いてあるが。
絵に描いた餅のウマさを説いたところでってゆう
保守
デザインパターンを意識しないで最適解を考えて作って見たら デザインパターンだったって事も多い ありふれてるからパターンなんだな
>>753 まあ、そういうものでしょ。
すでにあったものを整理することで分かりやすくする
というのが要点なんだから。
デザパタはよくあるパターンに名前をつけたことがすごい
変な萌えネームつけられなくてよかったな 意思疎通するときに恥ずかしいし
無味乾燥で疑念の挟みようのない命名なのは助かる。
でもGoFじゃないデザパタには不思議なの混ざってたとおもう
「Java実例プログラムによるデザインパターン入門講座」のSimple Factoryパターンとか? パターンの名前でシンプルという単語を使っちゃうセンスとか。 しかもあの本、Factoryなのに、getXXXとしてて、元の、 Factory - create の美しい関係を軽視しちゃってる。
はてな界隈で俺流パターンに アニメや漫画から引用して名付けてんのはたまに見るな
デザインパターンって非OOP言語にも適用可能なの?(C言語とか)
>>761 GoFのデザパタなら、
「オブジェクト指向における再利用のためのデザインパターン」
とある。
非OOPLでもOOP出来る、と主張したり、実践しようとしたりする人がいるので、
そいういう人に聞いてみるのがいいかも。>非OOP言語にも適用可能なの?
OOPは考え方であって別にCでもOOP出来るわな。 やりやすいかやりにくいかはさておき。
CでOOPやると、C++が素晴らしい言語に見えるぞ。
>>764 俺もそう思ったクチ。
非OOPLで夢見てもどうしたって煩雑になる。
だから、CでOOP「っぽく」という着地点になってしまったり、
恥ずかしいような虚しいような気分になる。
stateとcommandってどうちがうんですか?
767 :
デフォルトの名無しさん :2009/08/20(木) 19:48:28
何を以てstateとcommandを同じだと認識してるのかが全然わからんのだが
>>766 あえて調べずに、テキトーなことを言うと、
1) commandパターンはアクションをパラメータ化する。
undoしたりもできるようにもやりやすいと思われ。
2) stateパターンはコンポジションでグルグル切り替える。
ゲームで言うと、
デモ画面、スタート画面、ゲーム中画面、ポーズ画面、エンディング、を切り替えたり。
それぞれの状態で、描画やキー入力、音楽などのそれぞれの処理を行う。
それらのインスタンスを並べて使っている側で、置き換えることで切り替える。
State state;が、state = titleになったり、 = demoになったりしつつ、
stateに対して、state.drowとかsate.playsoundとかしてみたりする。
以上、これらはすべてテキトーです。
本でMediatorの項をみるとMediatorのほうには Medi::changed(Coll*)しか通信手段が書かれてないんですが ほかの通信よう関数(たとえば最寄の敵の座標をくれ、など)はつけたさないで全部 changed、アドレス比較、・・・というながれでやるのが普通なんでしょうか
MFCとか.NET FrameworkとかってGoFのパターンがわかってたら理解早くなる?
遅くはならないだろうな
・XMLのエレメントツリーは既存の稼働中モジュールなので修正は最小限に ・ツリーに対してどのような操作があるかは未定 という状況を前提に、XMLのエレメントツリーを探索して、 特定のノードや属性値を探したり上書きしたり枝を追加したりしたいんですが、 Visitorパターンがお勧めなんでしょうか? XMLエレメントの最上位superクラスに、再帰で自分自身と子供について 処理するメソッドを複数追加していくってのはあまりやりたくないのです。
773 :
772 :2009/08/28(金) 17:05:09
つらつら考えてたんですが、visitorで処理を追加する場合、visitorクラスの兄弟クラスというのか、 同じインタフェースを実装するクラスを追加するのが普通なんでしょうか? 1人1殺じゃない、1クラス1メソッドという感じで。 acceptからは決まったメソッドしか呼べませんよね。。。 accept時に呼んでほしいメソッド名を第2引数で渡しておいて、 それをvisitの第2引数で戻してもらって、 visitorのvisit内でリフレクションで自分自身の指定メソッドをコールするなんてのは…やらなそうだなあ。
XSLTでやれば良いと思うんだけど。
仕事で「なるべくデザインパターンとか使わずに、分かりやすいコードでお願いします。」 って言われた。 デザパタより分かりやすいコードってどんなだ…
input, process, output の3つのメソッドだけが存在するコード
>>775 一切使わずではなく、なるべく使わずなんだよね
Template Method, Strategy, class-side Factory
あたりにとどめておけばいいんじゃない?
上記3つすら理解出来ないと言われれば、お手上げだ
>>775 クラスのことをモジュール、メソッドをサブルーチンと言って
相手が安心したような顔をしたら勘定系の書き方をしろということだろうな。
メソッドを関数と言うとかそういったやつだなw
マジレスだが、「わかりやすいコード」が力点だろ。 必要ならデザパタを理解させればいいじゃん。
是非うちの老害どもに理解させてやってくれ。 猿に教える方がまだ楽だと思うがね。
782 :
772 :2009/09/01(火) 16:06:04
>>774 2つのXMLを両方チェックしながら操作したいのと、
XSLTはデバッグしにくいので…
「Java言語で学ぶデザインパターン入門」という本を持っているのですが、それの第2版っぽい 「増補改訂版Java言語で学ぶデザインパターン入門」との差分って分かる方いますか? 今度、デザインパターンを勉強するのですが、増補改訂版を新しく買った方が良いでしょうか?
GoFじゃないけど、DAOパターンについて質問。 DAOってWebサービスからXML取得してビーンにして返す処理も範疇? パッケージレイアウトでそんな処理をdaoパッケージに入るべきか迷った。
アダプタパターンべんりすなぁ
StrategyパターンとTempleteMethodパターンの違いがよくわかりません。 教えてください。
>>786 ほかのクラスのオブジェクトに処理を任せる(委譲)のがStrategy
自クラスのサブクラスで処理を実装するのがTemplate Method
言葉だけでは分からないと思うので、実装例(Java)を
[Strategy]
class Sample {
private IHoge _internal;
public void Method() {
_internal->Method_A();
_internal->Method_B();
}
}
interface IHoge {
void Method_A();
void Method_B();
}
class HogeHoge implements IHoge {
public void Method_A() {}
public void Method_B() {}
}
(つづく)
>>787 のつづき
[Template Method]
class SampleParent {
public Method() {
this->Method_A():
this->Method_B();
}
protected abstract void Method_A();
protected abstract void Method_B();
}
class Sample extends SampleParent {
protected void Method_A() {}
protected void Method_B() {}
}
この場合、構造的に違いはあれ、やってることに違いは無い。
おそらくこのような実装例をみて、違いがわからないと感じたのではないでしょうか?(つづく)
>>788 のつづき
Strategyのメリット
処理の差し替えが容易
上の例では分かりにくいが、例えばMethod_A(),Method_B()のバリエーションが、4つずつあった場合、Strategyであれば、
public void Method() {
_internal_A.Method();
_internaj_B.Method();
}
としていれば、組み合わせはMethod_A(),Method_B()あわせて、8通りとなる
一方、Template Methodの場合、4×4で16通りの組み合わせになる。これはバリエーションが増えれば増えるほど、差が開くことになることを意味している。
デメリットは、処理をほかのクラスに任せてしまうため、Method()の処理を確認するのにあちこちをみなきゃならなくなる。
(つづく)
>>789 のつづき
逆にMethod_A(), Method_B()のそれぞれでバリエーションが現れるのではなく、その組み合わせでバリエーションが発生する場合は、Template Methodが向いているといえる。
例えば、各ファイルを読み込むクラスを考えると、テキストファイル、画像ファイルなど、オープン > 読み込み > クローズがファイルの種類のバリエーションとなるため、Template Method向きとなる。
これを、無理してStrategyにしてしまうと、逆に分かりづらくなる気がしない?
P.S.
>>787 , 788はJavaの例っていってるけど、ぜんぜんJavaじゃないです。ってゆうかコレ何言語?。スマン
最後に、StrategyとTemplate Methodの使い分けについて。 機能を分解する際、基本的にStrategyを使う。 ただし、上の例の様に、組み合わせでバリエーションが現れる場合は、Template Methodの適用も考える。 Tmplate Methodのほかの適用例として、Abstract Skelton Classってのもある。詳細はググってもらうとして、簡単に書くと インターフェース > 抽象クラス > 実装クラスというようなクラス構成のこと あと、Strategyが理解出来る様になると、委譲型Adapter, Decorator, Chain of Responsibilityなどの、派生するパターンも理解出来る様になると思う。 とりとめの無い文章なって、ごめんね。
よくがんばった
793 :
786 :2009/11/08(日) 17:06:51
TemplateMethod とStrategyについて質問したものです。回答ありがとうございます。 でもわかりません。 「MethodA(),Method_B()のバリエーションが、4つずつだと」というのはStrategyパターンでは IHogeをimplementsすつクラスが4あるということですよね。 一方TemplateパターンにおいてはSampleParentをextendsするクラスが4つあるということですよね。 そういうイメージの中、8通りとか16通りというのは何の数を表しているのでしょうか? 16通りというのはわかります。AB4つずつあるので全部を表現するには新たに16個のサブクラスが必要になる。 けれどもStrategyの方はよくわからないんです。interfaceクラスをAとBごとに2つ作るということですか? (つづく)
794 :
786 :2009/11/08(日) 17:11:41
class Sample { private IHogeA _internalA; private IHogeB _internalB; public void Method() { _internalA->Method_A(); _internalB->Method_B(); } } interface IHogeA { void Method_A(); } interface IHogeB { void Method_A(); } class HogeHoge implements IHogeA{//これが4つ public void Method_A() {} public void Method_B() {} } class HogeHoge implements IHogeB{//これが4つ public void Method_A() {} public void Method_B() {} } てことなのでしょうか?
795 :
786 :2009/11/08(日) 17:12:54
これなら新規に追加するのは8個とおもうのですが。
>>794 8通りという言い方は、良くなかったかな。
以下の様に合計8つのサブクラスを作るってことがいいたかったのよね。
interface IHogeA {
void Method_A();
}
interface IHogeB {
void Method_B();
}
class HogeHoge_1 implements IHogeA{
public void Method_A() {}
}
class HogeHoge_2 implements IHogeA{
public void Method_A() {}
}
// HogeHoge_3, HogeHoge_4...とつづく
class AheAhe_1 implements IHogeB{
public void Method_B() {}
}
class AheAhe_2 implements IHogeB{
public void Method_B() {}
}
// AheAhe_3, AheAhe_4とつづく
>>793 一方、Template Methodについては、
Method_Aのバリエーションをそれぞれ、A1, A2, A3, A4
Method_Bのバリエーションをそれぞれ、B1, B2, B3, B4
としたとき、
全てのバリエーションを網羅したい場合には、
(A1, B1), (A1, B2), (A1, B3), (A1, B4),
(A2, B1), ...., (A2, B4),
(A3, B1), ...., (A3, B4),
(A4, B1), ...., (A4, B4)
の、16のサブクラスを作る必要がある。
StrategyとTemplate Methodを比較した場合、規模が大きくなるにつれて、
Template methodの方がクラス数が爆発的に増大する可能性がある。
ここだけをみれば、Strategyの方が優れている様に見えるけど、
そうではなく、使いどころを誤った場合、そのようなカオス状態になるということ。
十分粒度が細かくなると、
Method_A()とMethod_B()でそれぞれバリエーション化することは、ほぼなくなるため、
>>790 でも言ったように、Template Methodでも問題なくなってくると思う。
俺の場合、規模の大きなものを多階層化でクラス分解する場合、委譲型(StrategyやDecoratorなど)で粒度を細かくして行き、
末端のバリエーションに対して、抽象クラス型(Template Method)を適用するようにしてる。
また階層化のクラス分解については、アーキテクチャパターン
(Model-View-ControllerとかPresentation-Abstract-Cntrolとか)について調べてみるといいかも
799 :
デフォルトの名無しさん :2009/11/20(金) 04:49:20
Gof本の151ページに描いてある、Adapterパターンの「適用可能性」について、 ・まったく無関係で予想もつかないようなクラス (必ずしも互換性のあるインタフェースを持つとは限らない)とも協調していける、 再利用可能なクラスを作成したい場合。 って言うのがあるんですが、これの意味がわかる方っていらっしゃいますか?
ラムダとか使えばあらかたのデザパタがいらなくなると聞きました。 まとめてエロイ人。
>>800 とか が気になるけど
Lambdaで不要になるのはStrategyパターン
Template系の半分はいらなくなるわな
そうか?
ファクトリーでサブクラスの生成を管理しようとしてるんだがこれサブクラスの数がめっちゃ増えてくると結局すごい大変な労力を支払わされない? 今のところ New<T>(){ return new T; } の関数ポインタとmap<TagType, NewType>を使って管理してるんだが、もっと楽な方法はないだろうか
パッと思いつくのは map にしてしまっているのでファ クトリ群を継承とか使って階層的に出来ない点かなぁ…。 ケースバイケースだろうけど。
DataMapperパターン ってどうやって実装すればいいのですか?
>>806 節子、それGoFとちゃう。スレ違いや。
ORマッパ?
やーここはGoFに限定するスレではないべ?
とはいえ
>>806 はだいぶ狭いドメインの話題のようだが
DataMapperパターン もわからねぇのかこの腐れ外道供
わかってるのはお前だけだからがんばれ
C++の評議委員がGoに乗り換えするらしいぞ
つうか、デザインパターンって流行らないよな シンプルなことをわざわざ手間をかけて複雑にしてるのばかりだし
最近では、言語やフレームワーク、ライブラリに組み込まれてるからね。 コーダーレベルなら、別に意識しなくても良いと思うよ。
815 :
デフォルトの名無しさん :2010/02/06(土) 20:38:41
んなことないだろ。少し複雑なプログラムになれば、いくらでも使うだろ。 別に意識しなくとも自然とGoFのデザインパターンのようなものに行き着く。
デザインパタンは、本来は複雑なものをシンプルにするためのものだよね。 その辺の感覚の分からない人の場合、複雑になったり無駄が増えても とにかくデザインパターンを使えばよい設計になると勘違いしがち
根本から理解してない奴増えたな・・・
パターンに名前付けたのがすごいし
言葉遊びがたまに役に立つこともある、っていう匙加減が難しい。 全く役に立たないと思ったり、逆に、口先だけで何でも解決すると思ったりする。
基底クラスAがあり 派生クラスBA クラスCAはクラスをAを継承しています。 クラスBA、CAを作成しわけるクラスFを作成しました。 A b = F.Create(0); // ← クラスBAのインスタンスを作成 A c = F.Create(1); // ← クラスCAのインスタンスを作成 共通のメソッドMethod()はクラスBA,BCでそれぞれオーバーライドされています。 これで、 b.Method(); c.Method() とすれば、インスタンスによってことなる挙動ができますが、 新たなるクラスDAを作成しました。 DAはnewするときにもうひとつ情報が必要な為、 F.Create(int)→F.Create(int,double)に変更し問題はないのですが クラスBA、CAにはまったく必要のない情報なのに A b = F.Create(0,1.0); A c = F.Create(1,2.0); A d = F.Create(2,3.0); みたいにやっています。かなり不自然とと思っています。 どうでしょうか?
どうて言われてもな。 CreateB()、CreateC()、CreateD(double)じゃ駄目なのか?
822 :
デフォルトの名無しさん :2010/04/19(月) 11:49:40
>>820 このパターンで、わざわざファクトリーにしてる意味がわかんないんだが。
A b = new BA();
A c = new CA();
A d = new DA(double);
でいいんでない?
823 :
デフォルトの名無しさん :2010/06/02(水) 21:16:41
Javaやってりゃ意識しなくともパターンのお世話になる 意識すればそれらの答は出る
C++でデザパタやると汚くなるな
>>823 ソースコードを読むのが一番いい。
デザインパターンは学ぶものではない。
>>823 StrategyとTemplate Method
この2つをものに出来れば、ほかのGOFパターンの大半はおさえられる。
>>827 なんというか、同意してやってもよいぞ。ほめてつかわす。
インタフェース書いときゃそのうち使える
デザインパターンを学ぶのもいいけど、 自分でパターンを考えるのも面白そうだよな!
>>830 俺のなんちゃらパターンを言い出す前に、
しっかりGoFを押さえておかないと迷路に嵌まり込む。
832 :
デフォルトの名無しさん :2010/06/12(土) 12:50:56
GoF以降新しいパターンの本は出てきていない GoFに上がっているパターンのみで十分にプログラミングできる すでに完成されたプログラミング戦略であって, オレオレパターンが入り込む余地など無い
GOFが十分完成されたものなので、 新たなパターンが入りこむ余地は無いと思う GOFパターンの組み合わせにより、 なパターンを構成できるかも知れんが、 それはもはやアーキテクチャパターンの世界
分割統治パターン 別名:サブルーチン、プロシージャ、関数、モジュール、クラス
じゃあおれがとっておきを披露する。 基底クラスが派生クラスを知っている糞設計だが、 こういうことをしたいとき便利かもしれない。 二回ディスパッチパターン。 class Shape { void intersect(Shape s) {} void dispatch(Circle c, Shape s) { s.intersect(c); } void dispatch(Box b, Shape s) { s.intersect(b); } void intersect(Circle c) {} void intersect(Box b) {} } class Circle extends Shape { void intersect(Shape s) { dispatch(this, s); } void intersect(Circle c) { System.out.println("c-c"); } void intersect(Box b) { System.out.println("c-b"); } }
class Box extends Shape { void intersect(Shape s) { dispatch(this, s); } void intersect(Circle c) { System.out.println("b-c"); } void intersect(Box b) { System.out.println("b-b"); } } class VisitorTest { public static void main(String[] args) { Shape b = new Box(); Shape c = new Circle(); b.intersect(b); b.intersect(c); c.intersect(c); c.intersect(b); } }
中二らしくもっとカッコイイなまえにしておく。 AlternateDispatch パターン。
と思ったらjavaだった インデントしてくれyo
>>830 Gofで扱われている言語でなければその価値は十分にある。
でも、その言語ならではのパターンが確立していることが多いと思う。
>>841 色んな形のオブジェクト群の間の衝突検出、
どうやって記述する?
つModern C++ Design >835-836は ・基底クラスのShapeが派生クラスのCircleやBoxを知っているのは色々望ましくない。 ・派生クラスの数に応じてサイズが指数的に大きくなる 今はCircleとBoxしか派生してないからいいけど、 TriangleとかPentagonとか色々派生クラスが増えると悲惨になる。
あ、>843はどう書くかについて言及したわけではなく、 設計上不味い所を一応指摘しただけ
>>843 うむ。派生クラスが増えることで、糞さが露呈するのは同意。
さらに、兄弟クラスで知り合っているので、
新しい兄弟が出来れば、それを追記して回る必要もある。
ただ、一度ライブラリとして出揃ってしまえば、
それを使うクライアント側からしたら、
呼び出しは簡潔になってると思う。
どこかに便利さを出そうとして、
どこかが汚れるのはアリではなかろうか。
駄目? やっぱこんな糞パターン無し?
list.add(new Triangle()); // 2D list.add(new Circle()); // 2D list.add(new Box()); list.add(new Sphere()); list.add(new Cone()); とかして、 for (int i = 0; i < list.sie; i++) { shape s1 = list.get(i); for (int j = i + 1; j < list.sie; h++) { shape s2 = list.get(j); if (s1.intersect(s2)) {} } } とShapeして一括処理できることは、旨みが無いだろうか。
当たり判定って、それ専門のアルゴリズムが多々あるのに、力技やら汎用的なデザイン・パターンで処理しようって考えからして間違ってけどね。 もっと別のお題をどうぞ。
「それダブルディスパッチじゃね?」って突っ込み待ちじゃなかったのかよ… Lokiやmore effective c++に、ダブルディスパッチでクラス同士の 依存関係を絶つ方法が載ってるから見てみるといい。
俺もそう思った。相当昔からある伝統的パターンだろと。
車輪の再発見!
JavaマにMCDを読めというのはあまりに酷
>>845 デザインパターンは基本的にメンテナンス性を上げるためのもの。
むしろ下げてるという意味においては、少なくとも同列に並べるもんじゃない。
具体的なクラスを定義したライブラリが出揃ってから〜
だと汎用性や拡張性が無いよね。デザインパターンと呼べるかどうか
オレはJavaはわからんし、ダブルディスパッチを使う場面に
遭遇したことないから、あまりまじめに考えてこなかったけど
これ考え出すと結構難しいね。
boost::variantで簡単にできないかと思ったけど今ひとつだった
http://codepad.org/m61Vic9c
>>853 それだと型情報もったまま単にオーバーライドしてるだけでは?
(テンプレートだからオーバーライドですらないか?)
一旦Shape型になった変数群を、
実際の派生型を意識させずにintersectさせるには…
などといおうとしたけど、
boost::apply_visitor( IntersectVisitor(), vl, vr );
この部分はそうなってるな。
acceptさせてそっから始まるダブルディスパッチなんだろうな。
痛恨orz オーバーロードな…俺の顔は今まさに真っ赤。
856 :
デフォルトの名無しさん :2010/09/17(金) 23:37:35
メディエーターって仲介するクラスが増えるとメンバー関数がどんどん増えて大きくなりすぎだと思うんだけど、それって普通なのかな? mediator * pm; pm->getInfoHogeOfA(); pm->getInfoFugaOfA(); pm->getInfoHogeOfB(); ・・・ pm->getInfoPiyoC(); みたいな感じで登録したいクラスが増えるたび、知りたい情報が増えるたび無尽蔵にメンバ関数が増えていく・・・
何をしたいのか良くわからんが、なぜ外部から mediator を介してメンバの情報を取得しようとしているの? それは mediator の仕事じゃないよね。
858 :
デフォルトの名無しさん :2010/09/18(土) 09:56:00
859 :
デフォルトの名無しさん :2010/09/18(土) 10:07:32
ちゅう、しょうか?
>>856 一つのMediatorに全てを任せてしまうと、巨大クラスになって扱いづらくなるので、
可能ならMediatorで共有したい責務を細分化してみては?
mediatorはオブジェクト間の相互作用を記述する。 だから「相互作用」以外のことは、他のものが担当すべき。 「登録」「クラスが増え」とか、ひょっとしたらオブザーバの担当かもしれない。
862 :
デフォルトの名無しさん :2010/09/18(土) 12:07:42
うーんなかなかむずかしいっす
>>857 ひょっとして条件に一致する要素の名前をリストでくれ、とかそういうのはmediatorの仕事にしないほうがいいんですかね?
こういうケースはmediatorじゃ無くてリストの参照を普通に保持するだけのほうがいいのだろうか
>>860 直交性のある仕事ごとに1つのMediatorを作るってことですかね
それはそれでMediatorだらけになりそうだけどメンバ関数地獄よりましなのかな・・・
>>861 相互作用って言うのがどこまでのことを言うのかが自分の中であいまいなのかも
多粒子系のポテンシャル相互作用みたいなわかりやすい話だったらいいんだけど
>>862 相互作用ってのは、GoF本の例を見なされ。
ダイアログの上の、コンボボックスとラジオボタンの関係(だっけか?)みたいなのを、
mediatorを使って書いてる。
インスタンスが特殊な状況になったとき、それを判断して、
他のインスタンスへ特殊な呼び出しをする。
こうのとき、こう。こうなったら、こう。
っていう、汎用化しにくい特殊な作用を書く。
>>862 「(複雑な条件)に該当する値をちょうだい」 とかの仕事は Facade の役割。
Mediator と Facade を兼ねたオブジェクトを作ることはままあることだけど、本来は別物。
で、Mediator が扱う相互作用とは
「Mediator が保持しているオブジェクトの間だけで交わされるメッセージ」
のことを言っている。
Mediator の中に閉じないメッセージ交換は、すなわち Mediator が取り扱う相互作用じゃないよ。
>862 Mediatorとは、所詮内部データの共有に対して、名付けただけだから 具体的には、フォームAの変更をフォームBに伝えたいとき、間に共有モデルを置き、直接の依存を避けるパターン なぜ直接の依存を避けるのか? UIは、変更されることが多く、モデルはUIほどは変更されないから。 つまり、互いの変更が少なければ、わざわざ複雑な構造を取らなくても、直接依存しあったって構わない。 「条件に一致する要素」というのがどうゆうものか分からなけど、 例えば、子フォームで検索条件を入れると、親フォームがインクリメンタルに絞り込まれるものだったら、 子フォーム->モデル:条件に従いモデルデータの絞り込み。 モデル->親フォーム:変更したことを通知。 つまり、Mediatorなんて使わず、Strategy+Observerだって構わない
>>865 Mediator を 「モデル」 にしなければいけないわけではない。扱うものを UI に限定しなければいけないわけでもない。
具体例を出すと分かりやすいけど、反面変なところに嵌りやすいよ。
要は、オブジェクト間ネットワークがフルコネクト型トポロジになると管理しにくくなるので、
それを解決するためにスター型にし、その中継点として Mediator を設置しました、という流れが必要。
フルコネクト型を選択するならば、Observer を進める。
スター型なら Mediator になる。
867 :
デフォルトの名無しさん :2010/09/19(日) 12:35:04
みなさんどうもっす。まとめると オブジェクト間に互いの情報を直接知らせない(参照させない) 複数のオブジェクトを協調させて、ひとつの仕事を実行させる 仕事が増えたら別のmediatorを作る って感じですかね。言われてみるとメンバが増えまくるのはオカシイですね なんとなくつかめてきたような気がします
> 言われてみるとメンバが増えまくるのはオカシイですね うん、そうそう。増えまくって、特定のインスタンスではなく、 特定の型に対して処理するんなら、 mediator以外の方法がマシに見えてくる。 他のやり方で抽象化できそうに見えてくる。
869 :
デフォルトの名無しさん :2010/10/04(月) 00:32:35
質問です。 Visitor パターンで、Acceptor が膨大で Visitor 側が肥大化するのを何とかする方法ってありますか? もしあれば、その方法を伝授いただきたいです。
>>869 Visitorパターンは、各々のAcceptorが具体的にどのように処理されるかを意識することなく、
Visitorに一元管理させるものなので、肥大化を防ぐことはできません。諦めてください。
と、回答しただけではひどすぎるので、一応妥協案を。
例えば、各々のファイル拡張子をAcceptorにすると、Visitorは相当肥大化するでしょう。
しかし、ファイルは、テキスト、画像、楽曲、動画のようにある程度グループ化することができます。
グループごとにVisitorを作れば、多少肥大化を防ぐことはできるでしょう。
Acceptメソッドに渡すVisitorオブジェクトの検索は、Acceptor - Visitor間のlook-upテーブルをもつLocatorクラスを用意しておけば良いでしょう。
Java風に書くとこんな感じ
class VisitorLocator {
HashMap table;
public Visitor lookup(Class acceptorClass) {
return table[acceptorClass];
}
}
look-upテーブルの初期化は、派生クラスで行うもよし、依存性を注入するもよし、お好きにどうぞ。
Visitorつかうには、データが再帰的処理できるような構造を持っていることが前提ですよね?
MVCに関しての質問です。 wikipediaのMVC項目、「MVCのシナリオ」で、下記の疑問をもちました。 ・Vにイベントハンドらを関連付ける人はこのモデルの上位に当たるオブジェクトが担当する? ・Cはオブザーバー的な役割を持っている? ・VはMを参照として持っている?なのでVが直接Mからデータを参照するのだろうか? ・Cは入力のオブザーバー的な役割のようだが、出力は担当しないのだろうか? 記事の下部にありますシナリオですが、 私としては以下のように読み取りました。 1. ユーザがviewに入力を行う 2. viewからの入力により、Vに登録したcontrollerのイベントハンドラやコールバック等がよばれる。 3. controllerが必要に応じたmodelのメソッドを呼び、ステータスを更新する。 4. 3の結果を表示する為にviewがmodelから必要なデータを取得し出力する。 また、概念図では相互残照を行っているように見受けられます・・・。
876 :
デフォルトの名無しさん :2010/10/13(水) 13:44:17
>>876 調べていくために必要なメソッドさえあればデータごとに逐一書いてもできるよってことかな?
Visitorってダブルディスパッチの高尚な呼び方じゃねーの?
879 :
デフォルトの名無しさん :2010/10/13(水) 14:13:51
違うよ
Visitorの流れで質問させてください。
今ググると最初出てくる
ttp://www.aerith.net/design/Visitor-j.html でVisitorが集合を扱うパターンのように書かれてますけど、
Visitorってダブルディスパッチが本質で、集合を扱うのは関係ないと思うんですけど間違ってます?
現に、wikipediaの方では集合なんて一切出てこないし。
どうなんでしょ?
>>878 ダブルディスパッチがない言語でダブルディスパッチを実現するためのパターンだと思いますけど違いますかね?
>>880 レスありがとうございます。
さっそく読んでみます。
>>880 MVCのついでに
DCIの参考書も紹介してください
MVCってそんなにいいデザパタかな? viewが圧倒的にでかいし、modelなんてあんまりいらないどころか、変に冗長なコードを 正当化するようで害の方が大きい とか、正直思うんだが。
別に使う必要が無ければ使わなくてもいい。
886 :
デフォルトの名無しさん :2010/10/18(月) 11:37:03
>>884 それは自分が肥大化したViewを作っちゃってるだけだろ
適切なコードの場所を考えることを放棄して、なんでもかんでも
Viewに書いてしまっているという
でかい=面積比ででかい
コントロールが一番よくわからん。 何でか懐かしのDoc-Viewになっちまう。
方法にはそれぞれ適切な規模というものがある。 Document-Viewで十分まかなえているなら、無理にMVCにする必要はないと思うよ。
Cは入力をどうの、らしいんだよな。 MVCの中でハッキリしてるのはMだけ。 VはMを知らないといけないし、 VはCをも知るという。 Cも同じくVとMを知り、インプットまで受け付けるという。 rubyのまつもとさんが書いた図(俺はこの図が一番シックリくる): (アウトプット)→ユーザ→(インプット) ↑ ↓ 「 V 」←→「 C 」 ↓ ↓ →「 M 」←
VとCがちょっけ・・・つ?
MVCのモデル図だと、MがVに値を渡しているような感じで矢印がむいてるけど、 このやじるに違和感をおぼえるんだよな。 M←→C←→Vで、Cが橋渡し約の方がMがVに直接値を渡すよりよいとおもうんだけどな。
Javaでグローバル変数が使いたいから、Singleton使っているけど、 この使い方ってあまり良くないの?
ショートカット目的のシングルトンはクソの山です。
グローバル変数使いたくないから使わないっていうのも なんだかなぁって感じ
>>896 singleton使って、DB接続のような外部リソースにアクセスさせたいというような用途なら、辞めといたほうがいいと思うよ。
unit-test frameworkで、テストしずらくなるから。
900 :
デフォルトの名無しさん :2010/10/26(火) 02:47:53
シングルトンはメインウィンドウとか描画デバイスとかそのへんで使うかなぁ まあそれにしてもファイルローカル変数でいいかって感じだし ほんとうに使いどころが見つからないよねシングルトン
NullObjectとリソースプールになら使ってる>シングルトン
>>895 はMVPだな
ModelとViewが明確に分離されるのが特徴で
最近ではMVCよりも評価が高い
>>903 MVP・・・そんなのもあるのか。
ちょっと調べてきます。
ちょっと調べてみたら、最近はPMとかMVVMなんてのもあるんだね
MVCパターンの例を作ってみた。
Webのアレではないので注意。
とりあえずC++で書いてみたが見えるか?
http://codepad.org/0fr9ZZRh やってることは簡単なイメージビューアだ。
Controller::Applicationというコントローラに
ウィンドウやボタン,イメージビューを持たせている。
View::Imageはモデルとしては、Model::Imageしかとらないが
ここでは、Model::Imageの実装であるModel::ImageSeekListを
渡している。
Model::ImageSeekListは1枚の画像のように
見せかけるが、実際は画像のリストで、Next,Previousが
呼ばれると別の画像になったかのように振る舞う。
また、Next,Previous他Set〜が呼ばれると対応するビューに
Updateのメッセージが伝播される。これによりモデルの
更新だけで、ビューが最新の状態に書き換わる。
今回のコードでは書いていないが、ビューがTextBoxなんかのとき
ビューに文字入力があるとそれに登録されたモデルが更新される形式がある。
そのような方式をプラガブルMVCというそうな。この形の場M-VCという構造に
なるんだそうな。
>>906 ImageとImageSeekListのあたりが工夫なんだろうけど
とりあえずこんな設計はねぇよ
908 :
デフォルトの名無しさん :2010/10/27(水) 13:02:14
>>907 付けなくていいスマポにCONST付けたり
Controller::Applicationで親クラスに
モデル渡してなかったりとコーディング上には
粗があるが、設計で問題あるか?
まぁこういう作りはあまりみないけど。
>>908 一言で書けば、必要のないパターンを無駄に使っているということ。
たぶんCompositeの応用のつもりだろうけど、もともと階層構造になっていないものに
適用しようというのに無理がある。
こういう不自然な設計をしていると分かりづらく、仕様変更にも弱くなる。
例えばビューアの下にサムネールのリストを表示させたくなったとして、この設計だと
メインの画像と一貫性のある方法では実現が難しい。
そもそも『簡単なイメージビューア』と書いているように、とてもシンプルな例のはず。
トリッキーな事をする必要は全くないし、MVCの例としてならなおさらするべきじゃない。
910 :
907 :2010/10/27(水) 22:04:00
>>909 へー。
でも、この例だと
1,サムネール追加するんならサムネールビュー追加する
2.Model::ApplicationのからImageListを取得できるようにする
3.Model::Application内でImageListとImageSeekListを結合
4.サムネールビューのアクションで送られてきたIndexをImageSeekListのJumpに引き渡す
これだけで改修済むけど。メンテナンス性悪いか?
改善案があればおせーて。
>>910 "一貫性のある方法"では難しいと書いたんだけどな
910の改修でのやり方がまぁ普通の方法だが、メイン画像の方法と比べて一貫性があるかどうか
もう一度よく考えてほしい(単体とコレクションの違いは別として)
>>912 んー。Model::Applicationとしてアプリケーション固有部分を
ぶち込んでるところ?
Model::ImageとModel::Applicationが階層になっていると。
今の構造だと、Model::Imageに位置するモデルにも
さらに中にモデルを持たせてるよ。複数のビューを
まとめて作った再利用可能なビューにモデルを引き
渡すためにね。ビュー自体が階層構造になってる。
これがヤバいの?
914 :
913 :2010/10/27(水) 23:23:45
補足。 Model::Application自体は使い捨てのモデル。 Controller::Applicationも使い捨て。 1つのアプリケーションにつき1つのみ。 その中に入ってるモデルは再利用可能なんだけどね。 ビューのUpdateによる更新プロセスを一般化させたくてしてる。
>>913 なんかあんまり通じてないな。
ずっとImageとImageSeekListについてだけ書いていたんだけど。
とにかく言いたいことは(※ImageとImageSeekListについて書いた)909だけで、
要するに何でそんなに無駄に複雑にしてるのか?ってことだけだ。
>>915 ImageSeekListなんかにせず、ImageList使ってアクション起きたら
単純にビューに差し込めってこと?
917 :
916 :2010/10/28(木) 00:13:28
言葉足らずだったので書き直します。 ImageSeekListなんか使わず、ImageList使ってアクション起きたら 単純にImageList内のImageをビューに差し込めってこと? ※そうすると、indexの管理をコントローラーがする事になるよね?
>>917 いや、Imageを継承するなっていうだけ
910のサムネイル画像と同じように単純に取得メソッドを設ければ済む話
>>918 ああ、ImageSeekListにGetImageを持たせるのか。
なるほどね。
920 :
919 :2010/10/28(木) 00:55:35
問題点を整理するとこうか。 例えばImageSeekListのNextが呼び出される。 すると今までは、ImageList[index]のImageの メンバーを全て移譲してビューに見せていた。 (Imageが変更を受けると移譲を構成しなおす必要がある) GetImageを使う事になると、ビューとImageSeekListで 共有用のImageを一つ持っておく。んで、ImageSeekListが 変化した場合は、共有用Imageを上書きしてやる。 (Imageに複製用関数を用意しておけばImageメンバの整合性に ついて面倒をみずに済む)
「Imageが静的な画像を表す」ってが根底にあって、ImageSeekListで動的に切り替えることが可能ってことにしたの? そもそも論だけど、システム全体でImageが静的な画像を表すのを前提にしていたら、 ImageSeekListでnext呼んだら画像が変わって、その変わった画像の「更新」をシステム全体が対応しないといけないよな これは考えてた? 逆にImageが動的な画像を表せたり、画像の更新がシステム全体で対応しているなら、 そもそもImageとImageを扱うこと自体がImageSeekListの様なものであって 新たにImageSeekListを作り直すのがわからね
まあ動けばいいんですけどね!
>>921 ん?よくわからんな。
Image自体は、書き換えられるオブジェクトだよ。(具体的には線を書き込めたり)
静的動的ってのはそういう意味?まさか動画とかって意味じゃないよね。
Imageが変更されると、関連付けられたビュー全てに更新メッセージが飛ぶ。
さらに、モデル内で依存しているものも存在するのでそっちにも更新メッセージが飛ぶ。
システム全体の更新ってこういうことだよね?
>そもそもImageとImageを扱うこと自体がImageSeekListの様なものであって
>新たにImageSeekListを作り直すのがわからね
ここの意味がよくわからない。
作り直すってのは、ImageSeekListがImageの継承をやめる事を言ってるの?
Imageの中で閉じろという意味だろ 元々の設計がおかしいということ
Imageの中で閉じろという意味だろ 元々の設計がおかしいということ
どうでもいいことなのに2回書いてしまった 吊ってくる
>>924 意味が分かったなる程ね。
そうすると単純な静的画像にも
動的動作可能な機構が付くわけだ。
View::Imageがツールバーとかの切り替わらない画像に
使われたら無駄な気がするがどうなんだろ。
ま、その場合MVC機構事態もデッドウェイトだけど。
928 :
906 :2010/10/28(木) 21:36:44
色々指摘された点を踏まえて改修してみた。
あと、コントローラーの中にビューの実態があるのが気に入らなかったんで
外で結合するようにしてみました。ぱっと見、Smalltalkの原点回帰ぽい。
この修正で、ControlerをViewに継ぎ足すだけで既存の動作を再利用
できるようになったように思う。
http://codepad.org/uRylNEZ9 ただ、ここで一つ悩みが。Viewの構成メンバはSet、Get両方つけるべきか?
Setをつければ、Set〜を呼び出すコントローラでビューの切り替えが出きるようになる。
果たしてコントローラーがそんな事していいのか?あと、ビューの構成が変わった時
同じビューの一部を参照している別のコントローラーはどうすべきか?
モデルと同じく、ビューの構成が変わったら、参照しているコントローラー全体に
Updateのメッセージを送信すべきなのか?
907だけど、なんで余計おかしくなってんだよ…
>>921 や
>>924 の言ってることもよく分からない
>>928 であってるの?
ImageにSetImageListとかNextとかありえないだろ
これなら最初のコードの方がずっとましだ
俺もスレだけ読んでて今初めてソース見たけど、 これならMVCを全く意識せずに書いた方がシンプルなコードになりそうだ。
931 :
906 :2010/10/29(金) 01:12:32
>>929 SetImageListをそのままImageにもって行ったのは俺が悪いわ。
たぶん
>>921 とかの意見に合わせるならFileListとかFilePathListとか
データソース系になるんだろうと思う。あと、動的に画像を生成するオブジェクトとか。
そもそも、ImageSeekListの中身を機能をImageに統合したのは自分でも
正しいかよくわからん。言ってるからしてみただけ。
>>907 の当初の意見で修正してみた。多分反映できてると思う。
http://codepad.org/E4gqIFxA で、問題はビューなんだよビュー。ビューの中に突っ込んだモデルの管理とか
どうすんの?ビューの中にコントローラーから別のビュー突っ込まれたら、
親のビューが差し込まれたビューに自分のモデル差し込み直すのか?
それとも、コントローラーであらかじめモデルを突っ込んだビューを作って
ビューに突っ込むのか?
結局子ビュー管理は生産から廃棄まで親ビューが面倒みるしかないんじゃないか?
どうなんだ?
rubyやってるとC++なんかでよくやるわって思えてくる
だからImageを継承するなって まぁこれは書きミスだろうけど、よく見るとなんか全体的におかしいな 始めの指摘が重箱の隅に見えるわ あと今更だけどSystem::ModelとかSimpleVC, Share, Sharedって何? C++は詳しくないんだけど標準的に用意されてる機構なの?
>>935 ああ済まんImageは消し忘れ
ShareとSharedも表記揺れミス。
Sharedはboost::shared_ptrで良かったんだけど
一度使ったらboost好きの奴らからboostのアレ使えこれ使えって
余計なレス付きそうだったからやめてた。
SimpleVCとかSystem::Modelとかは勝手に書いた。
実装上整合性を保つのに必要だったからね。なにも継承しない
クラスがメンバーに無い関数を呼べるのは不自然だしね。
一応この管理系のクラスには実際に動く自作コードがあってそれを元にしてる。
そっちじゃ管理系のクラスは全部MVCって名前空間に入ってるけど。
>>935 MVC管理系クラスの宣言codepadに上げようか?サンプルコードの本位から
外れるけど、なんなら実装部まで上げようか?
あとboostに書き換えられるとこも書き換えるか?
>>936 ,937
「サンプルコードとは…」というとこから始めなきゃ駄目か?
こういっちゃ何だけど、MVCだのデザインパターンだのという以前の問題
GoF本も読んでいないか、読んでも理解できないだろ
もうちょっと勉強してこい
今はこれ以上続けるつもりはないよ
・・・とバカ糞が申しております
>>938 そうね未知なものいれちゃいかんね。
あと、理屈が完成までいってないもんサンプルと言うのも無いね。
スマンかった。
MVCってGoFじゃなくね?
少なくともGoF本にはMVCパターンというものは存在してないね。 MVCはデザインパターンというよりアーキテクチャパターンの一種だから。 というか、xxxパターンというのは(UMLと同様な)共通言語という方便にすぎないものなんだから、 「パターンに沿っていないから(私には)議論できません、(私は)議論に参加しません」というのは、 まあ、何と言うかアレだね....。
943 :
デフォルトの名無しさん :2010/10/30(土) 09:56:01
MVCはGoFを組み合わせて応用したものだからGoFと言えるような言えないようなそんな感じ
>>942 「パターンに沿っていないから(私には)議論できません」って何だよ。どこからそんな話が出てきた?
パターンに沿ってないならスレ違いだろ。
確かにスレ違いでは有ると思うが、 それを許容するか否かは別の問題。 許容する人だけがレスをつける。
GoFもMVCを組み合わせて応用したものだからMVCといえないような言えるようなそんな感じ。
948 :
デフォルトの名無しさん :2010/10/30(土) 15:40:17
みなさんに質問なんだけど、
誰でもスレは立てられるんだよ・・・?
なんで今頃GoFが伸びてんの?
なんでだなんでだろー
952 :
デフォルトの名無しさん :2010/10/31(日) 11:09:38
ひょっとしてデザインパターンってテンプレートとかでライブラリにするようなものじゃないんですか?
↑デザインパターンの由来って知ってる?
設計パターンとでも訳せばこの手の勘違いは減っただろう
機能側の例でループ処理でインターフェースの呼び出しとかしかやってないから身に付かないんだよな。。。
テンプレートメソッドパターンなんだけど、一部の子クラスで定義する テンプレートメソッドに共通の処理をあとで加えたくなったんだ。 こういうときどうするのがいいのかなぁ。 class P { abstract function f(); } class C1 extends P { function f() { } } ... とりあえずぱっと思いつくのは中間にMというクラスをはさんで 必要な子クラスのfの定義をgに置き換えていくというのだけど abstract class M extends P { function f() { 共通の処理 g(); } abstract function g(); } class C1 extends M { function g() { } } なんかもっとうまい書き方ないかな。
>>956 まぁ、それが妥当じゃない
必須ではないが、Template Meghodを適用するときは、
interface I {function f()}
abstract class A implements I {
override function f() {
// 共通処理を書く
this.f_sub();
//共通処理を書く
}
abstract function f_sub();
}
class C extends A {
override function f_sub() {
// 固有の処理を書く
}
}
みたいにすると、つぶしが利きやすくなるよ
リファクタリングをしていて、グローバルな設定を保持するクラスを見つけました。 これを引数にして3階層程引きずっていたので、Singletonにしようと思ったのですが、 .getInstance()を必要になったクラスそれぞれで呼ぶ必要があります(当然ですが)。 結合度を何とか下げられないかと考えているのですが、 何か妙案があれば教えていただければと思います。
データを渡すってことは、データと処理が離れてるってことで、 ひょっとしたらその処理は、もっとデータ側に持たせたほうが自然かもしれないね。 設定オブジェクト、みたいなものってどうしても出来てしまうけど、 やっぱりそれって、使いにくくていろいろ足引っ張ってる。妙案は…思いつかない。
960 :
958 :2011/01/27(木) 22:48:28
>>959 ありがとうございます。
>ひょっとしたらその処理は、もっとデータ側に持たせたほうが自然かもしれないね。
理想としては設定の粒度を細かくして、ドメインオブジェクトとして見ることだと思います。
ただ、こういう設定管理系は、いったんそれが出来てしまうと、
便利な箱のような扱いになってしまうことが多いですし、
といって、そこの改善に注力してしまうのも大げさではないかと思ってしまうのも事実です。
時間があれば突き詰めたい部分ではありますが、
今更俺俺フレームワークを作ってもなぁというのもありますし。
visitorパターンの本質って何でしょうか? ダブルディスパッチは関係ない気がしました
switchが整数値で分岐するのに対し、visitorは型で分岐する。 型を整数で表せばswitchが使えるが、整数で表したくないならvisitorを使う。
>>961 新幹線でワゴンの売り子さんが世話しにきてくれるだろ。
自分が行かなくても世話してくれる人が引数によって向こうからやってきてくれるのがビジターパターン。
>>962 なるほど
>>963 処理の対象が処理をしてくれるクラスを指定するみたいなことでしょうか
オブザーバーやその他の相互参照の形になる場合はどっちを強参照にするか迷う
ストラテジーパターンについてですが、 結局、どこかでif文でどのコンテクストかを判定する必要がありますよね? この判定についてほ Strategy s = StrategyFactory.create(parameter); みたいな形でファクトリーに押し込んでしまうという考えでいいでしょうか。 parameterによって、返ってくるConcrete Strategyが異なるという形です。
すみませんageます
>>966 concrete strategyを選択する処理はストラテジーパターンの範囲外。自分で決めればいい
factoryに押し込むのもアリ
それと、結局どこかでif……というのはちょっと違う気がする
concrete strategyを動的に選択する場面というのはほとんどないと思う
>>966 ちょっと大げさかもだけと、都度生成するものなら、Prototypeパターンを適用。一度生成して、使い回すのなら、Flyweightを適用すると、if文の排除は可能。
970 :
966 :2011/06/02(木) 22:05:38.02
>>968 ,969
ありがとうございます。
>それと、結局どこかでif……というのはちょっと違う気がする
すみません、僕の認識が間違っているのかも知れません。
実現したかったのは
switch (pattern){
case : Pattern.A : doA();
case : Pattern.B : doB();
...
}
において、メインの処理上からswitch文を消したかったのです。そこで、
interface MyStrategy { void execute(); }
class StrategyA implements MyStrategy... //doA()に相当
class StrategyB implements MyStrategy... //doB()に相当
としたのですが、結局、patternを判定する処理は必要になると思ったのです。
そこでファクトリークラスを作って、判定と生成を任せようと考えました。
Prototypeはどちらのcloneを用いるかを、やはり判定する必要があるように思います。
今思いつきましたが、Map<Pattern, MyStrategy>を最初にシングルトンで作っておけば、
MyStrategyMap.get(pattern).execute();
みたいな感じでいけなくもないですね。
あ、でもStrategyが増えるたびに、このMapの初期化処理をメンテする必要があるので微妙ですね。
すみません、お知恵を拝借できればと思います。
>>970 class A implements Controler{};
class B implements Controler{};
Map<Pattern,Controler> table = new Map<Pattern,Controler>();
PatternPool pool = new PatternPool();
table.put(pool.get("^private .*"), new A());
table.put(pool.get("^ public .*"), new B());
table.get(pool.match("private int value"))..action(); // Aのactionが起動
table.get(pool.match("public int age"))..action(); // Bのactionが起動
単にswitchを消したいならこういう風にできる。
これをなにパターンというのかは知らんけどな。
972 :
971 :2011/06/02(木) 22:32:00.73
AとBの実装空にしてたわ、あそこactionの実装を書いとくんな。
MapをシングルトンにしてMyStrategyコンストラクタで登録させるとかどうか StrategyAとStrategyBもシングルトンにする
>>973 安易にシングルトンを推めるな。
基本的に、interfaceと委譲で凌げる。
シングルトンは絶対にインスタンスが2つ存在しては
いけない場合のみの最終手段。
何らかの調停を行わなければならず、
それを1つのインスタンスで処理しなければ破綻する場合だ。
例えば現在アクセス中のファイルリストとか。
シングルトンからアクセス権を得たインスタンスのみ操作できるようにする。
俺はそろそろ夜食の辛ラーメンを食って寝ますよお前ら 舌が慣れてしまって全然辛いと思わなくなった ビールの〆に飲むと辛いけどただ食うと平気
>>971 最初に一回だけ初期化しといて、そこから利用してるので、lightweightか、それに類するパターンになると思う。
>>970 >Prototypeはどちらのcloneを用いるかを、やはり判定する必要があるように思います。
>
swichの所で書いてるpatternで取り出せば、判定いらなくね?
>今思いつきましたが、Map<Pattern, MyStrategy>を最初にシングルトンで作っておけば、
他の人も言ってるけど、Singletonは最終手段にしとけ。特に外部リソース(dbとか)にアクセスするのなら。モックによる入れ替えが困難になるから、テストしづらくなるぞ。
>あ、でもStrategyが増えるたびに、このMapの初期化処理をメンテする必要があるので微妙ですね。
設定ファイルに書き出すか、javaなら、特定のフォルダにあるクラス名を取得してくるとか
>>設定ファイル それって結局便利なのか? ifのほうがましだ。
979 :
デフォルトの名無しさん :2011/06/23(木) 15:38:31.08
このスレ息してないな
リファクタリングしなくてもいい良質なコードを書いているからね
ここデザパタだぞ
982 :
デフォルトの名無しさん :
2011/06/25(土) 19:02:52.45 リファクタリングw