web-dev-qa-db-ja.com

設計パターンの研究方法

デザインパターンに関する4〜5冊の本を読んだことがありますが、それでもデザインパターンの中級レベルに近づいたとは感じませんか?

デザインパターンの勉強はどうすればいいですか?

デザインパターンの良い本はありますか?

私はこれが経験によってのみ来ることを知っていますが、これらを習得する方法があるはずです?

352
anand

最善の方法は、それらを使用してコーディングを開始することです。デザインパターンは素晴らしい概念であり、それらについて読むだけでは適用するのが困難です。オンラインで見つけたサンプル実装をいくつか取り、それらを中心に構築します。

素晴らしいリソースは Data&Object Factory ページです。それらはパターンを調べ、概念と実世界の例を提供します。彼らの参考資料も素晴らしいです。

195
Joseph Ferris

私は3冊の本を読みましたが、まだOReillyの Head First Design Patterns を読むまで、パターンをあまり理解していませんでした。この本は私の目を開き、本当によく説明しました。

alt text

203
Darren C

そのような古い質問に対する私の2セント

一部の人々はすでに言及し、実践し、リファクタリングしています。パターンについて学ぶ正しい順序はこれだと思います:

  1. テスト駆動開発(TDD)を学ぶ
  2. リファクタリングを学ぶ
  3. パターンを学ぶ

ほとんどの人は1を無視し、多くの人は2ができると信じており、ほとんどの人は3のためにまっすぐ進みます。

私にとって、ソフトウェアスキルを向上させる鍵はTDDを学ぶことでした。長い時間をかけて痛みを伴い、コーディングが遅くなることもありますが、最初にテストを書くことで、コードについてよく考えるようになります。クラスに必要な定型文が多すぎる場合や簡単に壊れる場合は、悪臭にすぐに気づき始めます

TDDの主な利点は、コードのリファクタリングへの不安をなくし、高度に独立したまとまりのあるクラスを書くことを余儀なくされることです。適切なテストのセットがなければ、壊れていないものに触れるのは苦痛です。セーフティネットを使用すると、コードを大幅に変更することができます。それはあなたが本当に練習から学び始めることができる瞬間です。

パターンについての本を読まなければならないようになりましたが、私の意見では、一生懸命努力するのは時間の無駄です。類似したことに気づいた後、パターンを本当によく理解したか、既存のコードにそれを適用することができました。安全性テストやリファクタリングの習慣がなければ、新しいプロジェクトができるまで待ちました。新しいプロジェクトでパターンを使用する際の問題は、作業中のコードにどのように影響を与えるか、または変更するかがわからないことです。ソフトウェアパターンを理解したのは、コードをリファクタリングしてからコードの1つにリファクタリングした後です。

85
SystematicFrank

Derek Banasは、私が大好きなパターンをデザインするためのYouTubeチュートリアルを作成しました。

http://www.youtube.com/playlist?list=PLF206E906175C7E07

彼らは少し時間が短いかもしれませんが、彼のタイミングとプレゼンテーションは学ぶことをとても楽しくします。

59
Pedro Duarte

練習、練習、練習。

チェロを何年も演奏することについて読むことができますが、それでも楽器に弓をかけて音楽のような音を出すことはできません。

設計パターンは、高レベルの問題として最もよく認識されます。有用であると認識するために必要な経験がある場合にのみ関連するもの。それらが有用であることを認識するのは良いことですが、それらが適用される状況、または適用された状況を見ない限り、それらの真の価値を理解することはほとんど不可能です。

それらが有用になるのは、他のコードで設計パターンを認識するとき、または設計フェーズでパターンにうまく適合する問題を認識するときです。そして、正式なパターンを調べ、問題を調べて、それらの間のデルタが何であるか、そしてパターンと問題の両方について何が言っているかを判断します。

それは本当にコーディングと同じです。 K&RはCの「バイブル」かもしれませんが、カバーツーカバーで何度も読んでも、実際の経験は得られません。経験に代わるものはありません。

35
Paul Sonier

練習練習練習。 4冊から5冊の本は、ある程度の練習をしなくても、過度に読む練習になると思います。これを行う最良の方法は、パターンを使用して現在のプロジェクトのリファクタリングを開始することだと思います。または、積極的に取り組んでいるプロジェクトがない場合は、独自の方法で実行し、パターンにリファクタリングしてみてください

あなたが彼らが解決する問題に苦しんでいないなら、あなたはそれらを完全に評価することはできません。そして、それらは特効薬ではないことを覚えておいてください-それらを暗記し、その場で適用するために強くプッシュする必要はありません。私の2セント。

25
utku_karatas

次の質問を自問してください。

彼らは何をしますか?

彼らは何を分離/結合しますか?

いつそれらを使うべきですか?

いつ使用しないのですか?

どの言語機能が欠けていると、それらは消えてしまいますか?

それを使用することでどのような技術的負債が発生しますか?

仕事を終わらせる簡単な方法はありますか?

14
gtrak

あるパターンが解決する問題と、問題が実装された他の(より悪い)方法を理解するまで、いくつかのパターンの利点を理解または理解するのは少し難しいことがわかりました。

GOFとPOSAの本を除いて、私は実際には何も読んでいませんので、私はあなたに他の推薦をすることはできません。本当にあなたは問題の領域を理解する必要があり、多くの経験の浅い開発者はパターンの利点を理解できないかもしれないと思います。これは彼らにとってわずかではありません。貧弱な代替案と最初に闘わなければならないとき、良い解決策を受け入れ、理解し、評価することはずっと簡単です。

がんばろう

8
Tim

たくさんの良い例が挙げられています。私は1つを追加したいと思います:

それらを誤って適用します。これを意図的に行う必要はありません。最初のデザインパターンフィットでそれらを適用しようとすると発生します。その間、表示されるすべての問題は、1つの設計パターンにちょうど収まるように見えます。多くの場合、問題はすべて何らかの理由で同じ設計パターンに当てはまるようです(Singeltonが主な候補です)。

そして、あなたはパターンを適用し、それは良いでしょう。そして数か月後、コード内の何かを変更し、その特定のパターンを使用するのはそれほど賢くないことを確認する必要があります。コーナーに自分をコーディングし、再度リファクタリングする必要があるからです。

確かに、これは実際に21日間で学ぶことのできる答えではありませんが、私の経験では、この問題について十分な洞察を得られる可能性が最も高くなります。

8
Joachim Sauer

Allan Shallowayによる「デザインパターンの説明」を読んでいますか。

この本は、パターンのカタログではないため、他のデザインパターンブックとは大きく異なりますが、主にパターンに簡単にマップできる問題空間を分解する方法を示しています。

問題は、一般的なものと変化するものの2つの部分に分解できます。これが完了したら、一般的なものをインターフェイスにマッピングし、実装によって異なるものをマッピングします。本質的に、多くのパターンはこの「パターン」に分類されます。

たとえば、戦略パターンでは、一般的なものは戦略のコンテキストとして表現され、変数部分は具体的な戦略として表現されます。

この本は、私にとっては電話帳を読むのと同程度の興奮を覚える他のパターンブックとは対照的に、非常に刺激的だと思いました。

5
Phillip Ngan
5
Rohit

書籍の場合、 デザインパターンの説明 、および ヘッドファーストデザインパターン をお勧めします。これらのパターンを実際に学習するには、既存のコードを調べる必要があります。すでに使用しているパターンを探します。 code smells と、それらを解決するパターンを見てください。

5
David Nehme

私はいくつかのデザインパターンディスカッショングループ( 私たちのサイト )を率いており、5つか6つのパターンの本を読みました。 Head First Design Patternsブックから始めて、ディスカッショングループに参加するか、ディスカッショングループを開始することをお勧めします。 Head Firstの本は最初は少しハスボロに見えるかもしれませんが、ほとんどの人は1〜2章を読んで気に入っています。

優れたリソースを使用します- Joshua KereiviskyのA Design Guide to Design Patterns パターンの順序付けとディスカッショングループの支援。経験から、私が注文に提案する1つの変更は、戦略を優先することです。今日の開発者のほとんどは、ファクトリの良いまたは悪い転生を経験しているため、ファクトリから始めると、パターンに関する多くの会話と混乱につながる可能性があります。最初の会議。

4
JB Brown

HeadFirst DesignPatternをお勧めします。本を読むだけでは十分ではありません。多くの質問に対する答えを見つけるために必要な概念を理解した後、これらのパターンで使用できる実際のアプリケーションを見つけようとします。私も同じことをしていて、質問がばかげているように見えても質問を始めました。

3
Rajkumar Vasan

設計パターンを読み取り、コーディングを実践するという概念は、実際にはIMOを支援するものではありません。これらの本を読むとき1.特定のデザインパターンが解決する基本的な問題を探します。創造パターンから始めるのが最善の策です。 2.過去にコードを書いたことがあると思います。設計パターンが解決策を提供することと同じ問題に直面したかどうかを分析してください。 3.コードを再設計/リファクタリングするか、おそらく最初からやり直します。

これらについて確認できるリソースについて

  1. www.dofactory.com
  2. デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素(Addison-Wesley Professional Computing Series)by Erich Gamma、Richard Helm、Ralph Johnson、およびJohn M. Vlissides
  3. Martin Fowlerによるエンタープライズアプリケーションアーキテクチャのパターン

1はクイックスタート、2は詳細な調査です。3は、エンタープライズソフトウェアの2つのフィットで学んだことを説明するか、考えさせる必要があります。

私の2セント...

2
Perpetualcoder

私の提案は、それらのいくつかを実装し、それらのいくつかの実装を分析する組み合わせです。たとえば、.Net内では、データアダプターを見るとアダプターパターンが使用され、フレームワークを少し掘り下げると他のいくつかのアダプターパターンが使用されます。

2
JB King

私は最高の本については知りませんが、純粋主義者は言うかもしれません デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素

私の個人的なお気に入りに関しては、私は Head First Design Patterns がO'Reillyから発行されているのが好きです。私にとって魅力的な会話の声で書かれています。私はそれを読んだとき、同時にソースコードをレビューして、それが読んでいたものに適用されるかどうかを確認しました。もしそうなら、私はリファクタリングしました。これが私が責任の連鎖を学んだ方法です。

練習-練習-練習。

2
Jason Slocomb

デザインパターンは単なるツールであり、ライブラリ関数のようなものです。それらが存在し、おおよその機能を持っていることがわかっている場合は、必要に応じて本から掘り出します。

デザインパターンに魔法はありません。優れたプログラマは、本が出る前にそれらの90%を自分で考え出しました。たいていの場合、さまざまなパターンの名前を単純に定義するのに最も役立つと考えているので、より簡単に説明できます。

2
Bill K

私が設計パターンを学んだのは、本当にひどいソフトウェアをたくさん書くことです。私が12歳のとき、何が良かったのか分かりません。スパゲッティコードの山を書いたところです。次の10年ほどで、私は自分の過ちから学びました。何が機能し、何が機能しなかったかを発見しました。私はほとんどの一般的なデザインパターンを独自に発明したので、デザインパターンが何であるかを最初に聞いたとき、私はそれらについて知りたいと非常に興奮していました。 (10年間でC++を自分で教えることについての冗談は、実際には冗談ではありません)

物語の教訓:たくさんのコードを書く。他の人が言ったように、練習、練習、練習。現在のデザインがなぜ悪いのかを理解し、より良い方法を模索するまで、さまざまなデザインパターンをどこに適用するのかがよくわからないと思います。デザインパターンブックは、あなたが理解できない問題へのペーストインソリューションではなく、洗練されたソリューションと他の開発者と議論するための共通の用語を提供する必要があります。

2
rmeador

初心者の場合、すべてのパターンに精通したら、ヘッドファーストデザインのパターンを使用して、リアルタイムオブジェクトをそれらのパターンに視覚化してみてください。

本は、実際の世界で実装するまで、設計パターンのマスターであることができない限り、基本的な概念を理解するのに役立ちます

1
gmhk

設計パターンを研究することも難しいと思います。 OOPおよび中規模から大規模のアプリケーション開発の経験について詳しく知る必要があります。私にとっては、開発者のグループとして議論するために勉強しています。 パターンを設計するための学習ガイド は、パターンの研究を完了したということです。 C#とJavaScriptの開発者が一緒に参加しています。 C#開発者がJavaScriptでコードを記述し、JavaScript開発者がC#コードでも同じことを行うのは私にとって素晴らしいことです。会議を出た後、自宅で数冊の本を調べて読んでレビューします。よりよく理解して覚えておくためのより良い方法は、C#とJavaScriptの両方の例を使用してブログを作成することです http://tech.wowkhmer.com/category/Design-Patterns.aspx

各デザインパターンに進む前に、まずパターンの名前を理解してください。さらに、誰かがこの概念を知っている場合は、プログラミングだけでなく、読み取りの世界でも1つの例を説明してください。

例えば:

工場メソッド:

世界を読んでください:私は5ドル、10ドル、または20ドルのお金を与えるだけで、それがどのように生産されるかを知らずにピザを生産します。

プログラミング:クライアントは、パラメーター値$ 5、$ 10、または$ 20をファクトリメソッドに渡すだけで、Pizzaオブジェクトが返されます。そのため、クライアントは処理方法を知らなくてもそのオブジェクトを使用できます。

これがあなたに役立つかどうかわかりません。会議に参加する人々の知識レベルに依存します。

1
Vorleak Chy

さらに別の設計変更のために10回コードを修正しなければならなかった後、髪を引っ張った開発者として遭遇した問題のいくつかを調べる必要があると思います。おそらく、多くのやり直しと苦痛があると感じたプロジェクトのリストがあるでしょう。

そのリストから、デザインパターンが解決しようとするシナリオを導き出すことができます。異なるデータセットに対して同じ一連のアクションを実行する必要があったときがありましたか?アプリケーションの将来の機能を可能にする必要がありますが、既存のクラスのすべてのロジックをやり直すことを避けたいですか?それらのシナリオから始めて、パターンのカタログとそれらが解決するはずのそれぞれの問題に戻ります。 GoFとプロジェクトのライブラリの間でいくつかの一致が見られる可能性があります。

1
David Robbins