【GoF】デザインパターン 3

このエントリーをはてなブックマークに追加
426デフォルトの名無しさん:2005/04/13(水) 12:54:51
ところで、「GoFのデザパタ本は入門書ではない。もっと詳しく知りたい人の本だ」
ってMartinFawlerさんが言ってるのを見つけたんだけど、皆さんはどう思いますか?

俺的には、経験積まないと共有知のありがたみなんて理解しようもないから、
GoF本だろうと結城本だろうと、ある程度進んでからやるべきだと考えてるけど。
(個人的学習経験としてそう思うし、また初心者に結城本教えるという無謀な試み(!)の経験で改めて実感したw

リファレンスはこのあたり
Swebok http://www.martinfowler.com/bliki/Swebok.html

>今月は IEEE による SWEBOK(ソフトウェアエンジニアリング知識体系) のレビュー月間である。
>これは、我々の専門分野についての知識体系を定義しようという試みで、ライセンス化へ向けて
>の土台となるものだ。
(中略)
>さて、Swebok のどこがダメなのか?
(中略)
>本の選出はひどくはなかった(GangOfFourを推薦図書にはリストアップしないよう私が警告したのだが)。
>(GangOfFourはさらに理解を深めたい人用である。初心者用の「参考図書」ではない)

427デフォルトの名無しさん:2005/04/13(水) 13:04:32
持っているの結城本だけど、初心者が丸暗記しそうなのが一番怖いと思う
そういう意味ではある程度経験積んだ人用の概念かもしんない
428デフォルトの名無しさん:2005/04/13(水) 13:06:16
結城本はGoFパターンの雰囲気をわかりやすく伝えているのに対し
GoF本は個々のパターンの長所短所を分析しているような印象。

だから、デザパタ/OOP初心者に薦めるんだったら結城本。GoF本は薦めない。
>>426の初心者ってプログラミング初心者だよね?
429デフォルトの名無しさん:2005/04/13(水) 13:46:19
初心者がGoF本を理解できるのなら、天才と呼んであげよう
430デフォルトの名無しさん:2005/04/13(水) 15:47:54
>>429
天才と呼んでくれ。初心者だが、GoFの内容がスーッと頭に入ってきた。
431デフォルトの名無しさん:2005/04/13(水) 15:49:57
>>429は早く天才と呼んであげるように
432デフォルトの名無しさん:2005/04/13(水) 16:13:22
>>426
その訳文は、某所の超意訳だろw 釣られたなw

ファウラーは、そのblogにはそんなこと書いてないよ。
http://www.martinfowler.com/bliki/Swebok.html
The choice of books it came up with wasn't awful - although I was alarmed that GangOfFour didn't make it to the recommended list.
(It's in the secondary 'further readings' but not in the primary 'Recommended References' section.)
「(Swebokに)載ってる本の選択はそんなに悪くなかった -- GoF本が推薦リストには載らなかったけど。
 (GoF本は、重要度が高い『お勧め参考文献』の章じゃなくて、重要度が一段低い『もっと詳しく知りたい人のための参考文献』の章にあったw)」

GoF本良いけど難解つうてんのはこっちだなw
http://www.martinfowler.com/bliki/GangOfFour.html
433デフォルトの名無しさん:2005/04/13(水) 16:43:17
http://www.martinfowler.com/bliki/GangOfFour.html

>漏れの汁限り、GoF本はこれまで出たOO設計本の中で最高っす。
>つか、たぶんどんなタイプの設計の本と比べても、最高!!!
>ソフトウェア業界にも、無茶苦茶影響与えてるし。まぁJava /.NETのライブラリなんて、
>GoFが作ったプールの中でパチャパチャ泳いでるようなもんだw

>なーんて褒めてみたけど、決して読み易い本ではない罠。
>OO設計の基本原則わかって、「OOえぇなぁ〜♥」って感じるようになってから、初めて嫁。
>そこらへん判ってからじゃないと、この本の真価を読み取るのは無理。つか無理して読んでも無駄。
>つか、そこらへん判ってからなら、努力して読めば、努力に応じたごりやくの得られる良書っす。

>コード例はほとんどC++だけど、C++判んないからって焦る必要はなっしんぐ。
>コード例は、C++の判りにくい機能は使ってないから、C言語さえ理解できりゃ判るようになってるって。
434デフォルトの名無しさん:2005/04/13(水) 16:45:43
>>428
プログラミング初心者、OO初心者、両方の意味っす。
結城本は、クリープを欠いたネスカフェって漢字。
435デフォルトの名無しさん:2005/04/13(水) 17:41:17
>>433
それってファウラーの文章を翻訳したもの?
もしそうなら書いてる内容は2ちゃんねらと大してかわらないな。

何か言ってるようで何も言えてない。ていうか、要約すると3行
になるw

スゲー(・∀・)イイ!!
でも、読み易くはない(´・ω・`)ショボーン
コード例はC++だけどCが分かればダイジョウV
436デフォルトの名無しさん:2005/04/13(水) 20:14:07
いや、ちゃねらー言葉にほんにゃくしただけだってばw

もうちょっとまともな訳でファウラー大先生のありがたい御託を読みたい方は、こちらへドゾー(他は多分に意訳が激しいけど、この項目はまとも)
 http://capsctrl.que.jp/kdmsnr/wiki/bliki/?GangOfFour
437デフォルトの名無しさん:2005/04/13(水) 21:31:42
>>436
まともな翻訳でもやっぱり大したこと言ってない。
凄くいいけど読むには経験が要る。
サンプルはC++だけどCが読めれば大丈夫。
今度は2行で要約できちゃったよw
438デフォルトの名無しさん:2005/04/13(水) 22:14:07
>>437
blogってふつー、そーゆーもんだろ。
もしかしておまいのblogは、受けを狙って書くのかw

つか、マーチンの追っかけやってるアフォもどうかと思うが、
脳みそが2ちゃんでいっぱいいっぱいの>>435-437みたいなのは論外の外だなw
439デフォルトの名無しさん:2005/04/13(水) 22:16:52
つか、ここでレスしてる人って、マジ英語のblog読めないの?

それ、まずいよ。翻訳屋に騙されっぱなしじゃん。技術者としては、能力75%落ちって感じかw
440429:2005/04/13(水) 22:33:36
遅くなってスマン
>>430
君は天才だ
馬鹿と紙一重だ
441デフォルトの名無しさん:2005/04/13(水) 23:44:50
>>438
blog=日記という意識ならそうかもね。
けれども、少しでも書評という意識があったとしたら、この人の
書評には読むべきところがないね。
まぁ、それだけのこと。俺が褒めなくても、他に褒めてくれる信
者を一杯持ってる人なんだから、どうでもいいんじゃね?
442デフォルトの名無しさん:2005/04/14(木) 08:59:53
いやblogは日記だろ、リンク付きの
そこを否定は変だぞ
443デフォルトの名無しさん:2005/04/14(木) 09:01:37
誰でも褒められりゃ少しはうれしいだろうけど、
blog ってかならずしも誰かに褒められるために書くわけじゃ無し。
444デフォルトの名無しさん:2005/04/14(木) 10:30:00
まぁ、ブロガーは120%受け狙いで日記書くわけだがw
445デフォルトの名無しさん:2005/04/14(木) 12:17:42
吉野家コピペとかって、多分最も受けた部類に入るんだろうけど、
書いた人間が狙ってたかどうかは・・・?
446デフォルトの名無しさん:2005/04/14(木) 14:58:09
奈良のおばちゃんは、受け狙ってたわけではないが、
一部ではかなーり受けてる
447デフォルトの名無しさん:2005/04/14(木) 17:01:21
ギャラリーを意識していない女の日記はギリギリ存在を許容できるが
ギャラリーを意識していないブログは存在自体が有害。
中身ないくせしてシャクレタ単語だけは入れたがるから、無駄に検索
に引っ掛かる。
読ませる気がないのなら、人目につかない場所でひっそりとやってほ
しいもんだ。
448デフォルトの名無しさん:2005/04/14(木) 17:12:38
どうでもいいからデザパタについての話をしてほしい。
449デフォルトの名無しさん:2005/04/14(木) 22:34:26
デザパタおんりーつうのはイマドキつらいもんがあるね。
ドメイン・パターンとか、いろいろ扱うべきテーマがあるでしょ
450デフォルトの名無しさん:2005/04/15(金) 08:40:15
奈良のオバチャンは扱うべきテーマか?
451デフォルトの名無しさん:2005/04/16(土) 18:10:43
Eriv Evansが Domain-Driven Design であげてる基本パターンは、
どうなんだろう?

頭が弱い人が見たら、あれ UMLとかOOの基本並べてるだけに見えちゃうんだろうなぁ。
452デフォルトの名無しさん:2005/04/18(月) 06:44:06
今頃デザインパターン云々いってる奴 = 今頃たまごっちに夢中になってる奴
453デフォルトの名無しさん:2005/04/18(月) 08:39:08
バカはすぐ調子にのる
454デフォルトの名無しさん:2005/04/19(火) 01:54:35
455402:2005/04/21(木) 01:22:25
以前、Interpreterパターンについて書き込みした人です。

本を書いた本人に聞いてみました。

>>402 のような場合では、BNFを変形するということで良いそうです。
文法どおりにコーディングすることが重要であって、
文法が変わらなければ、BNFを変形すること自体はオーケーだそうな。
456デフォルトの名無しさん:2005/04/21(木) 11:44:53
良し悪しではなく、趣味の問題、最適化の問題じゃないか、と。
デザパタの話題とは丸きり関係ないじゃねぇか、と。
457デフォルトの名無しさん:2005/04/25(月) 16:28:14
・再帰下降/LL文法でバックトラックするか、
・LR文法でトークン先読みして、当てはまるBNF式を選択
すりゃ解決・・・って言語処理系の教科書ネタだよな。

458デフォルトの名無しさん:2005/04/27(水) 21:00:13
・状態がA、B、Cとあり、それぞれで振る舞いが変わる
・A、B、Cとも共通の変数を「たくさん」扱う
・振る舞いが変わると言っても、影響範囲は一つか二つの関数程度である

こんな時に、分かりやすくするための良い設計が有ったら教えて頂けないでしょうか

今やっているのは、stateパターンにして「たくさん」を一つの構造体にまとめ
各state->func()に引数として渡すやり方ですが、引数のためだけにまとめるのは、どうも妙な気がします。
459デフォルトの名無しさん:2005/04/27(水) 21:14:54
こんな感じ?
派生クラスのdoProcessで状態別の違いを吸収。

class StateBase {
  int val1, val2, val3, val4;
public:
  virtual doProcess() = 0;
};

class StateA : public StateBase{ public: doProcess(){ 実装}:};
class StateB : public StateBase{ public: doProcess(){ 実装}:};
class StateC : public StateBase{ public: doProcess(){ 実装}: };

460デフォルトの名無しさん:2005/04/27(水) 21:19:24
StateBaseが持ってる「たくさんの変数」はprotected:で。
461デフォルトの名無しさん:2005/04/27(水) 21:20:15
あ、ごめん共通の変数ならstaticもつけなきゃだめだ。
462458:2005/04/27(水) 21:24:36
>>459
申し訳ないです。そのやり方だと、val1〜val4が
StateA、StateB、StateCでそれぞれ独立して存在してしまい
「共通の変数」では無くなってしまいまして。

val1〜val4をStateBaseでstaticにするほどじゃないのが、悩みどころで困っています。

とはいえ例付きでのレス、ありがとうございます。
463458:2005/04/27(水) 21:25:41
書いているうちに内容がかぶってしまいました、すいません。
464デフォルトの名無しさん:2005/04/27(水) 23:14:07
>val1〜val4をStateBaseでstaticにするほどじゃないのが、悩みどころで困っています。

Singletonでしか使えないな。ワラ
465デフォルトの名無しさん:2005/04/27(水) 23:57:35
これ俺も良く似た状況に遭うけど難しいよな
クラスでの共通変数じゃなく、インスタンスのまとまり毎に扱いたい共通の変数な
464も言っているが、staticにしちゃうとSingletonでしか使えないし
466デフォルトの名無しさん:2005/04/28(木) 00:38:49
その共通変数のまとまりを構造体なり、クラスなりにまとめて、
その「変数の塊クラス」のインスタンスを、それが必要なオブジェクトで共有させればいいんじゃないの?
467デフォルトの名無しさん:2005/04/28(木) 00:41:20
> 引数のためだけにまとめるのは、どうも妙な気がします。

にループ
468デフォルトの名無しさん:2005/04/28(木) 00:41:51
なんでメンバ変数がstaticだとシングルトン限定になるんだ?
普通に、インスタンスで共有できるんじゃないの?
469デフォルトの名無しさん:2005/04/28(木) 00:55:25
>>468
Stateのクライアントとなるインスタンスが
2つ以上あるだけで破綻するから
470デフォルトの名無しさん:2005/04/28(木) 01:52:12
>>466
俺も普通にそうしてる。
共有される変数を一つのオブジェクトとして扱うのは自然な事に
感じるんだが・・・・・・
471デフォルトの名無しさん:2005/04/28(木) 02:05:39
でもそれって見事に実装の都合から設計しちゃってるよな
472デフォルトの名無しさん:2005/04/28(木) 02:09:24
contextとかいう名前の変数にして引数で連れ回すか、
全体を統括するなんかクラスをもうけて連れ回さなくて済む
ようにするか。

473デフォルトの名無しさん:2005/04/28(木) 07:43:17
stateパターンなら「共通の変数」は、
それを保持する為のクラスを作る。

で doProcess() の引数にする。

class Context {
public:
int val1, val2, val3, val4;
StateBase* currentState;
};
class StateBase {
public: virtual void doProcess( Context* ) const = 0;
};
class StateA : public StateBase {
public: void doProcess( Context* ) const;
};
class StateB : public StateBase {
public: void doProcess( Context* ) const;
};

staticなクラスメンバ( 本質的にグローバル変数 )なんて使うと、
「状態を持つもの」が2個3個と増えたときすげーこまる。
474473:2005/04/28(木) 07:46:46
あれ?なんか、俺の周りだけ時空が遅れているようだ
475デフォルトの名無しさん
stateオブジェクトの構築時にcontextを引数で渡してやれば
stateのメソッド呼び出しの時に渡してやる必要はないね。